aimstil  5.0.5
basic_range.h
Go to the documentation of this file.
1 #ifndef TIL_BASIC_RANGE_H
2 #define TIL_BASIC_RANGE_H
3 
4 // includes from STL
5 #include <vector>
6 
7 // includes from TIL
8 #include "til/labels.h"
9 #include "til/meta.h"
10 #include "til/miscTools.h"
11 #include "til/traits.h"
12 
13 namespace til
14 {
15 
17  template < typename TIterator >
19  : public range_label
20  {
21  public: // typedefs
22  typedef TIterator iterator;
23  typedef typename TIterator::value_type value_type;
24  typedef typename TIterator::reference reference;
25  typedef typename TIterator::pointer pointer;
26  public: // constructors
27  basic_range(TIterator begin, TIterator end) : m_i(begin), m_end(end) {}
28  public: // operators
29  // NB: there is no operator--. operator++ should be really interpreted as "next".
30  // If you want to scan backwards, use reverse iterators.
31  void operator++() { ++m_i; }
32  pointer operator->() { return m_i->operator->(); }
33  reference operator*() { return *m_i; }
34  bool ok() const { return m_i != m_end; }
35 
36  /*
37  void operator=(const basic_range<TIterator> & other)
38  {
39  m_i = other.m_i;
40  m_end = other.m_end;
41  }
42  */
43 
44  private: // data
45  TIterator m_i;
46  TIterator m_end;
47  };
48 
49 
50  namespace detail
51  {
52  template < typename TIterator, std::size_t D >
54  : public TIterator
55  {
56  public: // typedefs
57  typedef TIterator Base;
59  protected: // typedefs
60  // TODO: en fait, ca n'a aucun sens d'avoir des typedef private, autant tous les mettre en protected, non?
62  public: // constructors
63  inner_basic_volumetric_iterator(TIterator i, const Vector & size)
64  : Base(i)
65  , m_size(size)
66  {}
67  public: // set & get
68  Vector & size() { return m_size; }
69  public: // functions
70  template < typename TPosIterator >
71  void from_pos(TIterator begin, TPosIterator pbegin, TPosIterator pend)
72  {
73  *this = begin;
74  std::advance(*this, pos2offset(pbegin, pend, m_size.begin()));
75  }
76  private: // data
77  Vector m_size;
78  };
79  }
80 
81  /*
82  template < typename TIterator, std::size_t D, typename TPosIterator >
83  void advance(detail::inner_basic_volumetric_iterator<TIterator,D> & volI, TPosIterator pbegin, TPosIterator pend)
84  {
85  std::advance(volI, pos2offset(pbegin, pend, volI.size().begin()));
86  }
87  */
88 
89  template < typename TIterator, std::size_t D >
91  : public detail::inner_basic_volumetric_iterator<TIterator,D>
92  {
93  public: // typedefs
95  protected: // typedefs
96  typedef typename Base::Vector Vector;
97  public: // constructors
98  basic_volumetric_iterator(TIterator begin, const Vector & size)
99  : Base(begin, size)
100  , m_begin(begin)
101  {}
102  public: // functions
103 
104  void from_pos(const Vector & pos)
105  { this->from_pos(pos.begin(), pos.end()); }
106 
107  template < typename TPosIterator >
108  void from_pos(TPosIterator pbegin, TPosIterator pend)
109  { this->from_pos(m_begin, pbegin, pend); }
110 
111  private: // functions
112  /*
113  void initOffset(const Vector & size)
114  {
115  m_offset[0] = 1;
116  for (std::size_t i = 1; i < D; ++i)
117  {
118  m_offset[i] = m_offset[i-1] * size[i-1];
119  }
120  }
121  */
122  private: // data
123  TIterator m_begin;
124  };
125 
126 /*
127  template < typename TIterator >
128  class volumetric_range : public basic_range<TIterator>
129  {
130  public: // typedefs
131  typedef basic_range<TIterator> Base;
132  typedef typename Base::reference reference;
133  public: // operators
134  reference getValue(
135  };
136 */
137 
138  /*
139  template < typename TContainer >
140  typename range_of<TContainer>::type
141  whole_range(TContainer & c)
142  { return c.whole_range(); }
143 
144  template < typename TContainer >
145  typename const_range_of<TContainer>::type
146  whole_range(const TContainer & c)
147  { return c.whole_range(); }
148  */
149 
150 } // namespace til
151 
152 #endif
153 
numeric_array< std::size_t, D > Vector
Definition: basic_range.h:61
pointer operator->()
Definition: basic_range.h:32
TIterator::value_type value_type
Definition: basic_range.h:23
TIterator::reference reference
Definition: basic_range.h:24
inner_basic_volumetric_iterator(TIterator i, const Vector &size)
Definition: basic_range.h:63
Belongs to package Box Do not include directly, include til/Box.h instead.
Definition: Accumulator.h:10
reference operator*()
Definition: basic_range.h:33
bool ok() const
Definition: basic_range.h:34
numeric_array< T, D > size(const Box< T, D > &box)
Return the size of a box.
Definition: boxTools.h:56
Defines empty classes that serves as labels.
TIterator::pointer pointer
Definition: basic_range.h:25
basic_volumetric_iterator(TIterator begin, const Vector &size)
Definition: basic_range.h:98
std::size_t pos2offset(TPIterator pbegin, TPIterator pend, TSIterator sbegin)
Definition: miscTools.h:226
basic_range(TIterator begin, TIterator end)
Definition: basic_range.h:27
Type representing an integer.
Definition: meta.h:10
detail::inner_basic_volumetric_iterator< TIterator, D > Base
Definition: basic_range.h:94
void from_pos(TPosIterator pbegin, TPosIterator pend)
Definition: basic_range.h:108
TIterator iterator
Definition: basic_range.h:22
void from_pos(TIterator begin, TPosIterator pbegin, TPosIterator pend)
Definition: basic_range.h:71
A simple range made out of a couple of iterators.
Definition: basic_range.h:18
void from_pos(const Vector &pos)
Definition: basic_range.h:104