CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
RandomAccessEnumerator.hh
Go to the documentation of this file.
1 #ifndef CASM_RandomAccessEnumerator
2 #define CASM_RandomAccessEnumerator
3 
4 #include <string>
5 
8 
9 namespace CASM {
10 
11  template<typename ValueType, bool IsConst>
13 
14  template<typename ValueType, bool IsConst>
16 
17  template<typename ValueType, bool IsConst>
19 
20 
30  template<typename ValueType, bool IsConst = true>
31  class RandomAccessEnumIteratorBase : public InputEnumIteratorBase<ValueType, IsConst> {
32 
34 
35  public:
36 
41 
42 
44 
46  InputEnumIteratorBase<ValueType, IsConst>(enumerator, is_end) {
47 
48  if(!is_end) {
49  m_it_step = 0;
50  }
51  else {
52  m_it_step = _enum().size();
53  }
54  }
55 
56 
59 
63  step_type step() const override {
64  return m_it_step;
65  }
66 
72  bool is_end() const override {
73  this->_assert_ptr();
74  return _constructed_as_end() || step() == _enum().size();
75  }
76 
77  std::unique_ptr<RandomAccessEnumIteratorBase> clone() const {
78  return std::unique_ptr<RandomAccessEnumIteratorBase>(this->_clone());
79  }
80 
81  protected:
82 
85 
86  private:
87 
89  reference dereference() const override {
90  _enum().goto_step(m_it_step);
91  return _enum().current();
92  }
93 
95  void increment() override {
96  ++m_it_step;
97  }
98 
100  void decrement() {
101  --m_it_step;
102  }
103 
105  void advance(step_type n) {
106  m_it_step += n;
107  }
108 
110  difference_type distance_to(const RandomAccessEnumIteratorBase &B) const {
111  return B.m_it_step - m_it_step;
112  }
113 
117  }
118 
122  }
123 
127  }
128 
130  };
131 
132 
135  template<typename ValueType, bool IsConst = true>
137 
138  public boost::iterator_facade <
139  RandomAccessEnumIterator<ValueType, IsConst>,
140  ValueType,
141  boost::random_access_traversal_tag,
142  CASM_TMP::ConstSwitch<IsConst, ValueType> &,
143  long > {
144 
145  public:
146 
148  typedef ValueType value_type;
150  typedef step_type difference_type;
151 
152 
155 
158  m_ptr(notstd::clone(it)) {}
159 
160 
161  step_type step() const {
162  return m_ptr->step();
163  }
164 
165  jsonParser source() const {
166  return m_ptr->source();
167  }
168 
169  std::string name() const {
170  return m_ptr->name();
171  }
172 
173  std::unique_ptr<RandomAccessEnumIterator> clone() const {
174  return std::unique_ptr<RandomAccessEnumIterator>(this->_clone());
175  }
176 
177 
178  private:
179 
180  friend boost::iterator_core_access;
181 
184  return new RandomAccessEnumIterator(*this);
185  }
186 
188  bool equal(const RandomAccessEnumIterator &B) const {
189  return m_ptr->equal(*(B.m_ptr));
190  }
191 
192  reference dereference() const {
193  return m_ptr->dereference();
194  }
195 
196  void increment() {
197  m_ptr->increment();
198  }
199 
200  void decrement() {
201  m_ptr->decrement();
202  }
203 
204  void advance(step_type n) {
205  m_ptr->advance(n);
206  }
207 
208  difference_type distance_to(const RandomAccessEnumIterator &B) const {
209  return m_ptr->distance_to(*(B.m_ptr));
210  }
211 
213  };
214 
215 
277  template<typename ValueType, bool IsConst = true>
278  class RandomAccessEnumeratorBase : public InputEnumeratorBase<ValueType, IsConst> {
279 
281 
282  public:
283 
288  typedef std::reverse_iterator<iterator> reverse_iterator;
290 
291 
293  InputEnumeratorBase<ValueType, IsConst>(),
294  m_size(size) {}
295 
297 
298 
302  using InputEnumeratorBase<ValueType, IsConst>::name; // pure virtual
304 
305  iterator begin() {
307  }
308 
309  iterator end() {
311  }
312 
313  reverse_iterator rbegin() {
314  return reverse_iterator(end());
315  }
316 
317  reverse_iterator rend() {
318  return reverse_iterator(begin());
319  }
320 
322  size_type size() const {
323  return m_size;
324  };
325 
328  this->goto_step(0);
329  return this->dereference();
330  }
331 
334  this->goto_step(size() - 1);
335  return this->dereference();
336  }
337 
340  return front();
341  }
342 
344  reference final() {
345  return back();
346  }
347 
349  reference operator[](size_type n) {
350  this->goto_step(n);
351  return this->dereference();
352  }
353 
354  protected:
355 
363 
365  void _set_size(size_type val) {
366  m_size = val;
367  }
368 
369  private:
370 
376  virtual value_type *at_step(step_type n) = 0;
377 
383  if(this->step() == n) {
384  return;
385  }
386  this->_set_step(n);
387  if(n >= 0 && n < this->size()) {
388  this->_validate();
389  this->_set_current_ptr(this->at_step(n));
390  }
391  else {
392  this->_invalidate();
393  }
394  }
395 
398  void increment() override {
399  goto_step(step() + 1);
400  }
401 
402  size_type m_size;
403  };
404 
405 
409  template<typename ValueType, bool IsConst = true>
410  class RandomAccessEnumerator {
411 
412  public:
413 
415  typedef ValueType value_type;
418  typedef std::reverse_iterator<iterator> reverse_iterator;
420 
422 
424  ptr(e.release()) {}
425 
428 
429 
430  iterator begin() {
431  return ptr->begin();
432  }
433 
434  iterator end() {
435  return ptr->end();
436  }
437 
438  reverse_iterator rbegin() {
439  return reverse_iterator(end());
440  }
441 
442  reverse_iterator rend() {
443  return reverse_iterator(begin());
444  }
445 
447  reference current() const {
448  return ptr->current();
449  }
450 
452  step_type step() const {
453  return ptr->step();
454  }
455 
457  bool valid() const {
458  return ptr->valid();
459  }
460 
461  jsonParser source(step_type step) const {
462  return ptr->source(step);
463  }
464 
466  std::string name() const {
467  return ptr->name();
468  }
469 
470  std::unique_ptr<RandomAccessEnumeratorBase<ValueType, IsConst> > ptr;
471  };
472 
473 }
474 
475 #endif
std::unique_ptr< RandomAccessEnumeratorBase< ValueType, IsConst > > ptr
RandomAccessEnumIteratorBase(RandomAccessEnumeratorBase< ValueType, IsConst > &enumerator, bool is_end)
RandomAccessEnumeratorBase< ValueType, IsConst > & _enum()
static_cast enumerator pointer to RandomAccessEnumeratorBase&
RandomAccessEnumeratorBase< ValueType, IsConst >::size_type size_type
void _set_current_ptr(value_type *_new)
Change the pointer.
Definition: Enumerator.hh:239
notstd::cloneable_ptr< RandomAccessEnumIteratorBase< ValueType, IsConst > > m_ptr
RandomAccessEnumIterator< ValueType, IsConst > iterator
std::string name() const
Derived enumerators must implement name.
virtual value_type * at_step(step_type n)=0
EnumeratorBase * _enum_ptr()
Definition: Enumerator.hh:330
step_type step() const
Increments with each enumerated object.
RandomAccessEnumeratorBase< ValueType, IsConst >::step_type step_type
Base class for implementing specialized input enumerators.
CASM_TMP::ConstSwitch< IsConst, ValueType > & reference
Definition: Enumerator.hh:192
reference front()
Reference to first element in enumerator.
RandomAccessEnumIterator implemenation.
Main CASM namespace.
Definition: complete.cpp:8
RandomAccessEnumIterator()
Default constructor.
ValueType value_type
Definition: Enumerator.hh:191
difference_type distance_to(const RandomAccessEnumIteratorBase &B) const
boost::iterator_facade implementation
std::reverse_iterator< iterator > reverse_iterator
void decrement()
boost::iterator_facade implementation
jsonParser source(step_type step) const
difference_type distance_to(const RandomAccessEnumIterator &B) const
void _validate()
Used if random access enumerator step is moved into valid range.
Definition: Enumerator.hh:174
RandomAccessEnumIterator(const RandomAccessEnumIteratorBase< ValueType, IsConst > &it)
Construct iterator.
ValEnumerator< ValueType, IsConst >::reference reference
Definition: Enumerator.hh:362
void increment() override
boost::iterator_facade implementation
RandomAccessEnumeratorBase< ValueType, IsConst >::reference reference
void _invalidate()
Call if enumeration complete.
Definition: Enumerator.hh:169
std::unique_ptr< RandomAccessEnumIteratorBase > clone() const
step_type step() const
Increments with each enumerated object.
Definition: Enumerator.hh:113
reference back()
Reference to last element in enumerator.
Base class for implementing specialized random access enumerators.
RandomAccessEnumIterator * _clone() const
clone implementation
reference current() const
Access the current ObjectType by reference.
RandomAccessEnumIterator< ValueType, IsConst > iterator
Generic random access enumerator.
reference dereference() const override
boost::iterator_facade implementation
EnumeratorBase::step_type step_type
Definition: Enumerator.hh:259
void advance(step_type n)
boost::iterator_facade implementation
RandomAccessEnumIteratorBase< ValueType, IsConst > * _clone() const override
clone implementation
bool valid() const
Returns false if enumeration is complete.
RandomAccessEnumIteratorBase< ValueType, IsConst >::reference reference
size_type size() const
Number of elements in enumerator.
Non-std smart pointer classes and functions.
RandomAccessEnumerator & operator=(const RandomAccessEnumerator &)=delete
The iterator type for RandomAccessEnumerator.
RandomAccessEnumeratorBase< ValueType, IsConst > & _enum() const
static_cast enumerator pointer to RandomAccessEnumeratorBase&
void _set_size(size_type val)
Set size value.
void _set_step(step_type val)
Set current step value.
Definition: Enumerator.hh:154
RandomAccessEnumerator(std::unique_ptr< RandomAccessEnumeratorBase< ValueType, IsConst > > e)
void _assert_ptr() const
Definition: Enumerator.hh:303
std::reverse_iterator< iterator > reverse_iterator
bool equal(const RandomAccessEnumIterator &B) const
boost::iterator_facade implementation
reference operator[](size_type n)
Reference an element in enumerator.
A 'cloneable_ptr' can be used in place of 'unique_ptr'.
reference initial()
Reference to first element in enumerator.
RandomAccessEnumIteratorBase< ValueType, IsConst >::step_type step_type
std::unique_ptr< RandomAccessEnumIterator > clone() const