17 #include <type_traits> 20 #include "../base/assert.h" 21 #include "../tools/functions.h" 22 #include "../meta/meta.h" 26 template <
typename TRAIT_TYPE>
struct TraitKey {
31 template <
typename TRAIT_TYPE>
34 const std::string name;
35 const std::string desc;
36 const TRAIT_TYPE default_val;
40 TraitDef(
const std::string & _name,
const std::string & _desc,
const TRAIT_TYPE & _default_val,
42 : name(_name), desc(_desc), default_val(_default_val), index(_index)
46 const std::string &
GetName()
const {
return name; }
47 const std::string &
GetDesc()
const {
return desc; }
48 const TRAIT_TYPE &
GetDefault()
const {
return default_val; }
55 template <
typename... TRAIT_TYPES>
59 std::tuple< std::vector<TRAIT_TYPES>... > type_sets;
62 template <
typename IN_TYPE>
63 void PushTrait(
const IN_TYPE & in_trait) {
65 static_assert(type_id >= 0,
"Unhandled type provided to TraitSet::PushTrait()");
66 std::get<type_id>(type_sets).push_back(in_trait);
70 template <
typename IN_TYPE>
71 std::vector<IN_TYPE> & GetTypeSet() {
73 static_assert(type_id >= 0,
"Unknown type provided to TraitSet::GetTypeSet()");
74 return std::get< type_id >(type_sets);
81 template <
typename IN_TYPE>
84 static_assert(type_id >= 0,
"Unknown type provided to TraitSet::Get() const");
85 return std::get<type_id>(type_sets)[in_key.GetIndex()];
88 template <
typename IN_TYPE>
91 static_assert(type_id >= 0,
"Unknown type provided to TraitSet::Get()");
92 return std::get<type_id>(type_sets)[in_key.GetIndex()];
96 template <
typename... TRAIT_TYPES>
101 std::tuple< std::vector< TraitDef<TRAIT_TYPES> >... > trait_groups;
103 TraitSet<TRAIT_TYPES...> default_trait_set;
105 static const int num_types =
sizeof...(TRAIT_TYPES);
110 template <
typename BASE_TYPE>
111 constexpr
static int GetTraitID() {
116 template <
typename IN_TYPE>
117 const std::vector< TraitDef<IN_TYPE> > & GetTraitGroup()
const {
118 static_assert(GetTraitID<IN_TYPE>() >= 0,
119 "Unknown type provided to TraitManager::GetTraitGroup() const");
120 return std::get< GetTraitID<IN_TYPE>() >(trait_groups);
124 template <
typename IN_TYPE>
125 std::vector< TraitDef<IN_TYPE> > & GetTraitGroup() {
126 static_assert(GetTraitID<IN_TYPE>() >= 0,
127 "Unknown type provided to TraitManager::GetTraitGroup()");
128 return std::get< GetTraitID<IN_TYPE>() >(trait_groups);
132 template <
typename CUR_TYPE>
135 const std::vector< TraitDef<CUR_TYPE> > & cur_group = GetTraitGroup<CUR_TYPE>();
136 std::vector<CUR_TYPE> & type_set = trait_set.template GetTypeSet<CUR_TYPE>();
141 type_set.push_back(cur_def.GetDefault());
145 template <
typename FIRST_TYPE,
typename SECOND_TYPE,
typename... OTHER_TYPES>
147 SetDefaultsByType<FIRST_TYPE>(trait_set);
150 SetDefaultsByType<SECOND_TYPE, OTHER_TYPES...>(trait_set);
161 return (
int) GetTraitGroup<IN_TYPE>().size();
165 template <
typename IN_TYPE>
167 std::vector< TraitDef<IN_TYPE> > & cur_group = GetTraitGroup<IN_TYPE>();
168 emp_assert(index >= 0 && index < (
int) cur_group.size());
169 return cur_group[
index];
173 template <
typename IN_TYPE>
175 std::vector< TraitDef<IN_TYPE> > & cur_group = GetTraitGroup<IN_TYPE>();
176 return cur_group[key.GetIndex()];
179 template <
typename IN_TYPE>
181 const IN_TYPE & _default_val) {
182 std::vector< TraitDef<IN_TYPE> > & cur_group = GetTraitGroup<IN_TYPE>();
183 const int trait_index = (int) cur_group.size();
184 cur_group.push_back(
TraitDef<IN_TYPE>(_name, _desc, _default_val, trait_index) );
186 return cur_group[trait_index];
190 SetDefaultsByType<TRAIT_TYPES...>(trait_set);
195 template <
typename... TRAIT_TYPES>
TraitManager()
Definition: Trait.h:154
~TraitManager()
Definition: Trait.h:155
IN_TYPE & Get(const TraitKey< IN_TYPE > &in_key)
Definition: Trait.h:89
void SetDefaults(TraitSet< TRAIT_TYPES... > &trait_set) const
Definition: Trait.h:189
TraitSet()
Definition: Trait.h:112
const TraitDef< IN_TYPE > & GetTraitDef(int index)
Definition: Trait.h:166
TraitDef(const std::string &_name, const std::string &_desc, const TRAIT_TYPE &_default_val, int _index)
Definition: Trait.h:40
static int GetNumTypes()
Definition: Trait.h:157
~TraitDef()
Definition: Trait.h:44
TraitKey< TRAIT_TYPE > GetKey() const
Definition: Trait.h:50
const TraitDef< IN_TYPE > & GetTraitDef(TraitKey< IN_TYPE > key)
Definition: Trait.h:174
const TraitDef< IN_TYPE > & AddTrait(const std::string &_name, const std::string &_desc, const IN_TYPE &_default_val)
Definition: Trait.h:180
int index
Definition: Trait.h:27
If we are in emscripten, make sure to include the header.
Definition: array.h:37
const std::string & GetDesc() const
Definition: Trait.h:47
#define emp_assert(...)
Definition: assert.h:199
constexpr int get_type_index()
Definition: meta.h:70
const TRAIT_TYPE & GetDefault() const
Definition: Trait.h:48
const IN_TYPE & Get(const TraitKey< IN_TYPE > &in_key) const
Definition: Trait.h:82
int GetNumTraitsOfType() const
Definition: Trait.h:160
A TraitSet houses a collection of traits and can trigger them to all be evaluated at once...
Definition: Trait.h:103
const std::string & GetName() const
Definition: Trait.h:46
TraitKey(int _index)
Definition: Trait.h:28
int GetIndex() const
Definition: Trait.h:49
int GetNumTraits() const
Definition: Trait.h:159