Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
region1d.h
1 /*
2 This file is distributed as part of the BIAS library (Basic ImageAlgorithmS)
3 but it has not been developed by the authors of BIAS.
4 
5 For copyright, author and license information see below.
6 */
7 
8 
9 /*
10 *
11 * Template Numerical Toolkit (TNT): Linear Algebra Module
12 *
13 * Mathematical and Computational Sciences Division
14 * National Institute of Technology,
15 * Gaithersburg, MD USA
16 *
17 *
18 * This software was developed at the National Institute of Standards and
19 * Technology (NIST) by employees of the Federal Government in the course
20 * of their official duties. Pursuant to title 17 Section 105 of the
21 * United States Code, this software is not subject to copyright protection
22 * and is in the public domain. The Template Numerical Toolkit (TNT) is
23 * an experimental system. NIST assumes no responsibility whatsoever for
24 * its use by other parties, and makes no guarantees, expressed or implied,
25 * about its quality, reliability, or any other characteristic.
26 *
27 * BETA VERSION INCOMPLETE AND SUBJECT TO CHANGE
28 * see http://math.nist.gov/tnt for latest updates.
29 *
30 */
31 
32 
33 
34 
35 #ifndef REGION1D_H
36 #define REGION1D_H
37 
38 
39 #include "subscript.h"
40 #include "index.h"
41 #include <iostream>
42 #include <cassert>
43 
44 namespace TNT
45 {
46 
47  template <class Array1D>
49 
50  template <class Array1D>
51  class Region1D
52  {
53  protected:
54 
55  Array1D & A_;
56  Subscript offset_; // 0-based
58 
59  typedef typename Array1D::element_type T;
60 
61  public:
62  const Array1D & array() const { return A_; }
63 
64  Subscript offset() const { return offset_;}
65  Subscript dim() const { return dim_; }
66 
68  {
69 #ifdef TNT_BOUNDS_CHECK
70  BIASASSERT(i==TNT_BASE_OFFSET);
71 #endif
72  return offset_;
73  }
74 
76  {
77 #ifdef TNT_BOUNDS_CHECK
78  BIASASSERT(i== TNT_BASE_OFFSET);
79 #endif
80  return offset_;
81  }
82 
83 
84  Region1D(Array1D &A, Subscript i1, Subscript i2) : A_(A)
85  {
86 #ifdef TNT_BOUNDS_CHECK
87  BIASASSERT(TNT_BASE_OFFSET <= i1 );
88  BIASASSERT(i2 <= A.dim() + (TNT_BASE_OFFSET-1));
89  BIASASSERT(i1 <= i2);
90 #endif
91  offset_ = i1 - TNT_BASE_OFFSET;
92  dim_ = i2-i1 + 1;
93  }
94 
95  Region1D(Array1D &A, const Index1D &I) : A_(A)
96  {
97 #ifdef TNT_BOUNDS_CHECK
98  BIASASSERT(TNT_BASE_OFFSET <=I.lbound());
99  BIASASSERT(I.ubound() <= A.dim() + (TNT_BASE_OFFSET-1));
100  BIASASSERT(I.lbound() <= I.ubound());
101 #endif
102  offset_ = I.lbound() - TNT_BASE_OFFSET;
103  dim_ = I.ubound() - I.lbound() + 1;
104  }
105 
107  A_(A.A_)
108  {
109 #ifdef TNT_BOUNDS_CHECK
110  BIASASSERT(TNT_BASE_OFFSET <= i1 );
111  BIASASSERT(i2 <= A.dim() + (TNT_BASE_OFFSET - 1));
112  BIASASSERT(i1 <= i2);
113 #endif
114  // (old-offset) (new-offset)
115  //
116  offset_ = (i1 - TNT_BASE_OFFSET) + A.offset_;
117  dim_ = i2-i1 + 1;
118  }
119 
121  {
122 #ifdef TNT_BOUNDS_CHECK
123  BIASASSERT(TNT_BASE_OFFSET <= i1);
124  BIASASSERT(i2 <= dim() + (TNT_BASE_OFFSET -1));
125  BIASASSERT(i1 <= i2);
126 #endif
127  // offset_ is 0-based, so no need for
128  // ( - TNT_BASE_OFFSET)
129  //
130  return Region1D<Array1D>(A_, i1+offset_,
131  offset_ + i2);
132  }
133 
134 
136  {
137 #ifdef TNT_BOUNDS_CHECK
138  BIASASSERT(TNT_BASE_OFFSET<=I.lbound());
139  BIASASSERT(I.ubound() <= dim() + (TNT_BASE_OFFSET-1));
140  BIASASSERT(I.lbound() <= I.ubound());
141 #endif
142  return Region1D<Array1D>(A_, I.lbound()+offset_,
143  offset_ + I.ubound());
144  }
145 
146 
147 
148 
150  {
151 #ifdef TNT_BOUNDS_CHECK
152  BIASASSERT(TNT_BASE_OFFSET <= i);
153  BIASASSERT(i <= dim() + (TNT_BASE_OFFSET-1));
154 #endif
155  return A_(i+offset_);
156  }
157 
158  const T & operator() (Subscript i) const
159  {
160 #ifdef TNT_BOUNDS_CHECK
161  BIASASSERT(TNT_BASE_OFFSET <= i);
162  BIASASSERT(i <= dim() + (TNT_BASE_OFFSET-1));
163 #endif
164  return A_(i+offset_);
165  }
166 
167 
169  {
170  // make sure both sides conform
171  BIASASSERT(dim() == R.dim());
172 
173  Subscript N = dim();
174  Subscript i;
175  Subscript istart = TNT_BASE_OFFSET;
176  Subscript iend = istart + N-1;
177 
178  for (i=istart; i<=iend; i++)
179  (*this)(i) = R(i);
180 
181  return *this;
182  }
183 
184 
185 
187  {
188  // make sure both sides conform
189  BIASASSERT(dim() == R.dim());
190 
191  Subscript N = dim();
192  Subscript i;
193  Subscript istart = TNT_BASE_OFFSET;
194  Subscript iend = istart + N-1;
195 
196  for (i=istart; i<=iend; i++)
197  (*this)(i) = R(i);
198 
199  return *this;
200 
201  }
202 
203 
205  {
206  Subscript N=dim();
207  Subscript i;
208  Subscript istart = TNT_BASE_OFFSET;
209  Subscript iend = istart + N-1;
210 
211  for (i=istart; i<= iend; i++)
212  (*this)(i) = t;
213 
214  return *this;
215 
216  }
217 
218 
219  Region1D<Array1D> & operator=(const Array1D &R)
220  {
221  // make sure both sides conform
222  Subscript N = dim();
223  BIASASSERT(dim() == R.dim());
224 
225  Subscript i;
226  Subscript istart = TNT_BASE_OFFSET;
227  Subscript iend = istart + N-1;
228 
229  for (i=istart; i<=iend; i++)
230  (*this)(i) = R(i);
231 
232  return *this;
233 
234  }
235 
236  };
237 
238  template <class Array1D>
239  std::ostream& operator<<(std::ostream &s, Region1D<Array1D> &A)
240  {
241  Subscript N=A.dim();
242  Subscript istart = TNT_BASE_OFFSET;
243  Subscript iend = N - 1 + TNT_BASE_OFFSET;
244 
245  for (Subscript i=istart; i<=iend; i++)
246  s << A(i) << endl;
247 
248  return s;
249  }
250 
251 
252  /* --------- class const_Region1D ------------ */
253 
254  template <class Array1D>
255  class const_Region1D
256  {
257  protected:
258 
259  const Array1D & A_;
260  Subscript offset_; // 0-based
262  typedef typename Array1D::element_type T;
263 
264  public:
265  const Array1D & array() const { return A_; }
266 
267  Subscript offset() const { return offset_;}
268  Subscript dim() const { return dim_; }
269 
271  {
272 #ifdef TNT_BOUNDS_CHECK
273  BIASASSERT(i==TNT_BASE_OFFSET);
274 #endif
275  return offset_;
276  }
277 
279  {
280 #ifdef TNT_BOUNDS_CHECK
281  BIASASSERT(i== TNT_BASE_OFFSET);
282 #endif
283  return offset_;
284  }
285 
286 
287  const_Region1D(const Array1D &A, Subscript i1, Subscript i2) : A_(A)
288  {
289 #ifdef TNT_BOUNDS_CHECK
290  BIASASSERT(TNT_BASE_OFFSET <= i1 );
291  BIASASSERT(i2 <= A.dim() + (TNT_BASE_OFFSET-1));
292  BIASASSERT(i1 <= i2);
293 #endif
294  offset_ = i1 - TNT_BASE_OFFSET;
295  dim_ = i2-i1 + 1;
296  }
297 
298  const_Region1D(const Array1D &A, const Index1D &I) : A_(A)
299  {
300 #ifdef TNT_BOUNDS_CHECK
301  BIASASSERT(TNT_BASE_OFFSET <=I.lbound());
302  BIASASSERT(I.ubound() <= A.dim() + (TNT_BASE_OFFSET-1));
303  BIASASSERT(I.lbound() <= I.ubound());
304 #endif
305  offset_ = I.lbound() - TNT_BASE_OFFSET;
306  dim_ = I.ubound() - I.lbound() + 1;
307  }
308 
310  A_(A.A_)
311  {
312 #ifdef TNT_BOUNDS_CHECK
313  BIASASSERT(TNT_BASE_OFFSET <= i1 );
314  BIASASSERT(i2 <= A.dim() + (TNT_BASE_OFFSET - 1));
315  BIASASSERT(i1 <= i2);
316 #endif
317  // (old-offset) (new-offset)
318  //
319  offset_ = (i1 - TNT_BASE_OFFSET) + A.offset_;
320  dim_ = i2-i1 + 1;
321  }
322 
324  {
325 #ifdef TNT_BOUNDS_CHECK
326  BIASASSERT(TNT_BASE_OFFSET <= i1);
327  BIASASSERT(i2 <= dim() + (TNT_BASE_OFFSET -1));
328  BIASASSERT(i1 <= i2);
329 #endif
330  // offset_ is 0-based, so no need for
331  // ( - TNT_BASE_OFFSET)
332  //
334  offset_ + i2);
335  }
336 
337 
339  {
340 #ifdef TNT_BOUNDS_CHECK
341  BIASASSERT(TNT_BASE_OFFSET<=I.lbound());
342  BIASASSERT(I.ubound() <= dim() + (TNT_BASE_OFFSET-1));
343  BIASASSERT(I.lbound() <= I.ubound());
344 #endif
346  offset_ + I.ubound());
347  }
348 
349 
350  const T & operator() (Subscript i) const
351  {
352 #ifdef TNT_BOUNDS_CHECK
353  BIASASSERT(TNT_BASE_OFFSET <= i);
354  BIASASSERT(i <= dim() + (TNT_BASE_OFFSET-1));
355 #endif
356  return A_(i+offset_);
357  }
358 
359 
360 
361 
362  };
363 
364  template <class Array1D>
365  std::ostream& operator<<(std::ostream &s, const_Region1D<Array1D> &A)
366  {
367  Subscript N=A.dim();
368 
369  for (Subscript i=1; i<=N; i++)
370  s << A(i) << endl;
371 
372  return s;
373  }
374 
375 
376 } // namespace TNT
377 
378 #endif
379 // const_Region1D_H
Subscript dim() const
Definition: region1d.h:65
Region1D< Array1D > operator()(Subscript i1, Subscript i2)
Definition: region1d.h:120
const_Region1D< Array1D > operator()(Subscript i1, Subscript i2)
Definition: region1d.h:323
Subscript lbound() const
Definition: index.h:51
const_Region1D(const Array1D &A, const Index1D &I)
Definition: region1d.h:298
Subscript offset_
Definition: region1d.h:56
Array1D & A_
Definition: region1d.h:55
Subscript offset() const
Definition: region1d.h:267
Subscript dim(Subscript i) const
Definition: region1d.h:75
Subscript ubound() const
Definition: index.h:52
Region1D< Array1D > & operator=(const Region1D< Array1D > &R)
Definition: region1d.h:168
Subscript dim() const
Definition: region1d.h:268
TNT_SUBSCRIPT_TYPE Subscript
Definition: subscript.h:55
T & operator()(Subscript i)
Definition: region1d.h:149
Region1D(Region1D< Array1D > &A, Subscript i1, Subscript i2)
Definition: region1d.h:106
Subscript dim(Subscript i) const
Definition: region1d.h:278
Subscript dim_
Definition: region1d.h:261
const_Region1D< Array1D > operator()(const Index1D &I)
Definition: region1d.h:338
Subscript offset(Subscript i) const
Definition: region1d.h:270
Region1D(Array1D &A, const Index1D &I)
Definition: region1d.h:95
const Array1D & A_
Definition: region1d.h:259
Subscript offset() const
Definition: region1d.h:64
Subscript dim_
Definition: region1d.h:57
const_Region1D(const Array1D &A, Subscript i1, Subscript i2)
Definition: region1d.h:287
Subscript offset_
Definition: region1d.h:260
const Array1D & array() const
Definition: region1d.h:62
Subscript offset(Subscript i) const
Definition: region1d.h:67
const Array1D & array() const
Definition: region1d.h:265
Array1D::element_type T
Definition: region1d.h:59
const_Region1D(const_Region1D< Array1D > &A, Subscript i1, Subscript i2)
Definition: region1d.h:309
Array1D::element_type T
Definition: region1d.h:262
Region1D< Array1D > operator()(const Index1D &I)
Definition: region1d.h:135
Region1D(Array1D &A, Subscript i1, Subscript i2)
Definition: region1d.h:84
Region1D< Array1D > & operator=(const Array1D &R)
Definition: region1d.h:219
Region1D< Array1D > & operator=(const T &t)
Definition: region1d.h:204
Region1D< Array1D > & operator=(const const_Region1D< Array1D > &R)
Definition: region1d.h:186