33#ifndef DART_COMMON_DETAIL_COMPOSITEDATA_HPP_
34#define DART_COMMON_DETAIL_COMPOSITEDATA_HPP_
39#include <unordered_set>
52template <
class AspectOrComposite,
bool isAspect>
55 using Type = AspectOrComposite;
61template <
class AspectOrComposite>
72 using Type =
typename AspectOrComposite::Aspect;
76template <
class AspectT>
85template <
class AspectT>
92template <
class AspectT>
100 = std::map<std::type_index, std::unique_ptr<Aspect::State>>;
102 = std::map<std::type_index, std::unique_ptr<Aspect::Properties>>;
105template <
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;
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;
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>
154 using Data =
typename GetData<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);
216 typename... Remainder>
218 :
public GetData<AspectT>::Type,
219 public ComposeData<CompositeType, GetData, Remainder...>
228 using Base =
typename GetData<AspectT>::Type;
229 using Data =
typename Base::Data;
232 template <
typename Arg>
235 using Type =
typename std::conditional<
236 std::is_base_of<typename Base::Data, Arg>::value,
241 template <
typename Arg>
242 struct ConvertIfComposite
244 using Type =
typename std::conditional<
245 std::is_base_of<CompositeType, Arg>::value,
251 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
259 template <typename Arg1, typename... Args>
263 static_cast<const typename ConvertIfData<Arg1>::Type&>(arg1),
271 :
ComposeData<CompositeType, GetData, Remainder...>(composite)
273 _setBaseFrom(composite);
276 template <
typename... Aspects>
278 :
ComposeData(static_cast<const CompositeType&>(composite))
289 :
ComposeData(static_cast<const CompositeType&>(composite))
294 operator CompositeType()
const
296 CompositeType composite;
304 _setBaseFrom(composite);
318 template <
typename... Args>
325 template <
typename... Args>
327 :
ComposeData<CompositeType, GetData, Remainder...>(args...)
332 template <
typename... Args>
334 :
Base(arg1),
ComposeData<CompositeType, GetData, Remainder...>(args...)
341 const Base* data = composite.template get<AspectType>();
343 static_cast<Base&
>(*this) = *data;
348 composite.template create<AspectType>(
static_cast<const Base&
>(*
this));
357 template <
typename Arg1,
typename... Args>
364 template <
typename Arg>
372 static_cast<Base&
>(*this) = data;
377 _setBaseFrom(composite);
382template <
typename... Aspects>
385template <
typename... Data>
#define DART_DEFINE_ALIGNED_SHARED_OBJECT_CREATOR(class_name)
Definition Memory.hpp:153
std::string type
Definition SdfParser.cpp:82
MapHolder is a templated wrapper class that is used to allow maps of Aspect::State and Aspect::Proper...
Definition Cloneable.hpp:221
MapType mMap
A map containing the collection of States for the Aspect.
Definition Cloneable.hpp:280
Definition CompositeData.hpp:187
ComposeData(const CompositeType &)
Definition CompositeData.hpp:191
void _addData(CompositeType &) const
Definition CompositeData.hpp:204
virtual ~ComposeData()=default
void setFrom(const CompositeType &)
Definition CompositeData.hpp:198
Definition CompositeData.hpp:107
bool has() const
Definition CompositeData.hpp:169
GetData< AspectT >::Type & create(Args &&... args)
Create (or replace) a piece of data in this.
Definition CompositeData.hpp:121
virtual ~CompositeData()=default
const GetData< AspectT >::Type * get() const
Definition CompositeData.hpp:146
GetData< AspectT >::Type & getOrCreate(Args &&... args)
Definition CompositeData.hpp:152
CompositeData(Args &&... args)
Forwarding constructor.
Definition CompositeData.hpp:111
GetData< AspectT >::Type * get()
Definition CompositeData.hpp:133
CompositeData< CompositeStateMap, GetState > CompositeState
Definition CompositeData.hpp:176
std::map< std::type_index, std::unique_ptr< Aspect::State > > CompositeStateMap
Definition CompositeData.hpp:100
std::map< std::type_index, std::unique_ptr< Aspect::Properties > > CompositePropertiesMap
Definition CompositeData.hpp:102
CompositeData< CompositePropertiesMap, GetProperties > CompositeProperties
Definition CompositeData.hpp:178
Definition BulletCollisionDetector.cpp:60
Definition SharedLibraryManager.hpp:46
typename std::conditional< std::is_base_of< CompositeType, Arg >::value, CompositeType, Arg >::type Type
Definition CompositeData.hpp:247
typename std::conditional< std::is_base_of< typename Base::Data, Arg >::value, typename Base::Data, Arg >::type Type
Definition CompositeData.hpp:238
Definition CompositeData.hpp:220
ComposeData & operator=(const CompositeType &composite)
Definition CompositeData.hpp:308
void _addData(CompositeType &composite) const
Definition CompositeData.hpp:346
typename GetData< AspectT >::Type Base
Definition CompositeData.hpp:228
void _setBaseFrom(const CompositeType &composite)
Definition CompositeData.hpp:339
ComposeData(DelegateTag, const Args &... args)
Definition CompositeData.hpp:326
void copy(const Args &... args)
Grab any relevant data and copy it into this composite.
Definition CompositeData.hpp:319
void _attemptToUse(const Arg &)
Definition CompositeData.hpp:365
void _attemptToUse(const CompositeType &composite)
Definition CompositeData.hpp:375
void _findData(const Arg1 &arg1, const Args &... args)
Definition CompositeData.hpp:358
void setFrom(const CompositeType &composite)
Definition CompositeData.hpp:302
ComposeData(DelegateTag, const Data &arg1, const Args &... args)
Definition CompositeData.hpp:333
DelegateTag
Definition CompositeData.hpp:223
void _attemptToUse(const typename Base::Data &data)
Definition CompositeData.hpp:370
ComposeData(const ComposeData< CompositeType, GetData, Aspects... > &composite)
Definition CompositeData.hpp:277
void _findData()
Definition CompositeData.hpp:352
ComposeData(CompositeType &&composite)
Definition CompositeData.hpp:288
typename GetAspect< AspectT >::Type AspectType
Definition CompositeData.hpp:230
typename Base::Data Data
Definition CompositeData.hpp:229
ComposeData(const CompositeType &composite)
Grab relevant data out of a composite object.
Definition CompositeData.hpp:270
typename AspectOrComposite::Aspect Type
Definition CompositeData.hpp:72
Definition CompositeData.hpp:54
AspectOrComposite Type
Definition CompositeData.hpp:55
Definition CompositeData.hpp:78
typename GetAspectImpl< AspectT, std::is_base_of< Aspect, AspectT >::value >::Type Type
Definition CompositeData.hpp:81
Definition CompositeData.hpp:94
typename GetAspect< AspectT >::Type::Properties Type
Definition CompositeData.hpp:95
Definition CompositeData.hpp:87
typename GetAspect< AspectT >::Type::State Type
Definition CompositeData.hpp:88