CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
Enumerator.hh
Go to the documentation of this file.
1 #ifndef CASM_Enumerator
2 #define CASM_Enumerator
3 
4 #include <string>
5 
9 
10 namespace CASM {
11 
85  template<typename ValueType, bool IsConst>
87 
88  // ---- Enumerator ---------------------
89 
100 
101  public:
102 
103  typedef long step_type;
104 
107  m_valid(false),
108  m_step(0) {}
109 
111 
113  step_type step() const {
114  return m_step;
115  }
116 
118  bool valid() const {
119  return m_valid;
120  }
121 
131  virtual jsonParser source(step_type step) const {
132  jsonParser src;
133  src["enumerated_by"] = this->name();
134  src["step"] = step;
135  return src;
136  }
137 
139  virtual std::string name() const = 0;
140 
141 
142  protected:
143 
148  void _initialize() {
149  m_step = 0;
150  m_valid = true;
151  }
152 
154  void _set_step(step_type val) {
155  m_step = val;
156  }
157 
160  ++m_step;
161  }
162 
165  --m_step;
166  }
167 
169  void _invalidate() {
170  m_valid = false;
171  }
172 
174  void _validate() {
175  m_valid = true;
176  }
177 
178  private:
179 
180  bool m_valid;
181 
182  step_type m_step;
183 
184  };
185 
186  template<typename ValueType, bool IsConst = true>
187  class ValEnumerator : public EnumeratorBase {
188 
189  public:
190 
191  typedef ValueType value_type;
194 
196  m_current_ptr(nullptr) {}
197 
198  virtual ~ValEnumerator() {}
199 
200  // -- from EnumeratorBase --
201 
202  public:
203 
204  using EnumeratorBase::step;
205  using EnumeratorBase::valid;
206  using EnumeratorBase::source; // virtual
207  using EnumeratorBase::name; // pure virtual
208 
209  protected:
210 
216  void _initialize(value_type *_initial) {
217  _set_current_ptr(_initial);
219  }
220 
225 
226 
227  // -- For ValEnumerator --
228 
229  public:
230 
232  reference current() const {
233  return *m_current_ptr;
234  }
235 
236  protected:
237 
239  void _set_current_ptr(value_type *_new) {
240  m_current_ptr = _new;
241  }
242 
244  value_type &_current() {
245  return *m_current_ptr;
246  }
247 
248  private:
249 
250  value_type *m_current_ptr;
251 
252  };
253 
254 
256 
257  public:
258 
260 
263  m_enum_ptr(nullptr) {}
264 
267  m_enum_ptr(&enumerator) {}
268 
269  virtual ~EnumIteratorBase() {}
270 
274  virtual step_type step() const = 0;
275 
279  jsonParser source() const {
280  return _enum().source(this->step());
281  }
282 
284  std::string name() const {
285  return m_enum_ptr->name();
286  }
287 
289  virtual bool is_end() const = 0;
290 
291  std::unique_ptr<EnumIteratorBase> clone() const {
292  return std::unique_ptr<EnumIteratorBase>(this->_clone());
293  }
294 
295 
296  protected:
297 
298  void _assert_same_ptr(const EnumIteratorBase &other) const {
299  assert((m_enum_ptr == other.m_enum_ptr) &&
300  "Comparing EnumIterator referring to different enumerators is not allowed!");
301  }
302 
303  void _assert_ptr() const {
304  assert(m_enum_ptr && "EnumIterator does not point to any enumerator!");
305  }
306 
307  void _assert_valid() const {
308  assert(m_enum_ptr->valid() && "EnumIterator points to an invalid enumerator!");
309  }
310 
315  bool equal(const EnumIteratorBase &other) const {
316  bool this_is_end = this->is_end();
317  bool other_is_end = other.is_end();
318 
319  if(this_is_end != other_is_end) {
320  return false;
321  }
322 
323  if(this_is_end) {
324  return true;
325  }
326 
327  return (this->step() == other.step());
328  }
329 
331  return m_enum_ptr;
332  }
333 
335  return m_enum_ptr;
336  }
337 
338  private:
339 
340  virtual EnumIteratorBase *_clone() const = 0;
341 
343  return *m_enum_ptr;
344  }
345 
347  return *m_enum_ptr;
348  }
349 
350  // pointer to Enumerator
352 
353  };
354 
355  template<typename ValueType, bool IsConst = true>
357 
358  public:
359 
361  typedef ValueType value_type;
363 
364 
366 
368  EnumIteratorBase(enumerator) {}
369 
370  virtual ~ValEnumIterator() {}
371 
372  using EnumIteratorBase::step; // pure virtual
375  using EnumIteratorBase::is_end; // pure virtual
376 
377  std::unique_ptr<EnumIteratorBase> clone() const {
378  return std::unique_ptr<EnumIteratorBase>(this->_clone());
379  }
380 
381  protected:
382 
388 
389  private:
390 
391  virtual EnumIteratorBase *_clone() const = 0;
392  virtual reference dereference() const = 0;
393 
394  };
395 
398  // ---- Interface ---------------------
399 
400  class PrimClex;
401  template<bool>
402  class ScelEnumT;
403  typedef ScelEnumT<false> ScelEnum;
404  class ScelEnumProps;
405  class Lattice;
406  template<typename T>
408 
409  namespace Completer {
410  class EnumOption;
411  }
412 
417  class EnumInterfaceBase {
419 
420  public:
421 
423 
424  virtual ~EnumInterfaceBase() {}
425 
426  virtual std::string help() const = 0;
427 
428  virtual std::string name() const = 0;
429 
430  virtual int run(PrimClex &primclex, const jsonParser &kwargs, const Completer::EnumOption &enum_opt) const = 0;
431 
432  std::unique_ptr<EnumInterfaceBase> clone() const {
433  return std::unique_ptr<EnumInterfaceBase>(this->_clone());
434  }
435 
436  private:
437 
438  virtual EnumInterfaceBase *_clone() const = 0;
439 
440  };
441 
442 
445 
447  inline EnumeratorMap make_enumerator_map() {
448 
449  return EnumeratorMap(
450  [](const EnumInterfaceBase & e) -> std::string {
451  return e.name();
452  },
454  return notstd::clone(e);
455  });
456  }
457 
460  const jsonParser &_kwargs,
461  const Completer::EnumOption &enum_opt);
462 
464  ScelEnumProps make_enumerator_scel_enum_props(
465  PrimClex &primclex,
466  const jsonParser &_kwargs,
467  const Completer::EnumOption &enum_opt);
468 
470  std::unique_ptr<SupercellEnumerator<Lattice> > make_enumerator_superlat_enum(
471  PrimClex &primclex,
472  const jsonParser &_kwargs,
473  const Completer::EnumOption &enum_opt);
474 
476  std::unique_ptr<ScelEnum> make_enumerator_scel_enum(
477  PrimClex &primclex,
478  const jsonParser &_kwargs,
479  const Completer::EnumOption &enum_opt);
480 
482  std::vector<std::string> make_enumerator_filter_expr(
483  const jsonParser &_kwargs,
484  const Completer::EnumOption &enum_opt);
485 
488  template<typename ScelIterator, typename ConfigEnumConstructor>
490  std::string method,
491  PrimClex &primclex,
492  ScelIterator begin,
493  ScelIterator end,
494  ConfigEnumConstructor f,
495  std::vector<std::string> filter_expr);
496 
498  template<typename ScelIterator, typename ConfigEnumConstructor>
499  int insert_configs(
500  std::string method,
501  PrimClex &primclex,
502  ScelIterator begin,
503  ScelIterator end,
504  ConfigEnumConstructor f,
505  std::vector<std::string> filter_expr,
506  bool primitive_only);
507 
509  template<typename LatticeIterator, typename ConfigEnumConstructor>
511  std::string method,
512  PrimClex &primclex,
513  LatticeIterator begin,
514  LatticeIterator end,
515  ConfigEnumConstructor f,
516  std::vector<std::string> filter_expr,
517  bool primitive_only);
518 
520  template<typename Derived>
522 
523  public:
524 
525  std::string help() const override {
526  return Derived::interface_help;
527  }
528 
529  std::string name() const override {
530  return Derived::enumerator_name;
531  }
532 
533  int run(PrimClex &primclex, const jsonParser &kwargs, const Completer::EnumOption &enum_opt) const override {
534  return Derived::run(primclex, kwargs, enum_opt);
535  }
536 
537  std::unique_ptr<EnumInterfaceBase> clone() const {
538  return std::unique_ptr<EnumInterfaceBase>(this->_clone());
539  }
540 
541  private:
542 
543  EnumInterfaceBase *_clone() const override {
544  return new EnumInterface<Derived>(*this);
545  }
546 
547 
548  };
549 
552 }
553 
554 #endif
virtual EnumInterfaceBase * _clone() const =0
std::string name() const
Uses enumerator class 'name' implementation.
Definition: Enumerator.hh:284
Abstract base class for enumerators.
Definition: Enumerator.hh:99
EnumeratorBase & _enum()
Definition: Enumerator.hh:342
typename std::conditional< IsConst, const T, T >::type ConstSwitch
Definition: CASM_TMP.hh:93
EnumeratorBase & _enum() const
Definition: Enumerator.hh:346
void _set_current_ptr(value_type *_new)
Change the pointer.
Definition: Enumerator.hh:239
virtual bool is_end() const =0
Returns true if 'end' iterator.
std::unique_ptr< EnumIteratorBase > clone() const
Definition: Enumerator.hh:291
virtual std::string name() const =0
Derived enumerators must implement name, via ENUM_MEMBERS.
std::unique_ptr< EnumIteratorBase > clone() const
Definition: Enumerator.hh:377
std::string help() const override
Definition: Enumerator.hh:525
ValEnumIterator(ValEnumerator< ValueType, IsConst > &enumerator)
Definition: Enumerator.hh:367
std::vector< std::string > make_enumerator_filter_expr(const jsonParser &_kwargs, const Completer::EnumOption &enum_opt)
Standardizes parsing casm enum filter expressions.
Definition: Enumerator.cc:91
EnumeratorBase * m_enum_ptr
Definition: Enumerator.hh:351
virtual step_type step() const =0
Data structure for holding supercell enumeration properties.
PrimClex * primclex
Definition: settings.cc:101
EnumeratorBase * _enum_ptr()
Definition: Enumerator.hh:330
std::unique_ptr< EnumInterfaceBase > clone() const
Definition: Enumerator.hh:432
virtual ~ValEnumerator()
Definition: Enumerator.hh:198
CASM_TMP::ConstSwitch< IsConst, ValueType > & reference
Definition: Enumerator.hh:192
Base class for generic use of enumerators that may be accessed through the API.
Definition: Enumerator.hh:418
virtual jsonParser source(step_type step) const
Definition: Enumerator.hh:131
A fake container of supercell matrices.
Definition: Enumerator.hh:407
Main CASM namespace.
Definition: complete.cpp:8
ValueType value_type
Definition: Enumerator.hh:191
virtual ~ValEnumIterator()
Definition: Enumerator.hh:370
Enumerate over Supercell.
Definition: ScelEnum.hh:148
virtual int run(PrimClex &primclex, const jsonParser &kwargs, const Completer::EnumOption &enum_opt) const =0
virtual std::string name() const =0
int insert_configs(std::string method, PrimClex &primclex, ScelIterator begin, ScelIterator end, ConfigEnumConstructor f, std::vector< std::string > filter_expr, bool primitive_only)
Standardizes insertion from enumerators that construct configurations.
virtual EnumIteratorBase * _clone() const =0
jsonParser make_enumerator_scel_enum_input(const jsonParser &_kwargs, const Completer::EnumOption &enum_opt)
Standardizes parsing casm enum input options to make ScelEnum JSON input.
Definition: Enumerator.cc:8
Template class to be specialized for each enumerator that may be accessed via the API...
Definition: Enumerator.hh:521
ScelEnumProps make_enumerator_scel_enum_props(PrimClex &primclex, const jsonParser &_kwargs, const Completer::EnumOption &enum_opt)
Standardizes parsing casm enum input options to make an ScelEnumProps.
Definition: Enumerator.cc:44
void _assert_same_ptr(const EnumIteratorBase &other) const
Definition: Enumerator.hh:298
void _validate()
Used if random access enumerator step is moved into valid range.
Definition: Enumerator.hh:174
value_type & _current()
Access the current ObjectType by reference.
Definition: Enumerator.hh:244
jsonParser source() const
Definition: Enumerator.hh:279
ValEnumerator< ValueType, IsConst >::reference reference
Definition: Enumerator.hh:362
EnumeratorBase * _enum_ptr() const
Definition: Enumerator.hh:334
int insert_configs_via_lattice_enum(std::string method, PrimClex &primclex, LatticeIterator begin, LatticeIterator end, ConfigEnumConstructor f, std::vector< std::string > filter_expr, bool primitive_only)
Standardizes insertion from enumerators that construct configurations.
std::string name() const override
Definition: Enumerator.hh:529
virtual reference dereference() const =0
void _invalidate()
Call if enumeration complete.
Definition: Enumerator.hh:169
std::unique_ptr< T > clone(const T &obj, typename std::enable_if< has_clone< T >::value, T >::type *=nullptr)
step_type step() const
Increments with each enumerated object.
Definition: Enumerator.hh:113
std::unique_ptr< SupercellEnumerator< Lattice > > make_enumerator_superlat_enum(PrimClex &primclex, const jsonParser &_kwargs, const Completer::EnumOption &enum_opt)
Standardizes parsing casm enum input options to make an SupercellEnumerator ...
Definition: Enumerator.cc:57
PrimClex is the top-level data structure for a CASM project.
Definition: PrimClex.hh:52
EnumeratorBase::step_type step_type
Definition: Enumerator.hh:259
bool valid() const
Returns false if enumeration is complete.
Definition: Enumerator.hh:118
std::unique_ptr< EnumInterfaceBase > clone() const
Definition: Enumerator.hh:537
void _set_step(step_type val)
Set current step value.
Definition: Enumerator.hh:154
void _initialize(value_type *_initial)
Definition: Enumerator.hh:216
void _decrement_step()
Decrement current step value.
Definition: Enumerator.hh:164
void _assert_ptr() const
Definition: Enumerator.hh:303
virtual ~EnumInterfaceBase()
Definition: Enumerator.hh:424
EnumInterfaceBase * _clone() const override
Definition: Enumerator.hh:543
virtual std::string help() const =0
std::map wrapper to enforce a 1-1 ValueType->KeyType relationship
Definition: unique_map.hh:141
void _assert_valid() const
Definition: Enumerator.hh:307
reference current() const
Access the current ObjectType by reference.
Definition: Enumerator.hh:232
std::unique_ptr< ScelEnum > make_enumerator_scel_enum(PrimClex &primclex, const jsonParser &_kwargs, const Completer::EnumOption &enum_opt)
Standardizes parsing casm enum input options to make an ScelEnum.
Definition: Enumerator.cc:78
A 'cloneable_ptr' can be used in place of 'unique_ptr'.
EnumIteratorBase()
Default Constructor.
Definition: Enumerator.hh:262
EnumIteratorBase(EnumeratorBase &enumerator)
Constructor.
Definition: Enumerator.hh:266
int insert_unique_canon_configs(std::string method, PrimClex &primclex, ScelIterator begin, ScelIterator end, ConfigEnumConstructor f, std::vector< std::string > filter_expr)
Standardizes insertion from enumerators that construct unique primitive canonical configurations...
int run(PrimClex &primclex, const jsonParser &kwargs, const Completer::EnumOption &enum_opt) const override
Definition: Enumerator.hh:533
bool equal(const EnumIteratorBase &other) const
boost::iterator_facade implementation
Definition: Enumerator.hh:315
ScelEnumT< false > ScelEnum
Definition: Enumerator.hh:402
virtual ~EnumIteratorBase()
Definition: Enumerator.hh:269
void _increment_step()
Increment current step value.
Definition: Enumerator.hh:159
value_type * m_current_ptr
Definition: Enumerator.hh:250
virtual EnumIteratorBase * _clone() const =0
EnumeratorBase()
Default constructor.
Definition: Enumerator.hh:106
EnumeratorMap make_enumerator_map()
Use to construct an EnumeratorMap.
Definition: Enumerator.hh:447
notstd::unique_cloneable_map< std::string, EnumInterfaceBase > EnumeratorMap
Used to hold a list of all enumerators that may be accessed via the API.
Definition: Enumerator.hh:444