xc
Array3dRange.h
1 // -*-c++-*-
2 //----------------------------------------------------------------------------
3 // xc utils library; general purpose classes and functions.
4 //
5 // Copyright (C) Luis C. Pérez Tato
6 //
7 // XC utils is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation, either version 3 of the License, or
10 // (at your option) any later version.
11 //
12 // This software is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program.
19 // If not, see <http://www.gnu.org/licenses/>.
20 //----------------------------------------------------------------------------
21 //Array3dRange.h
22 
23 #ifndef RANGOARRAY3D_H
24 #define RANGOARRAY3D_H
25 
26 #include "utility/matrices/RangoIndice.h"
27 
28 
30 //
33  {
34  RangoIndice layer_range;
35  RangoIndice row_range;
36  RangoIndice column_range;
37  public:
38  Array3dRange(const RangoIndice &rcp= RangoIndice(),const RangoIndice &rf= RangoIndice(),const RangoIndice &rc= RangoIndice())
39  : layer_range(rcp), row_range(rf),column_range(rc) {}
40  Array3dRange(const size_t &iLayer,const RangoIndice &rf,const RangoIndice &rc)
41  : layer_range(iLayer,iLayer), row_range(rf),column_range(rc) {}
42  Array3dRange(const RangoIndice &rcp,const size_t &iRow,const RangoIndice &rc)
43  : layer_range(rcp), row_range(iRow, iRow),column_range(rc) {}
44  Array3dRange(const RangoIndice &rcp,const RangoIndice &rf,const size_t &col)
45  : layer_range(rcp), row_range(rf),column_range(col,col) {}
46  template <class TTZ>
47  explicit Array3dRange(const TTZ &);
48 
49  size_t getNumberOfLayers(void) const
50  { return row_range.Size(); }
51  size_t getNumberOfRows(void) const
52  { return row_range.Size(); }
53  size_t getNumberOfColumns(void) const
54  { return column_range.Size(); }
55  size_t Size(void) const
56  { return getNumberOfLayers()*getNumberOfRows()*getNumberOfColumns(); }
57  bool Vacio(void) const;
58  const RangoIndice &getLayerRange(void) const
59  { return layer_range; }
60  RangoIndice &getLayerRange(void)
61  { return layer_range; }
62  const RangoIndice &getRowRange(void) const
63  { return row_range; }
64  RangoIndice &getRowRange(void)
65  { return row_range; }
66  const RangoIndice &getColumnRange(void) const
67  { return column_range; }
68  RangoIndice &getColumnRange(void)
69  { return column_range; }
70 
71  size_t Dimension(void) const;
72  bool isIRow(void) const;
73  bool isJRow(void) const;
74  bool isKRow(void) const;
75  bool isConstantILayer(void) const;
76  bool isConstantJLayer(void) const;
77  bool isConstantKLayer(void) const;
78 
79  inline static const char &Separador(void)
80  { return RangoIndice::Separador(); }
81  void Clip(const size_t &cpmax,const size_t &fmax,const size_t &cmax);
82  void Intersec(const Array3dRange &);
83  Array3dRange Intersec(const Array3dRange &other) const;
84  void Print(std::ostream &os) const;
85  };
86 
87 Array3dRange clip(const Array3dRange &r,const size_t &cpmax,const size_t &fmax,const size_t &cmax);
88 Array3dRange intersec(const Array3dRange &,const Array3dRange &);
89 std::ostream &operator<<(std::ostream &os,const Array3dRange &rango);
90 
92 template <class TTZ>
93 Array3dRange::Array3dRange(const TTZ &ttz)
94  : layer_range(1,ttz.getNumberOfLayers()), row_range(1,ttz.getNumberOfRows()),column_range(1,ttz.getNumberOfColumns()) {}
95 
97 template <class TTZ>
98 Array3dRange clip(const Array3dRange &rttz,const TTZ &ttz)
99  { return rttz.Intersec(Array3dRange(ttz)); }
100 
101 #endif
size_t Dimension(void) const
Return la dimensión del rango 80,1,2 ó 3).
Definition: Array3dRange.cc:30
bool Vacio(void) const
Return verdadero si el rango no contiene ningún índice.
Definition: Array3dRange.cc:26
bool isConstantJLayer(void) const
Return verdadero si los indices que varían son los I y K.
Definition: Array3dRange.cc:65
bool isKRow(void) const
Return verdadero si el único índice que varía es el K.
Definition: Array3dRange.cc:54
bool isJRow(void) const
Return verdadero si el único índice que varía es el J.
Definition: Array3dRange.cc:47
void Print(std::ostream &os) const
Imprime el rango.
Definition: Array3dRange.cc:73
bool isConstantILayer(void) const
Return verdadero si los indices que varían son los J y K.
Definition: Array3dRange.cc:61
bool isIRow(void) const
Return verdadero si el único índice que varía es el I.
Definition: Array3dRange.cc:40
bool isConstantKLayer(void) const
Return verdadero si los indices que varían son los I y J.
Definition: Array3dRange.cc:69
Rangos de variación de tres índices, se emplea en BoxConstRef.
Definition: Array3dRange.h:32
void Clip(const size_t &cpmax, const size_t &fmax, const size_t &cmax)
Reduce los valores del rango de manera que ambos sean menores que los que se pasan como parámetro...
Definition: Array3dRange.cc:78
void Intersec(const Array3dRange &)
Assigns to this one the intersection of both ranges.
Definition: Array3dRange.cc:86
Rango de variación de un índice, se emplea en BoxConstRef.
Definition: RangoIndice.h:30