Imagine++
Coords.h
1 // ===========================================================================
2 // Imagine++ Libraries
3 // Copyright (C) Imagine
4 // For detailed information: http://imagine.enpc.fr/software
5 // ===========================================================================
6 
7 namespace Imagine {
10 
11 
16  template <int dim> class Coords : public FVector<int,dim> {
17  private:
18  typedef FVector<int,dim> Base;
19  public:
25  Coords() : Base() {}
32  Coords(const Base& v) : Base(v) {}
40  Coords(const int v[dim]): Base(v) {}
47  Coords(int v) : Base(v) {}
55  Coords(int x,int y) : Base(x,y) {}
64  Coords(int x,int y,int z) : Base(x,y,z) {}
71  size_t prod() const {
72  size_t p=1;
73  for (int i=0;i<dim;i++)
74  p*=(*this)[i];
75  return p;
76  }
77  };
78 
83  template <int dim> class CoordsIterator {
85  Coords<dim> _a;
87  Coords<dim> _b;
89  Coords<dim> _pos;
91  bool _stop;
92  public:
93  typedef std::input_iterator_tag iterator_category;
95  typedef int difference_type;
96  typedef Coords<dim>* pointer;
98 
105  CoordsIterator() : _stop(true) {}
112  CoordsIterator(const Coords<dim>& a, const Coords<dim>& b) : _a(a), _b(b), _pos(a), _stop(false) {}
121  _a = it._a;
122  _b = it._b;
123  _pos = it._pos;
124  _stop = it._stop;
125  return *this;
126  }
136  bool operator == (const CoordsIterator& it) const {
137  return (_stop ? it._stop : !it._stop && _pos == it._pos);
138  }
146  bool operator != (const CoordsIterator& it) const {
147  return (_stop ? !it._stop : it._stop || _pos != it._pos);
148  }
157  for (int i=0;i<dim;i++) {
158  if (_pos[i]!=_b[i]) {
159  _pos[i]++;
160  return *this;
161  }
162  _pos[i]=_a[i];
163  }
164  _stop = true;
165  return *this;
166  }
175  CoordsIterator tmp(*this);
176  ++(*this);
177  return tmp;
178  }
187  return _pos;
188  }
196  const Coords<dim>* operator -> () const {
197  return &_pos;
198  }
199  };
200 
201 
203 }
Coords< dim > & reference
Standard for iterator.
Definition: Coords.h:97
CoordsIterator(const Coords< dim > &a, const Coords< dim > &b)
Constructor.
Definition: Coords.h:112
Coordinates.
Definition: Coords.h:16
Coords< dim > * pointer
Standard for iterator.
Definition: Coords.h:96
Vector of fixed size.
Definition: FVector.h:17
Coords(int v)
Constructor with constant value.
Definition: Coords.h:47
CoordsIterator & operator++()
Pre-increment.
Definition: Coords.h:156
size_t prod() const
Product of coordinates.
Definition: Coords.h:71
Coords(int x, int y)
2D alias.
Definition: Coords.h:55
CoordsIterator()
Empty constructor.
Definition: Coords.h:105
bool operator==(const CoordsIterator &it) const
Equality test.
Definition: Coords.h:136
Iterator on Coordinates.
Definition: Coords.h:83
bool operator!=(const CoordsIterator &it) const
Inequality test.
Definition: Coords.h:146
Coords()
Empty constructor.
Definition: Coords.h:25
Coords< dim > value_type
Standard for iterator.
Definition: Coords.h:94
Coords(int x, int y, int z)
3D alias.
Definition: Coords.h:64
int difference_type
Standard for iterator.
Definition: Coords.h:95
Coords(const Base &v)
Copy constructor Constructs from anit Coords.
Definition: Coords.h:32
Coords(const int v[dim])
Constructor from C array.
Definition: Coords.h:40
Coords< dim > operator*() const
Dereference.
Definition: Coords.h:186
const Coords< dim > * operator->() const
Member selection.
Definition: Coords.h:196
std::input_iterator_tag iterator_category
Standard for iterator.
Definition: Coords.h:93
const int & x() const
Read alias.
Definition: FVector.h:104
Imagine++ namespace.
Definition: Array.h:7
const int & y() const
Read alias.
Definition: FVector.h:118
CoordsIterator & operator=(const CoordsIterator &it)
Assignment.
Definition: Coords.h:120
const int & z() const
Read alias.
Definition: FVector.h:132