inlib  1.2.0
Public Types | Public Member Functions | Static Public Member Functions | Protected Attributes
inlib::array< T > Class Template Reference
Inheritance diagram for inlib::array< T >:
Inheritance graph
[legend]

List of all members.

Public Types

typedef std::vector< std::pair
< unsigned int, unsigned int > > 
cut_t
typedef std::vector< unsigned int > uints_t
typedef std::vector< T >::iterator vec_it_t
typedef std::vector< T >
::const_iterator 
cons_vec_it_t

Public Member Functions

 array ()
 array (const uints_t &a_orders)
 array (unsigned int a_dimension, unsigned int a_order)
virtual ~array ()
 array (const array &a_from)
arrayoperator= (const array &a_from)
arrayoperator*= (const T &a_T)
bool operator== (const array &a_array) const
bool operator!= (const array &a_array) const
array operator* (const T &a_T) const
void copy (const array &a_from)
void clear ()
bool configure (const uints_t &a_orders)
unsigned int dimension () const
const uints_torders () const
unsigned int size () const
bool set_value (const uints_t &a_is, const T &a_value)
bool value (const uints_t &a_is, T &a_value) const
void reset ()
const std::vector< T > & vector () const
std::vector< T > & vector ()
bool fill (const std::vector< T > &a_values, cut_t *a_cut=0)
bool equal (const array &a_array) const
bool equal (const array &a_array, T aEpsilon) const
bool is_proportional (const array &a_array, T &a_factor) const
bool add (const array &a_array, cut_t *a_cut=0)
bool subtract (const array &a_array)
bool multiply (const array &a_array)
bool divide (const array &a_array)
bool contract (const array &a_array, T &a_value) const
void add (const T &a_T, cut_t *a_cut=0)
void multiply (const T &a_T)
bool divide (const T &a_T)
bool invert ()
bool offset (const uints_t &a_is, unsigned int &a_offset) const
bool indices (unsigned int a_offset, uints_t &a_is) const
bool accept (unsigned int a_index, const cut_t &a_cut) const

Static Public Member Functions

static T zero ()
static T one ()
static T minus_one ()
static T two ()

Protected Attributes

uints_t m_orders
uints_t m_offsets
std::vector< T > m_vector
uints_t m_is

Detailed Description

template<class T>
class inlib::array< T >

Definition at line 18 of file array.


Member Typedef Documentation

template<class T>
typedef std::vector<T>::const_iterator inlib::array< T >::cons_vec_it_t

Definition at line 29 of file array.

template<class T>
typedef std::vector< std::pair<unsigned int,unsigned int> > inlib::array< T >::cut_t

Definition at line 26 of file array.

template<class T>
typedef std::vector<unsigned int> inlib::array< T >::uints_t

Definition at line 27 of file array.

template<class T>
typedef std::vector<T>::iterator inlib::array< T >::vec_it_t

Definition at line 28 of file array.


Constructor & Destructor Documentation

template<class T>
inlib::array< T >::array ( ) [inline]

Definition at line 31 of file array.

          {
#ifdef INLIB_MEM
    mem::increment(s_class().c_str());
#endif
  }
template<class T>
inlib::array< T >::array ( const uints_t a_orders) [inline]

Definition at line 36 of file array.

                                 {
#ifdef INLIB_MEM
    mem::increment(s_class().c_str());
#endif
    configure(a_orders);
  }
template<class T>
inlib::array< T >::array ( unsigned int  a_dimension,
unsigned int  a_order 
) [inline]

Definition at line 42 of file array.

                                                       { 
#ifdef INLIB_MEM
    mem::increment(s_class().c_str());
#endif
    // A hypercube of dimension "a_dimension" and size "a_order".
    uints_t orders(a_dimension);
    for(unsigned int index=0;index<a_dimension;index++) 
      orders[index] = a_order;
    configure(orders);
  } 
template<class T>
virtual inlib::array< T >::~array ( ) [inline, virtual]

Definition at line 52 of file array.

                   {
#ifdef INLIB_MEM
    mem::decrement(s_class().c_str());
#endif
  }
template<class T>
inlib::array< T >::array ( const array< T > &  a_from) [inline]

Definition at line 58 of file array.

  :m_orders(a_from.m_orders)
  ,m_offsets(a_from.m_offsets)
  ,m_vector(a_from.m_vector)
  ,m_is(a_from.m_is){
#ifdef INLIB_MEM
    mem::increment(s_class().c_str());
#endif
  }

Member Function Documentation

template<class T>
bool inlib::array< T >::accept ( unsigned int  a_index,
const cut_t a_cut 
) const [inline]

Definition at line 320 of file array.

                                                             {
    unsigned int dim = m_orders.size();
    if(a_cut.size()!=dim) return false;
    if(!indices(a_index,const_cast<uints_t&>(m_is))) return false;
    bool good = true;
    for(unsigned iaxis=0;iaxis<dim;iaxis++) { 
      if(m_is[iaxis]<a_cut[iaxis].first) {good = false;break;}
      if(m_is[iaxis]>a_cut[iaxis].second) {good = false;break;}
    }
    return good;
  }
template<class T>
bool inlib::array< T >::add ( const array< T > &  a_array,
cut_t a_cut = 0 
) [inline]

Definition at line 215 of file array.

                                                  {
    if(m_orders!=a_array.m_orders) return false;
    vec_it_t it = m_vector.begin();
    cons_vec_it_t ait = a_array.m_vector.begin();
    unsigned int index = 0;
    for(;it!=m_vector.end();++it,++ait,index++) {
      if(!a_cut || (a_cut && accept(index,*a_cut)) ) {
        (*it) += (*ait);
      }
    }
    return true;
  }
template<class T>
void inlib::array< T >::add ( const T &  a_T,
cut_t a_cut = 0 
) [inline]

Definition at line 265 of file array.

                                          {
    unsigned int index = 0;
    for(vec_it_t it = m_vector.begin();it!=m_vector.end();++it,index++) {
      if(!a_cut || (a_cut && accept(index,*a_cut)) ) {
        (*it) += a_T;
      }
    }
  }
template<class T>
void inlib::array< T >::clear ( ) [inline]

Definition at line 104 of file array.

               {
    m_orders.clear();
    m_offsets.clear();
    m_vector.clear();
    m_is.clear();
  }
template<class T>
bool inlib::array< T >::configure ( const uints_t a_orders) [inline]

Definition at line 110 of file array.

                                          {
    m_orders = a_orders;
    unsigned int dim = m_orders.size();
    if(dim==0) {
      clear();
      return false;
    }
    unsigned int size = 1;
    for(unsigned int index=0;index<dim;index++) {
      //if(m_orders[index]<0) {
      //clear();
      //return false;
      //}
      size *= m_orders[index];
    }
    m_vector.resize(size,zero());
    m_offsets.resize(dim,0);
    m_offsets[0] = 1;
    for(unsigned int iaxis=1;iaxis<dim;iaxis++) 
      m_offsets[iaxis] = m_offsets[iaxis-1] * m_orders[iaxis-1];
    m_is.resize(dim,0);
    return true;
  }
template<class T>
bool inlib::array< T >::contract ( const array< T > &  a_array,
T &  a_value 
) const [inline]

Definition at line 256 of file array.

                                                       {
    a_value = zero();
    if(m_orders!=a_array.m_orders) return false;
    cons_vec_it_t it = m_vector.begin();
    cons_vec_it_t ait = a_array.m_vector.begin();
    for(;it!=m_vector.end();++it,++ait) a_value += (*it) * (*ait);
    return true;
  }
template<class T>
void inlib::array< T >::copy ( const array< T > &  a_from) [inline]

Definition at line 98 of file array.

                                 {
    m_orders = a_from.m_orders;
    m_offsets = a_from.m_offsets;
    m_vector = a_from.m_vector;
    m_is = a_from.m_is;
  }
template<class T>
unsigned int inlib::array< T >::dimension ( ) const [inline]

Definition at line 133 of file array.

{ return m_orders.size();}
template<class T>
bool inlib::array< T >::divide ( const array< T > &  a_array) [inline]

Definition at line 241 of file array.

                                    {
    if(m_orders!=a_array.m_orders) return false;
    bool status = true;
    vec_it_t it = m_vector.begin();
    cons_vec_it_t ait = a_array.m_vector.begin();
    for(;it!=m_vector.end();++it,++ait) {
      if((*ait)==zero())  {
        (*it) = zero(); //PAW convention.
        status = false;
      } else {
        (*it) /= (*ait);
      }
    }
    return status;
  }
template<class T>
bool inlib::array< T >::divide ( const T &  a_T) [inline]

Definition at line 276 of file array.

                            {
    if(a_T==zero()) return false;
    for(vec_it_t it = m_vector.begin();it!=m_vector.end();++it) (*it) /= a_T;
    return true;
  }
template<class T>
bool inlib::array< T >::equal ( const array< T > &  a_array) const [inline]

Definition at line 170 of file array.

                                         {
    if(m_orders!=a_array.m_orders) return false;
    cons_vec_it_t it = m_vector.begin();
    cons_vec_it_t ait = a_array.m_vector.begin();
    for(;it!=m_vector.end();++it,++ait) {
      if((*it)!=(*ait)) return false;
    }
    return true;
  }
template<class T>
bool inlib::array< T >::equal ( const array< T > &  a_array,
aEpsilon 
) const [inline]

Definition at line 179 of file array.

                                                    {
    if(m_orders!=a_array.m_orders) return false;
    cons_vec_it_t it = m_vector.begin();
    cons_vec_it_t ait = a_array.m_vector.begin();
    for(;it!=m_vector.end();++it,++ait) {
      T diff = (*it) - (*ait);      
      if(diff<0) diff *= -1;
      if(diff>=aEpsilon) return false;
    }
    return true;
  }
template<class T>
bool inlib::array< T >::fill ( const std::vector< T > &  a_values,
cut_t a_cut = 0 
) [inline]

Definition at line 156 of file array.

                                                           {
    unsigned int dsize = a_values.size();
    unsigned di = 0;
    unsigned int index = 0;
    for(vec_it_t it=m_vector.begin();it!=m_vector.end();++it,index++) {
      if(!a_cut || (a_cut && accept(index,*a_cut)) ) {
        if(di>=dsize) return false; //a_values exhausted too early
        *it = a_values[di];
        di++;
      }
    }
    return true;
  }
template<class T>
bool inlib::array< T >::indices ( unsigned int  a_offset,
uints_t a_is 
) const [inline]

Definition at line 310 of file array.

                                                          {
    if(a_offset>=m_vector.size()) return false;
    unsigned int dim = m_orders.size();
    unsigned int off = a_offset;
    for(int iaxis=dim-1;iaxis>=0;iaxis--) { 
      a_is[iaxis] = off/m_offsets[iaxis];
      off -= a_is[iaxis] * m_offsets[iaxis];
    }
    return true;
  }
template<class T>
bool inlib::array< T >::invert ( ) [inline]

Definition at line 281 of file array.

                {
    bool status = true;
    T v_one = one();
    for(vec_it_t it = m_vector.begin();it!=m_vector.end();++it) {
      if((*it)==zero())  {
        (*it) = zero(); //PAW convention.
        status = false;
      } else {
        T value = (*it); 
        (*it) = v_one/value;
      }
    }
    return status;
  }
template<class T>
bool inlib::array< T >::is_proportional ( const array< T > &  a_array,
T &  a_factor 
) const [inline]

Definition at line 190 of file array.

                                                               {
    // If true, then : a_array = a_factor * this.
    a_factor = zero();
    if(m_orders!=a_array.m_orders) return false;
    bool first = true;
    cons_vec_it_t it = m_vector.begin();
    cons_vec_it_t ait = a_array.m_vector.begin();
    for(;it!=m_vector.end();++it,++ait) {
             if( ((*it)==zero()) && ((*ait)==zero())) {
        continue;
      } else if( ((*it)!=zero()) && ((*ait)==zero())) {
        return false;
      } else if( ((*it)==zero()) && ((*ait)!=zero())) {
        return false;
      } else {
        if(first) {
          a_factor = (*ait)/(*it);
          first = false;
        } else {
          if((*ait)!=(*it)*a_factor) return false;
        }
      }
    }
    return true;
  }
template<class T>
static T inlib::array< T >::minus_one ( ) [inline, static]

Definition at line 340 of file array.

                       {
    //return (T)-1;    
    return T(-1);    
  }
template<class T>
bool inlib::array< T >::multiply ( const array< T > &  a_array) [inline]

Definition at line 234 of file array.

                                      {
    if(m_orders!=a_array.m_orders) return false;
    vec_it_t it = m_vector.begin();
    cons_vec_it_t ait = a_array.m_vector.begin();
    for(;it!=m_vector.end();++it,++ait) (*it) *= (*ait);
    return true;
  }
template<class T>
void inlib::array< T >::multiply ( const T &  a_T) [inline]

Definition at line 273 of file array.

                              {
    for(vec_it_t it = m_vector.begin();it!=m_vector.end();++it) (*it) *= a_T;
  }
template<class T>
bool inlib::array< T >::offset ( const uints_t a_is,
unsigned int &  a_offset 
) const [inline]

Definition at line 295 of file array.

                                                                {
    unsigned int dim = m_orders.size();
    a_offset = 0;
    if(a_is.size()!=dim) return false;
    if(dim==0) return false;
    for(unsigned int iaxis=0;iaxis<dim;iaxis++) { 
      unsigned int i = a_is[iaxis];
      if(i>=m_orders[iaxis]) {
        a_offset = 0;
        return false;
      }
      a_offset += i * m_offsets[iaxis];
    }
    return true;
  }
template<class T>
static T inlib::array< T >::one ( ) [inline, static]

Definition at line 336 of file array.

                 {
    //return (T)1;    
    return T(1);    
  }
template<class T>
bool inlib::array< T >::operator!= ( const array< T > &  a_array) const [inline]

Definition at line 79 of file array.

                                              {
    return !operator==(a_array);
  }
template<class T>
array inlib::array< T >::operator* ( const T &  a_T) const [inline]

Definition at line 82 of file array.

                                      {
    array a(*this);
    a.multiply(a_T);
    return a;
  }    
template<class T>
array& inlib::array< T >::operator*= ( const T &  a_T) [inline]

Definition at line 75 of file array.

{multiply(a_T);return *this;}    
template<class T>
array& inlib::array< T >::operator= ( const array< T > &  a_from) [inline]

Definition at line 67 of file array.

                                        {
    m_orders = a_from.m_orders;
    m_offsets = a_from.m_offsets;
    m_vector = a_from.m_vector;
    m_is = a_from.m_is;
    return *this;
  }
template<class T>
bool inlib::array< T >::operator== ( const array< T > &  a_array) const [inline]

Definition at line 76 of file array.

                                              {
    return equal(a_array);
  }
template<class T>
const uints_t& inlib::array< T >::orders ( ) const [inline]

Definition at line 134 of file array.

{ return m_orders;}
template<class T>
void inlib::array< T >::reset ( ) [inline]

Definition at line 151 of file array.

               {
    for(vec_it_t it=m_vector.begin();it!=m_vector.end();++it) *it = 0;
  }
template<class T>
bool inlib::array< T >::set_value ( const uints_t a_is,
const T &  a_value 
) [inline]

Definition at line 136 of file array.

                                                       {
    unsigned int off = 0;
    if(!offset(a_is,off)) return false;
    m_vector[off] = a_value;
    return true;
  }
template<class T>
unsigned int inlib::array< T >::size ( ) const [inline]

Definition at line 135 of file array.

{return m_vector.size();}
template<class T>
bool inlib::array< T >::subtract ( const array< T > &  a_array) [inline]

Definition at line 227 of file array.

                                      {
    if(m_orders!=a_array.m_orders) return false;
    vec_it_t it = m_vector.begin();
    cons_vec_it_t ait = a_array.m_vector.begin();
    for(;it!=m_vector.end();++it,++ait) (*it) -= (*ait);
    return true;
  }
template<class T>
static T inlib::array< T >::two ( ) [inline, static]

Definition at line 344 of file array.

                 {
    //return (T)2;    
    return T(2);    
  }
template<class T>
bool inlib::array< T >::value ( const uints_t a_is,
T &  a_value 
) const [inline]

Definition at line 142 of file array.

                                                   {
    unsigned int off = 0;
    if(!offset(a_is,off)) {
      a_value = 0;
      return false;
    }
    a_value = m_vector[off];
    return true;
  }
template<class T>
const std::vector<T>& inlib::array< T >::vector ( ) const [inline]

Definition at line 154 of file array.

{ return m_vector;}
template<class T>
std::vector<T>& inlib::array< T >::vector ( ) [inline]

Definition at line 155 of file array.

{ return m_vector;}
template<class T>
static T inlib::array< T >::zero ( ) [inline, static]

Definition at line 331 of file array.

                  {
    //return (T)0;    
    //return T(0);    
    return T();    
  }

Member Data Documentation

template<class T>
uints_t inlib::array< T >::m_is [protected]

Definition at line 352 of file array.

template<class T>
uints_t inlib::array< T >::m_offsets [protected]

Definition at line 350 of file array.

template<class T>
uints_t inlib::array< T >::m_orders [protected]

Definition at line 349 of file array.

template<class T>
std::vector<T> inlib::array< T >::m_vector [protected]

Definition at line 351 of file array.


The documentation for this class was generated from the following file:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines