CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
BaseCounter.hh
Go to the documentation of this file.
1 #ifndef BASECOUNTER_HH
2 #define BASECOUNTER_HH
3 
4 #include "casm/misc/CASM_TMP.hh"
5 
6 namespace CASM {
7 
13  template<typename CounterType>
15  public:
16  typedef typename CounterType::value_type value_type;
17  typedef typename CounterType::size_type size_type;
18 
19  CounterValueIterator(CounterType const *_counter_ptr = nullptr, size_type _ind = 0) : m_counter_ptr(_counter_ptr), m_ind(_ind) {}
20  //CounterValueIterator(const CounterValueIterator &_it);
21 
22  bool operator==(const CounterValueIterator &_it) {
23  return (m_counter_ptr == _it.m_counter_ptr && m_ind == _it.m_ind);
24  }
25 
26  bool operator!=(const CounterValueIterator &_it) {
27  return !((*this) == _it);
28  }
29 
31  ++m_ind;
32  return *this;
33  }
34 
36  CounterValueIterator t_it(*this);
37  ++(*this);
38  return t_it;
39  }
40 
41  const value_type &operator*() const {
42  return (*m_counter_ptr)[m_ind];
43  }
44  value_type const *operator->() const {
45  return &operator*();
46  }
47 
48  private:
49  CounterType const *m_counter_ptr;
50  size_type m_ind;
51 
52 
53  };
54 
107  /*template<typename Container,
108  typename value_type = typename Container::value_type,
109  typename size_type = typename Container::size_type,
110  typename Access = CASM_TMP::BracketAccess<Container, value_type, size_type>,
111  typename Compare = CASM_TMP::MuchLessThan<value_type> >
112  */
113  template<typename DerivedCounter>
114  class BaseCounter {
115 
116  public:
123 
126 
127 
133  BaseCounter(const Container &_initial,
134  const Container &_final,
135  const Container &_increment,
136  Access _access = Access(),
137  Compare _compare = Compare()) :
138  m_access(_access), m_compare(_compare), m_initial(_initial), m_final(_final), m_increment(_increment),
139  m_lower(_initial), m_upper(_initial), m_current(_initial), m_valid(_initial.size() != 0) {
140 
141  //_init();
142  }
143 
146  bool valid() const {
147  return m_valid;
148  };
149 
150  operator bool()const {
151  return valid();
152  }
153 
158  operator const Container &() const {
159  return m_current;
160  }
161 
162 
163  const value_type &operator[](size_type index) const {
164  return m_access(m_current, index);
165  };
166 
171  size_type size() const {
172  return m_current.size();
173  }
174 
175  const_value_iterator value_begin() const {
176  return const_value_iterator(static_cast<DerivedCounter const *>(this), 0);
177  }
178 
179  const_value_iterator value_end() const {
180  return const_value_iterator(static_cast<DerivedCounter const *>(this), size());
181  }
182 
187  bool compare(const value_type &A, const value_type &B) {
188  return m_compare(A, B);
189  }
190 
195  const Container &current() const {
196  return m_current;
197  }
198 
203  const value_type &current(size_type index) const {
204  return m_access(m_current, index);
205  }
206 
211  const Container &operator()() const {
212  return m_current;
213  }
214 
219  const Container &initial() const {
220  return m_initial;
221  }
222 
227  const Container &final() const {
228  return m_final;
229  }
230 
235  const Container &increment() const {
236  return m_increment;
237  }
238 
239  protected:
241  bool &_valid() {
242  return m_valid;
243  }
244 
245 
250  const value_type &_current(size_type index) const {
251  return m_access(m_current, index);
252  }
253 
258  value_type &_current(size_type index) {
259  return m_access(m_current, index);
260  }
261 
262 
267  Container &_current() {
268  return m_current;
269  }
270 
275  const value_type &_initial(size_type index) const {
276  return m_access(m_initial, index);
277  }
278 
283  value_type &_initial(size_type index) {
284  return m_access(m_initial, index);
285  }
286 
291  const value_type &_final(size_type index) const {
292  return m_access(m_final, index);
293  }
294 
299  value_type &_final(size_type index) {
300  return m_access(m_final, index);
301  }
302 
307  const value_type &_increment(size_type index) const {
308  return m_access(m_increment, index);
309  }
310 
315  value_type &_increment(size_type index) {
316  return m_access(m_increment, index);
317  }
318 
323  const value_type &_upper(size_type index) const {
324  return m_access(m_upper, index);
325  }
326 
331  value_type &_upper(size_type index) {
332  return m_access(m_upper, index);
333  }
334 
339  const value_type &_lower(size_type index) const {
340  return m_access(m_lower, index);
341  }
342 
347  value_type &_lower(size_type index) {
348  return m_access(m_lower, index);
349  }
350 
351  private:
353  Access m_access;
354 
356  Compare m_compare;
357 
359  Container m_initial;
360 
362  Container m_final;
363 
365  Container m_increment;
366 
368  Container m_lower;
369 
371  Container m_upper;
372 
374  Container m_current;
375 
378  bool m_valid;
379 
380  };
381 
384 }
385 
386 #endif
const value_type & _final(size_type index) const
Definition: BaseCounter.hh:291
const Container & current() const
Definition: BaseCounter.hh:195
const value_type & current(size_type index) const
Definition: BaseCounter.hh:203
Container m_initial
Initial container values.
Definition: BaseCounter.hh:359
CounterType::value_type value_type
Definition: BaseCounter.hh:16
Container m_current
The current state of the container.
Definition: BaseCounter.hh:374
const Container & operator()() const
Definition: BaseCounter.hh:211
Container m_lower
The minimum of each value of m_initial and m_final.
Definition: BaseCounter.hh:368
const Container & increment() const
Definition: BaseCounter.hh:235
value_type const * operator->() const
Definition: BaseCounter.hh:44
Container m_increment
Amount to increment each container value.
Definition: BaseCounter.hh:365
const value_type & operator[](size_type index) const
Definition: BaseCounter.hh:163
BaseCounter()
Default construct a Counter.
Definition: BaseCounter.hh:125
Main CASM namespace.
Definition: complete.cpp:8
CounterValueIterator & operator++()
Definition: BaseCounter.hh:30
value_type & _lower(size_type index)
Definition: BaseCounter.hh:347
const value_type & _upper(size_type index) const
Definition: BaseCounter.hh:323
CounterValueIterator< DerivedCounter > const_value_iterator
Definition: BaseCounter.hh:122
const_value_iterator value_end() const
Definition: BaseCounter.hh:179
bool & _valid()
non-const reference bool validity flag
Definition: BaseCounter.hh:241
Container m_final
Final container values.
Definition: BaseCounter.hh:362
Container & _current()
Definition: BaseCounter.hh:267
value_type & _initial(size_type index)
Definition: BaseCounter.hh:283
CASM_TMP::traits< DerivedCounter >::Compare Compare
Definition: BaseCounter.hh:121
Compare m_compare
A functor that enables custom comparison, by default: operator<.
Definition: BaseCounter.hh:356
const value_type & _increment(size_type index) const
Definition: BaseCounter.hh:307
CASM_TMP::traits< DerivedCounter >::value_type value_type
Definition: BaseCounter.hh:118
CASM_TMP::traits< DerivedCounter >::Access Access
Definition: BaseCounter.hh:120
CounterValueIterator(CounterType const *_counter_ptr=nullptr, size_type _ind=0)
Definition: BaseCounter.hh:19
CounterType const * m_counter_ptr
Definition: BaseCounter.hh:49
A Counter allows looping over many incrementing variables in one loop.
Definition: BaseCounter.hh:114
bool operator!=(const CounterValueIterator &_it)
Definition: BaseCounter.hh:26
CounterType::size_type size_type
Definition: BaseCounter.hh:17
value_type & _current(size_type index)
Definition: BaseCounter.hh:258
const value_type & _current(size_type index) const
Definition: BaseCounter.hh:250
value_type & _increment(size_type index)
Definition: BaseCounter.hh:315
Container m_upper
The maximum of each value of m_initial and m_final.
Definition: BaseCounter.hh:371
CASM_TMP::traits< DerivedCounter >::Container Container
Definition: BaseCounter.hh:117
value_type & _final(size_type index)
Definition: BaseCounter.hh:299
size_type size() const
Definition: BaseCounter.hh:171
const value_type & operator*() const
Definition: BaseCounter.hh:41
bool operator==(const CounterValueIterator &_it)
Definition: BaseCounter.hh:22
CounterValueIterator operator++(int)
Definition: BaseCounter.hh:35
const value_type & _initial(size_type index) const
Definition: BaseCounter.hh:275
const_value_iterator value_begin() const
Definition: BaseCounter.hh:175
BaseCounter(const Container &_initial, const Container &_final, const Container &_increment, Access _access=Access(), Compare _compare=Compare())
Construct a Counter-type object.
Definition: BaseCounter.hh:133
CASM_TMP::traits< DerivedCounter >::size_type size_type
Definition: BaseCounter.hh:119
const Container & initial() const
Definition: BaseCounter.hh:219
bool compare(const value_type &A, const value_type &B)
Definition: BaseCounter.hh:187
bool valid() const
Definition: BaseCounter.hh:146
const value_type & _lower(size_type index) const
Definition: BaseCounter.hh:339
Access m_access
A functor that enables different ways of accessing the container, by default: container[index].
Definition: BaseCounter.hh:353
value_type & _upper(size_type index)
Definition: BaseCounter.hh:331