1 #ifndef CASM_Enumerator
2 #define CASM_Enumerator
85 template<
typename ValueType,
bool IsConst>
133 src[
"enumerated_by"] = this->
name();
139 virtual std::string
name()
const = 0;
186 template<
typename ValueType,
bool IsConst = true>
274 virtual step_type
step()
const = 0;
289 virtual bool is_end()
const = 0;
291 std::unique_ptr<EnumIteratorBase>
clone()
const {
292 return std::unique_ptr<EnumIteratorBase>(this->
_clone());
300 "Comparing EnumIterator referring to different enumerators is not allowed!");
304 assert(
m_enum_ptr &&
"EnumIterator does not point to any enumerator!");
308 assert(
m_enum_ptr->
valid() &&
"EnumIterator points to an invalid enumerator!");
316 bool this_is_end = this->
is_end();
317 bool other_is_end = other.
is_end();
319 if(this_is_end != other_is_end) {
327 return (this->
step() == other.
step());
355 template<
typename ValueType,
bool IsConst = true>
377 std::unique_ptr<EnumIteratorBase>
clone()
const {
378 return std::unique_ptr<EnumIteratorBase>(this->
_clone());
409 namespace Completer {
426 virtual std::string
help()
const = 0;
428 virtual std::string
name()
const = 0;
432 std::unique_ptr<EnumInterfaceBase>
clone()
const {
433 return std::unique_ptr<EnumInterfaceBase>(this->
_clone());
460 const jsonParser &_kwargs,
461 const Completer::EnumOption &enum_opt);
466 const jsonParser &_kwargs,
467 const Completer::EnumOption &enum_opt);
472 const jsonParser &_kwargs,
473 const Completer::EnumOption &enum_opt);
478 const jsonParser &_kwargs,
479 const Completer::EnumOption &enum_opt);
483 const jsonParser &_kwargs,
484 const Completer::EnumOption &enum_opt);
488 template<
typename ScelIterator,
typename ConfigEnumConstructor>
494 ConfigEnumConstructor f,
495 std::vector<std::string> filter_expr);
498 template<
typename ScelIterator,
typename ConfigEnumConstructor>
504 ConfigEnumConstructor f,
505 std::vector<std::string> filter_expr,
506 bool primitive_only);
509 template<
typename LatticeIterator,
typename ConfigEnumConstructor>
513 LatticeIterator begin,
515 ConfigEnumConstructor f,
516 std::vector<std::string> filter_expr,
517 bool primitive_only);
520 template<
typename Derived>
525 std::string
help()
const override {
526 return Derived::interface_help;
529 std::string
name()
const override {
530 return Derived::enumerator_name;
534 return Derived::run(primclex, kwargs, enum_opt);
537 std::unique_ptr<EnumInterfaceBase>
clone()
const {
538 return std::unique_ptr<EnumInterfaceBase>(this->
_clone());
virtual EnumInterfaceBase * _clone() const =0
std::string name() const
Uses enumerator class 'name' implementation.
Abstract base class for enumerators.
typename std::conditional< IsConst, const T, T >::type ConstSwitch
EnumeratorBase & _enum() const
void _set_current_ptr(value_type *_new)
Change the pointer.
virtual bool is_end() const =0
Returns true if 'end' iterator.
std::unique_ptr< EnumIteratorBase > clone() const
virtual std::string name() const =0
Derived enumerators must implement name, via ENUM_MEMBERS.
std::unique_ptr< EnumIteratorBase > clone() const
std::string help() const override
ValEnumIterator(ValEnumerator< ValueType, IsConst > &enumerator)
std::vector< std::string > make_enumerator_filter_expr(const jsonParser &_kwargs, const Completer::EnumOption &enum_opt)
Standardizes parsing casm enum filter expressions.
EnumeratorBase * m_enum_ptr
virtual step_type step() const =0
Data structure for holding supercell enumeration properties.
EnumeratorBase * _enum_ptr()
std::unique_ptr< EnumInterfaceBase > clone() const
CASM_TMP::ConstSwitch< IsConst, ValueType > & reference
Base class for generic use of enumerators that may be accessed through the API.
virtual jsonParser source(step_type step) const
A fake container of supercell matrices.
virtual ~ValEnumIterator()
Enumerate over Supercell.
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.
Template class to be specialized for each enumerator that may be accessed via the API...
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.
void _assert_same_ptr(const EnumIteratorBase &other) const
void _validate()
Used if random access enumerator step is moved into valid range.
value_type & _current()
Access the current ObjectType by reference.
jsonParser source() const
ValEnumerator< ValueType, IsConst >::reference reference
EnumeratorBase * _enum_ptr() const
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
virtual reference dereference() const =0
void _invalidate()
Call if enumeration complete.
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.
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 ...
PrimClex is the top-level data structure for a CASM project.
EnumeratorBase::step_type step_type
bool valid() const
Returns false if enumeration is complete.
std::unique_ptr< EnumInterfaceBase > clone() const
void _set_step(step_type val)
Set current step value.
void _initialize(value_type *_initial)
void _decrement_step()
Decrement current step value.
virtual ~EnumInterfaceBase()
EnumInterfaceBase * _clone() const override
virtual std::string help() const =0
std::map wrapper to enforce a 1-1 ValueType->KeyType relationship
void _assert_valid() const
reference current() const
Access the current ObjectType by reference.
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.
A 'cloneable_ptr' can be used in place of 'unique_ptr'.
EnumIteratorBase()
Default Constructor.
EnumIteratorBase(EnumeratorBase &enumerator)
Constructor.
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
bool equal(const EnumIteratorBase &other) const
boost::iterator_facade implementation
ScelEnumT< false > ScelEnum
virtual ~EnumIteratorBase()
void _increment_step()
Increment current step value.
value_type * m_current_ptr
virtual EnumIteratorBase * _clone() const =0
EnumeratorBase()
Default constructor.
EnumeratorMap make_enumerator_map()
Use to construct an EnumeratorMap.
notstd::unique_cloneable_map< std::string, EnumInterfaceBase > EnumeratorMap
Used to hold a list of all enumerators that may be accessed via the API.