18 class CComposableEntity;
22 #include <argos3/core/utility/datatypes/datatypes.h>
23 #include <argos3/core/utility/configuration/argos_configuration.h>
24 #include <argos3/core/utility/configuration/base_configurable_resource.h>
25 #include <argos3/core/utility/plugins/factory.h>
26 #include <argos3/core/utility/plugins/vtable.h>
32 #if defined(__apple_build_version__ )
34 # if __clang_major__ >= 5
36 # include <unordered_map>
37 using std::unordered_map;
40 # include <tr1/unordered_map>
41 using std::tr1::unordered_map;
45 # include <tr1/unordered_map>
46 using std::tr1::unordered_map;
100 typedef unordered_map<std::string, CEntity*>
TMap;
123 const std::string& str_id);
157 inline const std::string&
GetId()
const {
172 return (m_pcParent != NULL);
206 m_pcParent = &c_parent;
277 template <
typename LABEL,
typename PLUGIN,
typename RETURN_TYPE>
280 template <
typename DERIVED,
typename OPERATION_IMPL>
282 return Dispatch<DERIVED, OPERATION_IMPL>(t_plugin, c_entity);
285 template <
typename DERIVED,
typename OPERATION_IMPL>
288 OPERATION_IMPL& tOperation =
static_cast<OPERATION_IMPL&
>(*this);
290 DERIVED& tDerived =
static_cast<DERIVED&
>(c_entity);
292 return tOperation.ApplyTo(t_plugin, tDerived);
309 template <
typename LABEL,
typename PLUGIN,
typename RETURN_TYPE>
310 class CEntityOperationInstanceHolder {
312 ~CEntityOperationInstanceHolder() {
313 while(!m_vecOperationInstances.empty()) {
314 if(m_vecOperationInstances.back() != NULL) {
315 delete m_vecOperationInstances.back();
317 m_vecOperationInstances.pop_back();
320 template <
typename DERIVED>
321 void Add(CEntityOperation<LABEL, PLUGIN, RETURN_TYPE>* pc_operation) {
323 size_t unIndex = GetTag<DERIVED, CEntity>();
325 if(unIndex >= m_vecOperationInstances.size()) {
330 m_vecOperationInstances.resize(unIndex+1, NULL);
332 m_vecOperationInstances[unIndex] = pc_operation;
334 CEntityOperation<LABEL, PLUGIN, RETURN_TYPE>* operator[](
size_t un_index)
const {
335 if(un_index >= m_vecOperationInstances.size()) {
338 return m_vecOperationInstances[un_index];
341 std::vector<CEntityOperation<LABEL, PLUGIN, RETURN_TYPE>*> m_vecOperationInstances;
351 template <
typename LABEL,
typename PLUGIN,
typename RETURN_VALUE>
352 CEntityOperationInstanceHolder<LABEL, PLUGIN, RETURN_VALUE>& GetEntityOperationInstanceHolder() {
353 static CEntityOperationInstanceHolder<LABEL, PLUGIN, RETURN_VALUE> cHolder;
364 template<
typename LABEL,
typename PLUGIN,
typename RETURN_VALUE>
367 TFunction tFunction = GetVTable<LABEL, CEntity, TFunction>()[c_entity.GetTag()];
368 if(tFunction != NULL) {
370 if(pcOperation != NULL) {
371 return (pcOperation->*tFunction)(t_plugin, c_entity);
374 return RETURN_VALUE();
379 #define REGISTER_ENTITY(CLASSNAME, \
386 REGISTER_SYMBOL(CEntity, \
398 #define REGISTER_ENTITY_OPERATION(LABEL, PLUGIN, OPERATION, RETURN_VALUE, DERIVED) \
399 class C ## LABEL ## PLUGIN ## OPERATION ## RETURN_VALUE ## DERIVED { \
400 typedef RETURN_VALUE (CEntityOperation<LABEL, PLUGIN, RETURN_VALUE>::*TFunction)(PLUGIN&, CEntity&); \
402 C ## LABEL ## PLUGIN ## OPERATION ## RETURN_VALUE ## DERIVED() { \
403 GetVTable<LABEL, CEntity, TFunction>().Add<DERIVED>(&OPERATION::Hook<DERIVED, OPERATION>); \
404 GetEntityOperationInstanceHolder<LABEL, PLUGIN, RETURN_VALUE>().Add<DERIVED>(new OPERATION()); \
406 } c ## LABEL ## PLUGIN ## OPERATION ## RETURN_VALUE ## DERIVED;