Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
setComponents.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include <ext/algorithm>
9#include <ext/typeinfo>
10
13
14namespace component {
15
16class Set;
17
18} /* namespace component */
19
20namespace core {
21
25template < class Derived, class ComponentType, class ComponentName >
27public:
37 static bool used ( const Derived & object, const ComponentType & element );
38
48 static bool available ( const Derived & object, const ComponentType & element );
49
58 static void valid ( const Derived & object, const ComponentType & element );
59};
60
67template < class Derived, class SetComponentType, class ComponentType, class ComponentName >
72 SetComponentType m_data;
73
78 void checkAdd ( const ComponentType & element ) {
79 SetConstraint < Derived, ComponentType, ComponentName >::valid ( static_cast < const Derived & > ( * this ), element );
80
81 if ( ! SetConstraint < Derived, ComponentType, ComponentName >::available ( static_cast < const Derived & > ( * this ), element ) ) {
82 std::string elementTypeName ( ext::to_string < ComponentName > ( ) );
83 throw exception::CommonException ( elementTypeName + " element " + ext::to_string ( element ) + " is not available." );
84 }
85 }
86
91 void checkRemove ( const ComponentType & element ) {
92 if ( SetConstraint < Derived, ComponentType, ComponentName >::used ( static_cast < const Derived & > ( * this ), element ) ) {
93 std::string elementTypeName ( ext::to_string < ComponentName > ( ) );
94 throw exception::CommonException ( elementTypeName + "element " + ext::to_string ( element ) + " is used." );
95 }
96 }
97
98protected:
102 void checkState ( ) {
103 for ( const ComponentType & element : m_data )
104 checkAdd ( element );
105 }
106
107public:
112 SetComponent ( SetComponentType data ) : m_data ( std::move ( data ) ) {
113 }
114
118 SetComponent ( ) = default;
119
127 bool add ( ComponentType element ) {
128 checkAdd ( element );
129 return m_data.insert ( std::move ( element ) ).second;
130 }
131
137 Derived & add ( SetComponentType data ) {
138 for ( ComponentType element : ext::make_mover ( data ) )
139 add ( std::move ( element ) );
140 return static_cast < Derived & > ( * this );
141 }
142
149 Derived & set ( SetComponentType data ) {
150 auto removeCheckLambda = [ this ] ( const auto & value ) {
151 this->checkRemove ( value );
152 };
153
154 auto addCheckLambda = [ this ] ( const auto & value ) {
155 this->checkAdd ( value );
156 };
157
158 ext::set_symmetric_difference ( m_data.begin ( ), m_data.end ( ), data.begin ( ), data.end ( ), ext::make_callback_iterator ( removeCheckLambda ), ext::make_callback_iterator ( addCheckLambda ) );
159
160 m_data = std::move ( data );
161 return static_cast < Derived & > ( * this );
162 }
163
167 SetComponentType & get ( ) {
168 return m_data;
169 }
170
174 const SetComponentType & get ( ) const {
175 return m_data;
176 }
177
184 bool remove ( const ComponentType & element ) {
185 checkRemove ( element );
186 return m_data.erase ( element );
187 }
188
193 Derived & remove ( const SetComponentType & data ) {
194 for ( const ComponentType & element : data )
195 remove ( element );
196 return static_cast < Derived & > ( * this );
197 }
198
203 bool empty ( ) const {
204 return m_data.empty ( );
205 }
206
212 template < class AccessedComponentName >
213 requires std::is_same_v < AccessedComponentName, ComponentName >
215 return static_cast < const Component < Derived, SetComponentType, component::Set, ComponentName > & > ( * this );
216 }
217
223 template < class AccessedComponentName >
224 requires std::is_same_v < AccessedComponentName, ComponentName >
227 }
228
229};
230
231template < class Derived, class ComponentType, class ComponentName >
232class Component < Derived, ComponentType, component::Set, ComponentName > : public SetComponent < Derived, ComponentType, typename ComponentType::value_type, ComponentName > {
233public:
237 Component ( ComponentType data ) : SetComponent < Derived, ComponentType, typename ComponentType::value_type, ComponentName > ( std::move ( data ) ) {
238 }
239
243 Component ( ) = default;
244
248 static void registerComponent ( ) {
249 std::array < std::string, 0 > emptyNames;
250 std::array < std::string, 1 > elementNames = { { "element" } };
251 std::array < std::string, 1 > dataNames = { { "data" } };
252
254 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( getMethod, "get", emptyNames );
255
256 const ComponentType & ( Derived::* constGetMethod ) ( ) const = & SetComponent < Derived, ComponentType, typename ComponentType::value_type, ComponentName >::get;
257 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( constGetMethod, "get", emptyNames );
258
260 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( setMethod, "set", dataNames );
261
262 bool ( Derived::* addElement ) ( typename ComponentType::value_type ) = & SetComponent < Derived, ComponentType, typename ComponentType::value_type, ComponentName >::add;
263 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( addElement, "add", elementNames );
264
266 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( addSet, "add", dataNames );
267
268 bool ( Derived::* removeElement ) ( const typename ComponentType::value_type & ) = & SetComponent < Derived, ComponentType, typename ComponentType::value_type, ComponentName >::remove;
269 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( removeElement, "remove", elementNames );
270
271 Derived & ( Derived::* removeSet ) ( const ComponentType & ) = & SetComponent < Derived, ComponentType, typename ComponentType::value_type, ComponentName >::remove;
272 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( removeSet, "remove", dataNames );
273
275 abstraction::AlgorithmRegistry::registerMethod < ComponentName > ( emptyMethod, "empty", emptyNames );
276 }
277
281 static void unregisterComponent ( ) {
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" );
290 }
291};
292
293} /* namespace core */
294
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
SetComponent()=default
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 &param)
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