CanonicalLinkModelTracker.hh
Go to the documentation of this file.
1/*
2 * Copyright (C) 2021 Open Source Robotics Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16*/
17#ifndef GZ_SIM_SYSTEMS_PHYSICS_CANONICAL_LINK_MODEL_TRACKER_HH_
18#define GZ_SIM_SYSTEMS_PHYSICS_CANONICAL_LINK_MODEL_TRACKER_HH_
19
20#include <set>
21#include <unordered_map>
22
23#include "gz/sim/Entity.hh"
27#include "gz/sim/config.hh"
28
29namespace gz::sim
30{
31inline namespace GZ_SIM_VERSION_NAMESPACE {
32namespace systems::physics_system
33{
56 {
59 public: void AddNewModels(const EntityComponentManager &_ecm);
60
63 public: void AddAllModels(const EntityComponentManager &_ecm);
64
70 public: const std::set<Entity> &CanonicalLinkModels(
71 const Entity _canonicalLink) const;
72
76 public: void RemoveLink(const Entity &_link);
77
83
86 private: static inline const std::set<Entity> kEmptyModelOrdering{};
87 };
88
89 void CanonicalLinkModelTracker::AddNewModels(
90 const EntityComponentManager &_ecm)
91 {
92 _ecm.EachNew<components::Model, components::ModelCanonicalLink>(
93 [this](const Entity &_model, const components::Model *,
94 const components::ModelCanonicalLink *_canonicalLinkComp)
95 {
96 this->linkModelMap[_canonicalLinkComp->Data()].insert(_model);
97 return true;
98 });
99 }
100 void CanonicalLinkModelTracker::AddAllModels(
101 const EntityComponentManager &_ecm)
102 {
103 _ecm.Each<components::Model, components::ModelCanonicalLink>(
104 [this](const Entity &_model, const components::Model *,
105 const components::ModelCanonicalLink *_canonicalLinkComp)
106 {
107 this->linkModelMap[_canonicalLinkComp->Data()].insert(_model);
108 return true;
109 });
110 }
111
112 const std::set<Entity> &CanonicalLinkModelTracker::CanonicalLinkModels(
113 const Entity _canonicalLink) const
114 {
115 auto it = this->linkModelMap.find(_canonicalLink);
116 if (it != this->linkModelMap.end())
117 return it->second;
118
119 // if an invalid entity was given, it maps to no models
120 return this->kEmptyModelOrdering;
121 }
122
123 void CanonicalLinkModelTracker::RemoveLink(const Entity &_link)
124 {
125 this->linkModelMap.erase(_link);
126 }
127}
128}
129}
130
131#endif