CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
InputEnumerator.hh
Go to the documentation of this file.
1 #ifndef CASM_InputEnumerator
2 #define CASM_InputEnumerator
3 
4 #include <string>
5 
7 
8 namespace CASM {
9 
10  template<typename ValueType, bool IsConst>
12 
13  template<typename ValueType, bool IsConst>
15 
16 
17  template<typename ValueType, bool IsConst = true>
18  class InputEnumIteratorBase : public ValEnumIterator<ValueType, IsConst> {
19 
21 
22  public:
23 
27 
28 
30 
32  ValEnumIterator<ValueType, IsConst>(enumerator), m_constructed_as_end(is_end) {}
33 
35 
36 
39 
43  virtual step_type step() const override {
44  this->_assert_ptr();
45  return _enum().step();
46  }
47 
56  virtual bool is_end() const override {
57  this->_assert_ptr();
58  return _constructed_as_end() || !this->_enum().valid();
59  }
60 
61  std::unique_ptr<InputEnumIteratorBase> clone() const {
62  return std::unique_ptr<InputEnumIteratorBase>(this->_clone());
63  }
64 
65  protected:
67 
68  bool _constructed_as_end() const {
69  return m_constructed_as_end;
70  }
71 
72  private:
73 
76  }
77 
79  virtual reference dereference() const override {
80  return _enum().current();
81  }
82 
84  virtual void increment() {
85  _enum().increment();
86  }
87 
90  return static_cast<InputEnumeratorBase<ValueType, IsConst>&>(*_enum_ptr());
91  }
92 
95  return static_cast<InputEnumeratorBase<ValueType, IsConst>&>(*_enum_ptr());
96  }
97 
99  };
100 
101 
102  template<typename ValueType, bool IsConst = true>
103  class InputEnumIterator :
104 
105  public boost::iterator_facade <
106  InputEnumIterator<ValueType, IsConst>,
107  ValueType,
108  std::input_iterator_tag,
109  CASM_TMP::ConstSwitch<IsConst, ValueType> &,
110  long > {
111 
112  public:
113 
115  typedef ValueType value_type;
117 
118 
121 
124  m_ptr(notstd::clone(it)) {}
125 
126 
127  step_type step() const {
128  return m_ptr->step();
129  }
130 
131  jsonParser source() const {
132  return m_ptr->source();
133  }
134 
135  std::string name() const {
136  return m_ptr->name();
137  }
138 
139 
140  private:
141 
142  friend boost::iterator_core_access;
143 
145  void increment() {
146  m_ptr->increment();
147  }
148 
150  reference dereference() const {
151  return m_ptr->dereference();
152  }
153 
155  bool equal(const InputEnumIterator &B) const {
156  return m_ptr->equal(*(B.m_ptr));
157  }
158 
160  };
161 
162 
221  template<typename ValueType, bool IsConst = true>
222  class InputEnumeratorBase : public ValEnumerator<ValueType, IsConst> {
223 
225 
226  public:
227 
232 
233 
235 
236  virtual ~InputEnumeratorBase() {}
237 
238 
242  using ValEnumerator<ValueType, IsConst>::name; // pure virtual
244 
245  iterator begin() {
246  return InputEnumIteratorBase<ValueType, IsConst>(*this, false);
247  }
248 
249  iterator end() {
250  return InputEnumIteratorBase<ValueType, IsConst>(*this, true);
251  }
252 
253 
254  protected:
255 
262 
263 
264  private:
265 
266  //using ValEnumerator<ValueType, IsConst>::_decrement_step; // hide
267  virtual void increment() = 0;
268 
269  };
270 
276  template<typename ValueType, bool IsConst = true>
278 
279  public:
280 
285 
286 
288 
290  ptr(notstd::clone(e)) {}
291 
292  InputEnumerator(const InputEnumerator &) = delete;
293  InputEnumerator &operator=(const InputEnumerator &) = delete;
294 
295 
297  step_type step() const {
298  return ptr->step();
299  }
300 
302  bool valid() const {
303  return ptr->valid();
304  }
305 
306  jsonParser source(step_type step) const {
307  return ptr->source(step);
308  }
309 
311  std::string name() const {
312  return ptr->name();
313  }
314 
316  reference current() const {
317  return ptr->current();
318  }
319 
320  iterator begin() {
321  return ptr->begin();
322  }
323 
324  iterator end() {
325  return ptr->end();
326  }
327 
328  std::unique_ptr<InputEnumeratorBase<ValueType, IsConst> > ptr;
329  };
330 
331 }
332 
333 #endif
std::string name() const
Uses enumerator class 'name' implementation.
Definition: Enumerator.hh:284
InputEnumIteratorBase< ValueType, IsConst >::step_type step_type
step_type step() const
virtual reference dereference() const override
boost::iterator_facade implementation
EnumeratorBase * _enum_ptr()
Definition: Enumerator.hh:330
virtual step_type step() const override
reference dereference() const
boost::iterator_facade implementation
virtual InputEnumIteratorBase< ValueType, IsConst > * _clone() const override
Base class for implementing specialized input enumerators.
CASM_TMP::ConstSwitch< IsConst, ValueType > & reference
Definition: Enumerator.hh:192
jsonParser source(step_type step) const
InputEnumIterator(const InputEnumIteratorBase< ValueType, IsConst > &it)
Construct iterator.
Main CASM namespace.
Definition: complete.cpp:8
ValueType value_type
Definition: Enumerator.hh:191
InputEnumIteratorBase(InputEnumeratorBase< ValueType, IsConst > &enumerator, bool is_end)
InputEnumIterator()
Default constructor.
jsonParser source() const
bool equal(const InputEnumIterator &B) const
boost::iterator_facade implementation
Generic input enumerator.
jsonParser source() const
Definition: Enumerator.hh:279
ValEnumerator< ValueType, IsConst >::reference reference
Definition: Enumerator.hh:362
InputEnumerator & operator=(const InputEnumerator &)=delete
void increment()
boost::iterator_facade implementation
virtual bool is_end() const override
InputEnumeratorBase< ValueType, IsConst >::reference reference
std::unique_ptr< T > clone(const T &obj, typename std::enable_if< has_clone< T >::value, T >::type *=nullptr)
InputEnumeratorBase< ValueType, IsConst > & _enum()
static_cast enumerator pointer to InputEnumeratorBase&
std::string name() const
Derived enumerators must implement name.
InputEnumIterator< ValueType, IsConst > iterator
InputEnumIteratorBase< ValueType, IsConst >::reference reference
EnumeratorBase::step_type step_type
Definition: Enumerator.hh:259
InputEnumerator(std::unique_ptr< InputEnumeratorBase< ValueType, IsConst > > e)
reference current() const
Access the current ObjectType by reference.
std::unique_ptr< InputEnumIteratorBase > clone() const
InputEnumeratorBase< ValueType, IsConst >::step_type step_type
std::string name() const
Non-std smart pointer classes and functions.
virtual void increment()=0
step_type step() const
Increments with each enumerated object.
virtual void increment()
boost::iterator_facade implementation
void _assert_ptr() const
Definition: Enumerator.hh:303
InputEnumeratorBase< ValueType, IsConst >::iterator iterator
bool valid() const
Returns false if enumeration is complete.
A 'cloneable_ptr' can be used in place of 'unique_ptr'.
EnumeratorBase::step_type step_type
Definition: Enumerator.hh:259
InputEnumeratorBase< ValueType, IsConst > & _enum() const
static_cast enumerator pointer to InputEnumeratorBase&
InputEnumeratorBase< ValueType, IsConst >::value_type value_type
notstd::cloneable_ptr< InputEnumIteratorBase< ValueType, IsConst > > m_ptr
std::unique_ptr< InputEnumeratorBase< ValueType, IsConst > > ptr