18 #ifndef GZ_SIM_SYSTEMS_PHYSICS_ENTITY_FEATURE_MAP_HH_
19 #define GZ_SIM_SYSTEMS_PHYSICS_ENTITY_FEATURE_MAP_HH_
22 #include <type_traits>
23 #include <unordered_map>
25 #include <gz/physics/Entity.hh>
26 #include <gz/physics/FindFeatures.hh>
27 #include <gz/physics/FeatureList.hh>
28 #include <gz/physics/RequestFeatures.hh>
34 inline namespace GZ_SIM_VERSION_NAMESPACE {
35 namespace systems::physics_system
60 template <
template <
typename,
typename>
class PhysicsEntityT,
61 typename PolicyT,
typename RequiredFeatureList,
62 typename... OptionalFeatureLists>
67 public:
template <
typename T>
75 public:
template <
typename T>
77 std::disjunction<std::is_same<T, OptionalFeatureLists>...>;
95 public:
template <
typename ToFeatureList>
104 "Trying to cast to a FeatureList not included in the "
105 "optional FeatureLists of this map.");
112 auto castIt = this->castCache.find(_entity);
113 if (castIt != this->castCache.end())
115 auto castEntity = std::get<ToEntityPtr>(castIt->second.entities);
116 if (
nullptr != castEntity)
123 if (std::get<FailedCast<ToFeatureList>>(castIt->second.failed).value)
129 auto reqEntity = this->Get(_entity);
130 if (
nullptr == reqEntity)
136 auto castEntity = physics::RequestFeatures<ToFeatureList>::From(
139 auto &cached = this->castCache[_entity];
142 std::get<ToEntityPtr>(cached.entities) = castEntity;
146 std::get<FailedCast<ToFeatureList>>(cached.failed).value =
true;
161 public:
template <
typename ToFeatureList>
162 PhysicsEntityPtr<ToFeatureList>
165 auto gzEntity = this->Get(_physicsEntity);
170 return this->EntityCast<ToFeatureList>(gzEntity);
180 auto it = this->entityMap.find(_entity);
181 if (it != this->entityMap.end())
195 auto it = this->reverseMap.find(_physEntity);
196 if (it != this->reverseMap.end())
210 auto it = this->physEntityById.find(_id);
211 if (it != this->physEntityById.end())
224 auto it = this->entityByPhysId.find(_id);
225 if (it != this->entityByPhysId.end())
239 return this->entityMap.find(_entity) != this->entityMap.end();
249 return this->reverseMap.find(_physicsEntity) != this->reverseMap.end();
258 this->entityMap[_entity] = _physicsEntity;
259 this->reverseMap[_physicsEntity] = _entity;
260 this->physEntityById[_physicsEntity->EntityID()] = _physicsEntity;
261 this->entityByPhysId[_physicsEntity->EntityID()] = _entity;
269 auto it = this->entityMap.find(_entity);
270 if (it != this->entityMap.end())
272 this->reverseMap.erase(it->second);
273 this->physEntityById.erase(it->second->EntityID());
274 this->entityByPhysId.erase(it->second->EntityID());
275 this->castCache.erase(_entity);
276 this->entityMap.erase(it);
287 auto it = this->reverseMap.find(_physicsEntity);
288 if (it != this->reverseMap.end())
290 this->entityMap.erase(it->second);
291 this->physEntityById.erase(it->first->EntityID());
292 this->entityByPhysId.erase(it->first->EntityID());
293 this->castCache.erase(it->second);
294 this->reverseMap.erase(it);
305 return this->entityMap;
313 return this->entityMap.size() + this->reverseMap.size() +
314 this->castCache.size() + this->physEntityById.size() +
315 this->entityByPhysId.size();
333 private:
template <
typename T>
341 private:
struct CastCacheEntry
354 template <
template <
typename,
typename>
class PhysicsEntityT,
355 typename RequiredFeatureList,
typename... OptionalFeatureLists>
358 RequiredFeatureList, OptionalFeatureLists...>;