8#include <ext/algorithm>
25template <
class Derived,
class ComponentType,
class ComponentName >
37 static bool used (
const Derived &
object,
const ComponentType & element );
48 static bool available (
const Derived &
object,
const ComponentType & element );
58 static void valid (
const Derived &
object,
const ComponentType & element );
67template <
class Derived,
class SetComponentType,
class ComponentType,
class ComponentName >
72 SetComponentType m_data;
78 void checkAdd (
const ComponentType & element ) {
82 std::string elementTypeName ( ext::to_string < ComponentName > ( ) );
91 void checkRemove (
const ComponentType & element ) {
93 std::string elementTypeName ( ext::to_string < ComponentName > ( ) );
103 for (
const ComponentType & element : m_data )
104 checkAdd ( element );
127 bool add ( ComponentType element ) {
128 checkAdd ( element );
129 return m_data.insert ( std::move ( element ) ).second;
137 Derived &
add ( SetComponentType data ) {
139 add ( std::move ( element ) );
140 return static_cast < Derived &
> ( * this );
149 Derived &
set ( SetComponentType data ) {
150 auto removeCheckLambda = [ this ] (
const auto & value ) {
151 this->checkRemove ( value );
154 auto addCheckLambda = [ this ] (
const auto & value ) {
155 this->checkAdd ( value );
160 m_data = std::move ( data );
161 return static_cast < Derived &
> ( * this );
167 SetComponentType &
get ( ) {
174 const SetComponentType &
get ( )
const {
184 bool remove (
const ComponentType & element ) {
185 checkRemove ( element );
186 return m_data.erase ( element );
193 Derived &
remove (
const SetComponentType & data ) {
194 for (
const ComponentType & element : data )
196 return static_cast < Derived &
> ( * this );
204 return m_data.empty ( );
212 template <
class AccessedComponentName >
213 requires std::is_same_v < AccessedComponentName, ComponentName >
223 template <
class AccessedComponentName >
224 requires std::is_same_v < AccessedComponentName, ComponentName >
231template <
class Derived,
class ComponentType,
class ComponentName >
232class Component < Derived, ComponentType,
component::Set, ComponentName > :
public SetComponent < Derived, ComponentType, typename ComponentType::value_type, ComponentName > {
237 Component ( ComponentType data ) :
SetComponent < Derived, ComponentType, typename ComponentType::value_type, ComponentName > (
std::move ( data ) ) {
249 std::array < std::string, 0 > emptyNames;
250 std::array < std::string, 1 > elementNames = { {
"element" } };
251 std::array < std::string, 1 > dataNames = { {
"data" } };
254 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( getMethod,
"get", emptyNames );
257 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( constGetMethod,
"get", emptyNames );
260 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( setMethod,
"set", dataNames );
263 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( addElement,
"add", elementNames );
266 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( addSet,
"add", dataNames );
269 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( removeElement,
"remove", elementNames );
272 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( removeSet,
"remove", dataNames );
275 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( emptyMethod,
"empty", emptyNames );
282 abstraction::AlgorithmRegistry::unregisterMethod < ComponentName, Derived & > (
"get" );
283 abstraction::AlgorithmRegistry::unregisterMethod < ComponentName, const Derived & > (
"get" );
284 abstraction::AlgorithmRegistry::unregisterMethod < ComponentName, Derived &, ComponentType > (
"set" );
285 abstraction::AlgorithmRegistry::unregisterMethod < ComponentName, Derived, typename ComponentType::value_type > (
"add" );
286 abstraction::AlgorithmRegistry::unregisterMethod < ComponentName, Derived, ComponentType > (
"add" );
287 abstraction::AlgorithmRegistry::unregisterMethod < ComponentName, Derived, const typename ComponentType::value_type & > (
"remove" );
288 abstraction::AlgorithmRegistry::unregisterMethod < ComponentName, Derived, const ComponentType & > (
"remove" );
289 abstraction::AlgorithmRegistry::unregisterMethod < ComponentName, const Derived & > (
"empty" );
Component(ComponentType data)
Definition: setComponents.hpp:237
static void unregisterComponent()
Definition: setComponents.hpp:281
static void registerComponent()
Definition: setComponents.hpp:248
Definition: components.hpp:50
Definition: setComponents.hpp:68
Derived & add(SetComponentType data)
Definition: setComponents.hpp:137
SetComponent(SetComponentType data)
Definition: setComponents.hpp:112
bool empty() const
Definition: setComponents.hpp:203
void checkState()
Definition: setComponents.hpp:102
Derived & remove(const SetComponentType &data)
Definition: setComponents.hpp:193
& accessComponent()
Definition: setComponents.hpp:225
bool remove(const ComponentType &element)
Definition: setComponents.hpp:184
const Component< Derived, SetComponentType, component::Set, ComponentName > & accessComponent() const
Definition: setComponents.hpp:214
Derived & set(SetComponentType data)
Definition: setComponents.hpp:149
const SetComponentType & get() const
Definition: setComponents.hpp:174
bool add(ComponentType element)
Definition: setComponents.hpp:127
SetComponentType & get()
Definition: setComponents.hpp:167
Definition: setComponents.hpp:26
static void valid(const Derived &object, const ComponentType &element)
static bool available(const Derived &object, const ComponentType &element)
static bool used(const Derived &object, const ComponentType &element)
Basic exception from which all other exceptions are derived.
Definition: CommonException.h:21
Definition: components.hpp:13
Definition: normalize.hpp:10
callback_iterator< T > make_callback_iterator(T callback)
Definition: iterator.hpp:993
reference_mover< T > make_mover(T ¶m)
Move adaptor construction function specialized to lvalue reference parameter.
Definition: iterator.hpp:468
std::string to_string(const T &value)
To string method designated for objects that can be casted to string.
Definition: string.hpp:131
void set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator1 result1, OutputIterator2 result2, Compare comp)
Constructs sorted ranges beginning in the location pointed by result1 and result2 with the set differ...
Definition: algorithm.hpp:93
Definition: FordFulkerson.hpp:16