00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00040 #ifndef MAT_VECTORHIERARCHICBASE
00041 #define MAT_VECTORHIERARCHICBASE
00042 #include "matInclude.h"
00043 namespace mat{
00050 template<class Treal, class Telement = Treal>
00051 class VectorHierarchicBase {
00052 public:
00053
00054 #if 1
00055 inline const int& nScalars() const
00056 {return rows.getNScalars();}
00057 #endif
00058 inline const int& n() const
00059 {return rows.getNBlocks();}
00060
00061 inline Telement& operator()
00062 (int ind) {
00063 assert(elements);
00064 assert(ind >= 0);
00065 assert(ind < n());
00066 return elements[ind];
00067 }
00068 inline const Telement& operator()
00069 (int ind) const {
00070 assert(elements);
00071 assert(ind >= 0);
00072 assert(ind < n());
00073 return elements[ind];
00074 }
00075 inline bool is_zero() const {return !elements;}
00076
00077 inline void resetRows(SizesAndBlocks const & newRows) {
00078 freeElements(elements);
00079 elements = 0;
00080 rows = newRows;
00081 }
00082
00083 protected:
00089 inline bool is_empty() const {
00090 return rows.is_empty();
00091 }
00092
00093 VectorHierarchicBase()
00094 : elements(0) {}
00095
00096 explicit VectorHierarchicBase(SizesAndBlocks const & rowsInp)
00097 :elements(0) {}
00098 VectorHierarchicBase
00099 (const VectorHierarchicBase<Treal, Telement>& vec);
00100 VectorHierarchicBase<Treal, Telement>&
00101 operator=(const VectorHierarchicBase<Treal, Telement>& vec);
00102 virtual ~VectorHierarchicBase();
00103
00104
00105 SizesAndBlocks rows;
00106
00107
00108 Telement* elements;
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 #if 0
00119 inline void assert_alloc() {
00120 if (this->cap < this->nel) {
00121 freeElements(this->elements);
00122 this->cap = this->nel;
00123 this->elements = allocateElements<Telement>(this->cap);
00124 for (int ind = 0; ind < this->cap; ind++)
00125 this->elements[ind] = 0;
00126 }
00127 }
00128 #endif
00129
00130
00131
00132 private:
00133
00134 };
00135
00136 template<class Treal, class Telement>
00137 VectorHierarchicBase<Treal, Telement>::
00138 VectorHierarchicBase
00139 (const VectorHierarchicBase<Treal, Telement>& vec)
00140 : rows(vec.rows) {
00141 if (!vec.is_zero()) {
00142 elements = allocateElements<Telement>(n());
00143 for (int i = 0; i < n(); i++)
00144 elements[i] = vec.elements[i];
00145 }
00146 }
00147
00148
00149 template<class Treal, class Telement>
00150 VectorHierarchicBase<Treal, Telement>&
00151 VectorHierarchicBase<Treal, Telement>::
00152 operator=(const VectorHierarchicBase<Treal, Telement>& vec) {
00153 if (vec.is_zero()) {
00154 rows = vec.rows;
00155 freeElements(elements);
00156 elements = 0;
00157 return *this;
00158 }
00159 if (is_zero() || (n() != vec.n())) {
00160 freeElements(elements);
00161 elements = allocateElements<Telement>(vec.n());
00162 }
00163 rows = vec.rows;
00164 for (int i = 0; i < n(); i++)
00165 elements[i] = vec.elements[i];
00166 return *this;
00167 }
00168
00169
00170 template<class Treal, class Telement>
00171 VectorHierarchicBase<Treal, Telement>::
00172 ~VectorHierarchicBase() {
00173 freeElements(elements);
00174 }
00175
00176 }
00177 #endif