xc
Array3dBoxVarRef.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 //Array3dBoxVarRef.h
22 
23 #ifndef ARRAY3DBOXVARREF_H
24 #define ARRAY3DBOXVARREF_H
25 
26 #include "Array3dBoxRefBase.h"
27 
28 
30 //
32 template <class ARRAY_3D>
34  {
35  ARRAY_3D &ttz;
36  public:
37  typedef typename ARRAY_3D::const_reference const_reference;
38  typedef typename ARRAY_3D::reference reference;
39 
40  explicit Array3dBoxVarRef(ARRAY_3D &m,const size_t &iLayer=1,const size_t &f= 1,const size_t &c= 1);
41  Array3dBoxVarRef(ARRAY_3D &m,const Array3dRange &rango);
42  Array3dBoxVarRef(ARRAY_3D &t,const size_t &iLayer,const RangoIndice &row_range,const RangoIndice &column_range);
43  Array3dBoxVarRef(ARRAY_3D &t,const RangoIndice &layer_range,const size_t &iRow,const RangoIndice &column_range);
44  Array3dBoxVarRef(ARRAY_3D &t,const RangoIndice &layer_range,const RangoIndice &row_range,const size_t &col);
45  Array3dBoxVarRef(ARRAY_3D &t,const size_t &iLayer,const size_t &iRow,const RangoIndice &column_range);
46  Array3dBoxVarRef(ARRAY_3D &t,const size_t iLayer,const RangoIndice &row_range,const size_t &col);
47  Array3dBoxVarRef(ARRAY_3D &t,const RangoIndice &layer_range,const size_t &iRow,const size_t &col);
48  inline virtual ~Array3dBoxVarRef(void) {}
49  inline virtual const_reference operator()(size_t iLayer=1,size_t iRow=1,size_t col=1) const
50  { return ttz(iLayer+offset_cp, iRow+offset_f,col+offset_c); }
51  inline virtual reference operator()(size_t iLayer=1,size_t iRow=1,size_t col=1)
52  { return ttz(iLayer+offset_cp, iRow+offset_f,col+offset_c); }
53  };
54 
55 template<class ARRAY_3D>
56 Array3dBoxVarRef<ARRAY_3D>::Array3dBoxVarRef(ARRAY_3D &t,const size_t &iLayer,const size_t &f,const size_t &c)
57  : Array3dBoxRefBase(iLayer,f,c,t.getNumberOfLayers(),t.getNumberOfRows(),t.getNumberOfColumns()),ttz(t) {}
58 
59 template<class ARRAY_3D>
61  : Array3dBoxRefBase(clip(rango,t)),ttz(t) {}
62 
63 template<class ARRAY_3D>
64 Array3dBoxVarRef<ARRAY_3D>::Array3dBoxVarRef(ARRAY_3D &t,const size_t &iLayer,const RangoIndice &row_range,const RangoIndice &column_range)
65  : Array3dBoxRefBase(iLayer,clip(row_range,t.getNumberOfRows()),clip(column_range,t.getNumberOfColumns())),ttz(t)
66  {
67  if(iLayer>ttz.getNumberOfLayers())
68  std::clog << "Aviso; layer index: " << iLayer << " out of range in array with ranges: " << Array3dRange(ttz) << std::endl;
69  }
70 
71 template<class ARRAY_3D>
72 Array3dBoxVarRef<ARRAY_3D>::Array3dBoxVarRef(ARRAY_3D &t,const RangoIndice &layer_range,const size_t &iRow,const RangoIndice &column_range)
73  : Array3dBoxRefBase(clip(layer_range,t.getNumberOfLayers()),iRow,clip(column_range,t.getNumberOfColumns())),ttz(t)
74  {
75  if(iRow>ttz.getNumberOfRows())
76  std::clog << "Aviso; row index: " << iRow
77  << " out of range in array with ranges: "
78  << Array3dRange(ttz) << std::endl;
79  }
80 
81 template<class ARRAY_3D>
82 Array3dBoxVarRef<ARRAY_3D>::Array3dBoxVarRef(ARRAY_3D &t,const RangoIndice &layer_range,const RangoIndice &row_range,const size_t &col)
83  : Array3dBoxRefBase(clip(layer_range,t.getNumberOfLayers()),clip(row_range,t.getNumberOfRows()),col),ttz(t)
84  {
85  if(col>ttz.getNumberOfColumns())
86  std::clog << "Aviso; column index: " << col
87  << " out of range in array with ranges: "
88  << Array3dRange(ttz) << std::endl;
89  }
90 
91 template<class ARRAY_3D>
92 Array3dBoxVarRef<ARRAY_3D>::Array3dBoxVarRef(ARRAY_3D &t,const size_t &iLayer,const size_t &iRow,const RangoIndice &column_range)
93  : Array3dBoxRefBase(iLayer,iRow,clip(column_range,t.getNumberOfColumns())),ttz(t)
94  {
95  if(iLayer>ttz.getNumberOfLayers())
96  std::clog << "Aviso; layer index: " << iLayer
97  << " out of range in array with ranges: "
98  << Array3dRange(ttz) << std::endl;
99  if(iRow>ttz.getNumberOfRows())
100  std::clog << "Aviso; row index: " << iRow
101  << " out of range in array with ranges: "
102  << Array3dRange(ttz) << std::endl;
103  }
104 
105 template<class ARRAY_3D>
106 Array3dBoxVarRef<ARRAY_3D>::Array3dBoxVarRef(ARRAY_3D &t,const size_t iLayer,const RangoIndice &row_range,const size_t &col)
107  : Array3dBoxRefBase(iLayer,clip(row_range,t.getNumberOfRows()),col),ttz(t)
108  {
109  if(iLayer>ttz.getNumberOfLayers())
110  std::clog << "Aviso; layer index: " << iLayer
111  << " out of range in array with ranges: "
112  << Array3dRange(ttz) << std::endl;
113  if(col>ttz.getNumberOfColumns())
114  std::clog << "Aviso; column index: " << col
115  << " out of range in array with ranges: "
116  << Array3dRange(ttz) << std::endl;
117  }
118 
119 template<class ARRAY_3D>
120 Array3dBoxVarRef<ARRAY_3D>::Array3dBoxVarRef(ARRAY_3D &t,const RangoIndice &layer_range,const size_t &iRow,const size_t &col)
121  : Array3dBoxRefBase(clip(layer_range,t.getNumberOfLayers()),iRow,col),ttz(t)
122  {
123  if(iRow>ttz.getNumberOfRows())
124  std::clog << "Aviso; row index: " << iRow
125  << " out of range in array with ranges: "
126  << Array3dRange(ttz) << std::endl;
127  if(col>ttz.getNumberOfColumns())
128  std::clog << "Aviso; column index: " << col
129  << " out of range in array with ranges: "
130  << Array3dRange(ttz) << std::endl;
131  }
132 
133 template <class ARRAY_3D>
134 inline std::ostream &operator<<(std::ostream &os,const Array3dBoxVarRef<ARRAY_3D> &c)
135  {
136  PrintArray3d(c,os);
137  return os;
138  }
139 
140 template <class ARRAY_3D, class TRF>
141 const Array3dBoxVarRef<ARRAY_3D> &transform(const Array3dBoxVarRef<ARRAY_3D> &box,const TRF &trf)
142  {
143  static Array3dBoxVarRef<ARRAY_3D> retval;
144  retval= box;
145  const size_t n_layers= box.getNumberOfLayers();
146  const size_t n_rows= box.getNumberOfRows();
147  const size_t n_columns= box.getNumberOfColumns();
148  for(size_t k=1;k<=n_layers;k++) //For each layer.
149  for(size_t i=1;i<=n_rows;i++) //For each row.
150  for(size_t j=1;j<=n_columns;j++) //For each column.
151  retval(i,j,k)= Transform(box(i,j,k));
152  return retval;
153  }
154 
155 #endif
size_t offset_cp
Offset layer.
Definition: Array3dBoxRefBase.h:40
size_t n_layers
number of layers.
Definition: Array3dBoxRefBase.h:37
size_t offset_c
Offset column.
Definition: Array3dBoxRefBase.h:42
Reference to a "sub-array".
Definition: Array3dBoxVarRef.h:33
size_t offset_f
Offset row.
Definition: Array3dBoxRefBase.h:41
Indices that define a block of an array.
Definition: Array3dBoxRefBase.h:34
size_t n_columns
number of columns.
Definition: Array3dBoxRefBase.h:39
size_t n_rows
number of rows.
Definition: Array3dBoxRefBase.h:38
Rangos de variación de tres índices, se emplea en BoxConstRef.
Definition: Array3dRange.h:32
Rango de variación de un índice, se emplea en BoxConstRef.
Definition: RangoIndice.h:30