28 #include "Array3dBoxConstRef.h" 29 #include "ConstantILayerConstRef.h" 30 #include "ConstantJLayerConstRef.h" 31 #include "ConstantKLayerConstRef.h" 32 #include "IRowConstRef.h" 33 #include "JRowConstRef.h" 34 #include "KRowConstRef.h" 35 #include "Array3dBoxVarRef.h" 36 #include "ConstantILayerVarRef.h" 37 #include "ConstantJLayerVarRef.h" 38 #include "ConstantKLayerVarRef.h" 39 #include "IRowVarRef.h" 40 #include "JRowVarRef.h" 41 #include "KRowVarRef.h" 50 template <
class Array>
54 typedef typename Array::value_type value_type;
55 typedef typename Array::reference reference;
56 typedef typename Array::const_reference const_reference;
57 typedef typename std::vector<Array>::value_type matrix_type;
58 typedef typename std::vector<Array>::iterator iterator;
59 typedef typename std::vector<Array>::const_iterator const_iterator;
78 inline matrix_type &get_layer(
const size_t &iLayer)
79 {
return (*
this)[iLayer-1]; }
80 inline const matrix_type &get_layer(
const size_t &iLayer)
const 81 {
return (*
this)[iLayer-1]; }
85 Array3dBase(
const size_t &,
const size_t &,
const size_t &,
const value_type &def_value= value_type());
87 bool check_range(
const size_t &,
const size_t &,
const size_t &)
const;
88 void resize(
const size_t &);
89 void resize(
const size_t &,
const size_t &,
const size_t &,
const value_type &def_value= value_type());
90 size_t getNumberOfLayers(
void)
const;
91 size_t getNumberOfRows(
const size_t &layer= 1)
const;
92 size_t getNumberOfColumns(
const size_t &layer= 1)
const;
94 size_t GetDim(
void)
const;
102 bool Null(
void)
const;
106 void dim(
const size_t &,
const size_t &,
const size_t &,
const value_type &default_value= value_type());
108 const Array &
operator()(
const size_t &layer)
const;
110 inline void assign(
const size_t &i,
const size_t &j,
const size_t &k,
const bool &value)
111 { get_layer(i).assign(j,k,value); }
112 inline const_reference
operator()(
const size_t &i,
const size_t &j,
const size_t &k)
const 113 {
return ((*
this)(i))(j,k); }
114 inline reference
operator()(
const size_t &i,
const size_t &j,
const size_t &k)
115 {
return ((*
this)(i))(j,k); }
116 reference getAtI(
const size_t &i);
117 const_reference getAtI(
const size_t &)
const;
118 reference getAtIJ(
const size_t &,
const size_t &);
119 const_reference getAtIJ(
const size_t &,
const size_t &)
const;
120 value_type getAtIJK(
const size_t &,
const size_t &,
const size_t &);
122 box_const_ref getBoxConstRef(
size_t layer=1,
size_t f=1,
size_t c=1)
const;
123 box_const_ref getBoxConstRef(
const Array3dRange &rango)
const;
125 constant_i_layer_const_ref getConstantILayerConstRef(
size_t layer=1,
size_t f=1,
size_t c=1)
const;
126 constant_i_layer_const_ref getConstantILayerConstRef(
size_t layer,
const RangoIndice &,
const RangoIndice &)
const;
127 constant_j_layer_const_ref getConstantJLayerConstRef(
size_t f=1,
size_t layer=1,
size_t c=1)
const;
128 constant_j_layer_const_ref getConstantJLayerConstRef(
const RangoIndice &,
const size_t &f,
const RangoIndice &)
const;
129 constant_k_layer_const_ref getConstantKLayerConstRef(
size_t c=1,
size_t layer=1,
size_t f=1)
const;
130 constant_k_layer_const_ref getConstantKLayerConstRef(
const RangoIndice &,
const RangoIndice &,
const size_t &)
const;
132 const_ref_i_row getIRowConstRef(
size_t f=1,
size_t c=1)
const;
133 const_ref_i_row getIRowConstRef(
const RangoIndice &,
const size_t &f,
const size_t &c)
const;
134 const_ref_j_row getJRowConstRef(
size_t layer=1,
size_t c=1)
const;
135 const_ref_j_row getJRowConstRef(
const size_t &layer,
const RangoIndice &,
const size_t &c)
const;
136 const_ref_k_row getKRowConstRef(
size_t layer=1,
size_t f=1)
const;
137 const_ref_k_row getKRowConstRef(
const size_t &layer,
const size_t &f,
const RangoIndice &)
const;
139 box_var_ref getBoxVarRef(
size_t layer=1,
size_t f=1,
size_t c=1);
142 constant_i_layer_variable_ref getConstantILayerVarRef(
size_t layer=1,
size_t f=1,
size_t c=1);
143 constant_i_layer_variable_ref getConstantILayerVarRef(
const size_t &layer,
const RangoIndice &,
const RangoIndice &);
144 constant_j_layer_variable_ref getConstantJLayerVarRef(
size_t f=1,
size_t layer=1,
size_t c=1);
145 constant_j_layer_variable_ref getConstantJLayerVarRef(
const RangoIndice &,
const size_t &f,
const RangoIndice &);
146 constant_k_layer_variable_ref getConstantKLayerVarRef(
size_t c=1,
size_t layer=1,
size_t f=1);
147 constant_k_layer_variable_ref getConstantKLayerVarRef(
const RangoIndice &,
const RangoIndice &,
const size_t &c);
149 var_ref_i_row getVarRefIRow(
size_t f=1,
size_t c=1);
150 var_ref_i_row getVarRefIRow(
const RangoIndice &,
const size_t &f,
const size_t &c);
151 var_ref_j_row getVarRefJRow(
size_t layer=1,
size_t c=1);
152 var_ref_j_row getVarRefJRow(
const size_t &layer,
const RangoIndice &,
const size_t &c);
153 var_ref_k_row getVarRefKRow(
size_t layer=1,
size_t f=1);
154 var_ref_k_row getVarRefKRow(
const size_t &layer,
const size_t &f,
const RangoIndice &);
161 template <
class Array>
163 :
std::vector<Array>(n_layers)
167 template <
class Array>
169 :
std::vector<Array>(n_layers,m)
173 template <
class Array>
175 :
std::vector<Array>(n_layers)
177 for(
size_t i=0;i<n_layers;i++)
178 (*
this)[i]= Array(n_rows,cols,def_value);
183 void Array3dBase<T>::dim(
const size_t &nLayers,
const size_t &nRows,
const size_t &numberOfColumns,
const value_type &def_value)
184 { this->
resize(nLayers,nRows,numberOfColumns,def_value); }
187 template <
class Array>
190 std::vector<Array>::resize(n_layers);
194 template <
class Array>
197 std::vector<Array>::resize(n_layers);
198 for(
size_t i= 0;i<n_layers;i++)
199 (*
this)[i].resize(n_rows,cols,v);
202 template <
class Array>
205 if(layer<=getNumberOfLayers())
212 template <
class Array>
214 {
return this->size(); }
216 template <
class Array>
221 retval= get_layer(layer).getNumberOfRows();
224 template <
class Array>
229 retval= get_layer(layer).getNumberOfColumns();
234 template <
class Array>
237 const size_t sz= this->size();
242 const matrix_type &layer= (*this)(1);
243 return sz*layer.getNumberOfRows()*layer.getNumberOfColumns();
247 template <
class Array>
251 if(this->size()>1) retval++;
252 if(this->getNumberOfRows()>1) retval++;
253 if(this->getNumberOfColumns()>1) retval++;
258 template <
class Array>
261 const size_t sz= this->size();
266 const Array &layer= (*this)(1);
267 return sz*layer.getNumberOfRows()*layer.getNumberOfColumns();
272 template <
class Array>
278 return (*
this)[0].Null();
282 template <
class Array>
290 const size_t numberOfLayers= this->getNumberOfLayers();
291 for(
size_t i=0;i<numberOfLayers;i++)
292 if((*
this)[i].
Null())
302 template <
class Array>
305 std::vector<Array>::clear();
310 template <
class Array>
313 if((this->getNumberOfRows()>1) || (this->getNumberOfColumns()>1))
return false;
318 template <
class Array>
321 if((this->getNumberOfLayers()>1) || (this->getNumberOfColumns()>1))
return false;
326 template <
class Array>
329 if((this->getNumberOfLayers()>1) || (this->getNumberOfRows()>1))
return false;
334 template <
class Array>
336 {
return (this->getNumberOfLayers()==1); }
339 template <
class Array>
341 {
return (this->getNumberOfRows()==1); }
344 template <
class Array>
346 {
return (this->getNumberOfColumns()==1); }
349 template <
class Array>
351 {
return get_layer(i); }
354 template <
class Array>
356 {
return get_layer(i); }
359 template <
class Array>
361 {
return const_cast<reference
>(
static_cast<const Array3dBase<Array> &
>(*this).getAtI(i)); }
363 template <
class Array>
374 std::cerr <<
"Array3dBase::getAtI; the set is not one-dimensional." << std::endl;
379 template <
class Array>
382 typename Array3dBase<Array>::value_type retval= value_type();
383 if(this->check_range(i,j,k))
384 retval= (*this)(i,j,k);
388 template <
class Array>
390 {
return const_cast<reference
>(
static_cast<const Array3dBase<Array> &
>(*this).getAtIJ(i)); }
392 template <
class Array>
405 std::cerr <<
"Array3dBase::" << __FUNCTION__
406 <<
"; not bidimensional." << std::endl;
411 template <
class Array>
414 template <
class Array>
418 template <
class Array>
421 template <
class Array>
424 template <
class Array>
427 template <
class Array>
430 template <
class Array>
433 template <
class Array>
437 template <
class Array>
440 template <
class Array>
443 template <
class Array>
446 template <
class Array>
449 template <
class Array>
452 template <
class Array>
456 template <
class Array>
459 template <
class Array>
463 template <
class Array>
466 template <
class Array>
469 template <
class Array>
472 template <
class Array>
475 template <
class Array>
478 template <
class Array>
482 template <
class Array>
485 template <
class Array>
488 template <
class Array>
491 template <
class Array>
494 template <
class Array>
497 template <
class Array>
502 template <
class Array>
505 const size_t numberOfLayers= other.getNumberOfLayers();
506 const size_t numberOfRows= other.getNumberOfRows();
507 const size_t numberOfColumns= other.getNumberOfColumns();
508 if((numberOfLayers+layer_offset)>getNumberOfLayers())
510 std::cerr <<
"Array3dBase::" << __FUNCTION__
511 <<
"; layer index out of range." << std::endl;
514 if((numberOfRows+row_offset)>this->getNumberOfRows())
516 std::cerr <<
"Array3dBase::" << __FUNCTION__
517 <<
"; row index out of range." << std::endl;
520 if((numberOfColumns+offset_col)>this->getNumberOfColumns())
522 std::cerr <<
"Array3dBase::" << __FUNCTION__
523 <<
"; column index out of range." << std::endl;
526 for(
size_t i=1;i<=numberOfLayers;i++)
527 for(
size_t j=1;j<=numberOfRows;j++)
528 for(
size_t k=1;k<=numberOfColumns;k++)
529 (*
this)(layer_offset+i,row_offset+j,offset_col+k)= other(i,j,k);
533 template <
class Array>
534 inline std::ostream &operator<<(std::ostream &os,const Array3dBase<Array> &t)
536 const size_t n_layers= t.getNumberOfLayers();
537 for(
size_t i=1;i<=n_layers;i++)
void dim(const size_t &, const size_t &, const size_t &, const value_type &default_value=value_type())
Matrix dimensions.
Definition: Array3dBase.h:183
Array3dBase(const size_t &n_layers=0)
Default constructor.
Definition: Array3dBase.h:162
void clear(void)
Clears container.
Definition: Array3dBase.h:303
bool isKRow(void) const
Returns true if only index K varies.
Definition: Array3dBase.h:327
Reference to a row of the array which points have constant K indexes.
Definition: KRowVarRef.h:32
Reference to a layer of the array which points have constant J index.
Definition: ConstantJLayerVarRef.h:34
bool Null(void) const
Returns true if it's empty or the pointers are null.
Definition: Array3dBase.h:273
size_t NumPtrs(void) const
Return the number of elements of the array.
Definition: Array3dBase.h:259
Reference to a layer row from the array which points have constant J and K indices.
Definition: IRowConstRef.h:32
bool isKConstantLayer(void) const
Returns true if the indexes that vary are los I y J.
Definition: Array3dBase.h:345
Reference to a layer of the array which points have constant J index.
Definition: ConstantJLayerConstRef.h:34
Reference to a "sub-array".
Definition: Array3dBoxVarRef.h:33
Reference to a layer of the array which points have constant K index.
Definition: ConstantKLayerVarRef.h:32
void putBox(size_t layer_offset, size_t row_offset, size_t offset_col, const Array3dBase< Array > &)
Put in the array the array argument.
Definition: Array3dBase.h:503
size_t getNumberOfComponents(void) const
Return the number of components in the container.
Definition: Array3dBase.h:235
const Array & operator()(const size_t &layer) const
Return the i-th layer.
Definition: Array3dBase.h:350
Reference to a layer of the array which points have constant I index.
Definition: ConstantILayerVarRef.h:33
Referencia a una "sub array 3D".
Definition: Array3dBoxConstRef.h:34
bool HasNull(void) const
Returns true if it's empty or some of the pointers are null.
Definition: Array3dBase.h:283
Reference to a layer of the array which points have constant I index.
Definition: ConstantILayerConstRef.h:34
bool isJRow(void) const
Returns true if only index J varies.
Definition: Array3dBase.h:319
Reference to a row of the array which points have constant J and K indices.
Definition: JRowVarRef.h:32
Reference to a layer of the array which points have constant K index.
Definition: ConstantKLayerConstRef.h:35
Rangos de variación de tres índices, se emplea en BoxConstRef.
Definition: Array3dRange.h:32
bool isJConstantLayer(void) const
Returns true if the indexes that vary are los I y K.
Definition: Array3dBase.h:340
Reference to a row of the array which points have constant J and K indices.
Definition: IRowVarRef.h:32
bool isIRow(void) const
Returns true if only index I varies.
Definition: Array3dBase.h:311
Reference to a layer of the array which points have constant J and K indexes.
Definition: JRowConstRef.h:32
Reference to a layer row of the array which points have constant J and K indices. ...
Definition: KRowConstRef.h:32
arrays3d
Definition: Array3dBase.h:51
void resize(const size_t &)
Resize the array.
Definition: Array3dBase.h:188
Rango de variación de un índice, se emplea en BoxConstRef.
Definition: RangoIndice.h:30
bool isIConstantLayer(void) const
Returns true if the indexes that vary are los J y K.
Definition: Array3dBase.h:335