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
00038 #ifndef MAT_VECTORHIERARCHICBASE
00039 #define MAT_VECTORHIERARCHICBASE
00040 #include "matInclude.h"
00041 namespace mat{
00048 template<class Treal, class Telement = Treal>
00049 class VectorHierarchicBase {
00050 public:
00051
00052 #if 1
00053 inline const int& nScalars() const
00054 {return rows.getNScalars();}
00055 #endif
00056 inline const int& n() const
00057 {return rows.getNBlocks();}
00058
00059 inline Telement& operator()
00060 (int ind) {
00061 assert(elements);
00062 assert(ind >= 0);
00063 assert(ind < n());
00064 return elements[ind];
00065 }
00066 inline const Telement& operator()
00067 (int ind) const {
00068 assert(elements);
00069 assert(ind >= 0);
00070 assert(ind < n());
00071 return elements[ind];
00072 }
00073 inline bool is_zero() const {return !elements;}
00074
00075 inline void resetRows(SizesAndBlocks const & newRows) {
00076 delete[] elements;
00077 elements = 0;
00078 rows = newRows;
00079 }
00080
00081 protected:
00087 inline bool is_empty() const {
00088 return rows.is_empty();
00089 }
00090
00091 VectorHierarchicBase()
00092 : elements(0) {}
00093
00094 explicit VectorHierarchicBase(SizesAndBlocks const & rowsInp)
00095 :elements(0) {}
00096 VectorHierarchicBase
00097 (const VectorHierarchicBase<Treal, Telement>& vec);
00098 VectorHierarchicBase<Treal, Telement>&
00099 operator=(const VectorHierarchicBase<Treal, Telement>& vec);
00100 virtual ~VectorHierarchicBase();
00101
00102
00103 SizesAndBlocks rows;
00104
00105
00106 Telement* elements;
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 #if 0
00117 inline void assert_alloc() {
00118 if (this->cap < this->nel) {
00119 delete[] this->elements;
00120 this->cap = this->nel;
00121 this->elements = new Telement[this->cap];
00122 for (int ind = 0; ind < this->cap; ind++)
00123 this->elements[ind] = 0;
00124 }
00125 }
00126 #endif
00127
00128
00129
00130 private:
00131
00132 };
00133
00134 template<class Treal, class Telement>
00135 VectorHierarchicBase<Treal, Telement>::
00136 VectorHierarchicBase
00137 (const VectorHierarchicBase<Treal, Telement>& vec)
00138 : rows(vec.rows) {
00139 if (!vec.is_zero()) {
00140 elements = new Telement[n()];
00141 for (int i = 0; i < n(); i++)
00142 elements[i] = vec.elements[i];
00143 }
00144 }
00145
00146
00147 template<class Treal, class Telement>
00148 VectorHierarchicBase<Treal, Telement>&
00149 VectorHierarchicBase<Treal, Telement>::
00150 operator=(const VectorHierarchicBase<Treal, Telement>& vec) {
00151 if (vec.is_zero()) {
00152 rows = vec.rows;
00153 delete[] elements;
00154 elements = 0;
00155 return *this;
00156 }
00157 if (is_zero() || (n() != vec.n())) {
00158 delete[] elements;
00159 elements = new Telement[vec.n()];
00160 }
00161 rows = vec.rows;
00162 for (int i = 0; i < n(); i++)
00163 elements[i] = vec.elements[i];
00164 return *this;
00165 }
00166
00167
00168 template<class Treal, class Telement>
00169 VectorHierarchicBase<Treal, Telement>::
00170 ~VectorHierarchicBase() {
00171 delete[] elements;
00172 }
00173
00174 }
00175 #endif