33 #ifndef DART_COMMON_DETAIL_COMPOSITEDATA_HPP_ 34 #define DART_COMMON_DETAIL_COMPOSITEDATA_HPP_ 41 #include <unordered_set> 43 #include "dart/common/Aspect.hpp" 52 template <
class AspectOrComposite,
bool isAspect>
55 using Type = AspectOrComposite;
61 template <
class AspectOrComposite>
72 using Type =
typename AspectOrComposite::Aspect;
76 template <
class AspectT>
85 template <
class AspectT>
92 template <
class AspectT>
99 using CompositeStateMap
100 = std::map<std::type_index, std::unique_ptr<Aspect::State>>;
101 using CompositePropertiesMap
102 = std::map<std::type_index, std::unique_ptr<Aspect::Properties>>;
105 template <
typename MapType,
template <
class>
class GetData>
110 template <
typename... Args>
120 template <
class AspectT,
typename... Args>
121 typename GetData<AspectT>::Type&
create(Args&&... args)
123 using Data =
typename GetData<AspectT>::Type;
124 using AspectType =
typename GetAspect<AspectT>::Type;
125 using DataType =
typename GetData<Aspect>::Type;
127 std::unique_ptr<DataType>& data = this->mMap[
typeid(AspectType)]
128 = std::make_unique<Data>(std::forward<Args>(args)...);
129 return static_cast<Data&
>(*data);
132 template <
class AspectT>
133 typename GetData<AspectT>::Type*
get()
135 using Data =
typename GetData<AspectT>::Type;
136 using AspectType =
typename GetAspect<AspectT>::Type;
138 typename MapType::iterator it = this->mMap.find(
typeid(AspectType));
139 if (this->mMap.end() == it)
142 return static_cast<Data*
>(it->second.get());
145 template <
class AspectT>
146 const typename GetData<AspectT>::Type*
get()
const 151 template <
class AspectT,
typename... Args>
152 typename GetData<AspectT>::Type& getOrCreate(Args&&... args)
154 using Data =
typename GetData<AspectT>::Type;
155 using AspectType =
typename GetAspect<AspectT>::Type;
157 auto& it = this->mMap.insert(
158 std::make_pair<std::type_index, std::unique_ptr<Data>>(
159 typeid(AspectType),
nullptr));
161 const bool exists = !it.second;
163 it.first = std::make_unique<Data>(std::forward<Args>(args)...);
165 return static_cast<Data&
>(*it.first);
168 template <
class AspectT>
171 return (get<AspectT>() !=
nullptr);
183 template <
class>
class GetData,
197 void setFrom(
const CompositeType&)
203 void _addData(CompositeType&)
const 212 template <
class>
class GetData,
214 typename... Remainder>
216 :
public GetData<AspectT>::Type,
217 public ComposeData<CompositeType, GetData, Remainder...>
226 using Base =
typename GetData<AspectT>::Type;
227 using Data =
typename Base::Data;
228 using AspectType =
typename GetAspect<AspectT>::Type;
230 template <
typename Arg>
233 using Type =
typename std::conditional<
234 std::is_base_of<typename Base::Data, Arg>::value,
239 template <
typename Arg>
240 struct ConvertIfComposite
242 using Type =
typename std::conditional<
243 std::is_base_of<CompositeType, Arg>::value,
249 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
251 DART_DEFINE_ALIGNED_SHARED_OBJECT_CREATOR(
ThisClass)
257 template <
typename Arg1,
typename... Args>
261 static_cast<const typename ConvertIfData<Arg1>::Type&
>(arg1),
269 : ComposeData<CompositeType, GetData, Remainder...>(composite)
271 _setBaseFrom(composite);
274 template <
typename... Aspects>
276 : ComposeData(static_cast<const CompositeType&>(composite))
286 ComposeData(CompositeType&& composite)
287 : ComposeData(static_cast<const CompositeType&>(composite))
292 operator CompositeType()
const 294 CompositeType composite;
300 void setFrom(
const CompositeType& composite)
302 _setBaseFrom(composite);
306 ComposeData& operator=(
const CompositeType& composite)
316 template <
typename... Args>
323 template <
typename... Args>
324 ComposeData(DelegateTag,
const Args&... args)
325 : ComposeData<CompositeType, GetData, Remainder...>(args...)
330 template <
typename... Args>
331 ComposeData(DelegateTag,
const Data& arg1,
const Args&... args)
332 : Base(arg1), ComposeData<CompositeType, GetData, Remainder...>(args...)
337 void _setBaseFrom(
const CompositeType& composite)
339 const Base* data = composite.template get<AspectType>();
341 static_cast<Base&
>(*this) = *data;
344 void _addData(CompositeType& composite)
const 346 composite.template create<AspectType>(
static_cast<const Base&
>(*this));
355 template <
typename Arg1,
typename... Args>
356 void _findData(
const Arg1& arg1,
const Args&... args)
358 _attemptToUse(
static_cast<const typename ConvertIfData<Arg1>::Type&
>(arg1));
362 template <
typename Arg>
363 void _attemptToUse(
const Arg&)
368 void _attemptToUse(
const typename Base::Data& data)
370 static_cast<Base&
>(*this) = data;
373 void _attemptToUse(
const CompositeType& composite)
375 _setBaseFrom(composite);
380 template <
typename... Aspects>
383 template <
typename... Data>
391 #endif // DART_COMMON_DETAIL_COMPOSITEDATA_HPP_ Definition: CompositeData.hpp:215
CompositeData(Args &&... args)
Forwarding constructor.
Definition: CompositeData.hpp:111
GetData< AspectT >::Type & create(Args &&... args)
Create (or replace) a piece of data in this.
Definition: CompositeData.hpp:121
Definition: CompositeData.hpp:106
Definition: CompositeData.hpp:77
Definition: CompositeData.hpp:93
Definition: SharedLibraryManager.hpp:46
Definition: Aspect.cpp:40
void copy(const Args &... args)
Grab any relevant data and copy it into this composite.
Definition: CompositeData.hpp:317
Definition: CompositeData.hpp:53
MapHolder is a templated wrapper class that is used to allow maps of Aspect::State and Aspect::Proper...
Definition: Cloneable.hpp:220
Definition: CompositeData.hpp:185
Definition: CompositeData.hpp:86
ComposeData(const CompositeType &composite)
Grab relevant data out of a composite object.
Definition: CompositeData.hpp:268