RegulatoryElement.cpp
Go to the documentation of this file.
2 
8 
9 namespace lanelet {
10 namespace {
11 class HasIdVisitor : public RuleParameterVisitor {
12  public:
13  explicit HasIdVisitor(Id id) : id_{id} {}
14  void operator()(const ConstPoint3d& p) override { found_ |= p.id() == id_; }
15  void operator()(const ConstLineString3d& l) override { found_ |= l.id() == id_ || utils::has(l, id_); }
16  void operator()(const ConstPolygon3d& p) override { found_ |= p.id() == id_ || utils::has(p, id_); }
17  void operator()(const ConstWeakLanelet& ll) override {
18  if (ll.expired()) {
19  return;
20  }
21  ConstLanelet llet(ll.lock());
22  found_ |= llet.id() == id_ || utils::has(llet, id_);
23  }
24  void operator()(const ConstWeakArea& ar) override {
25  if (ar.expired()) {
26  return;
27  }
28  ConstArea area(ar.lock());
29  found_ |= area.id() == id_ || utils::has(area, id_);
30  }
31  bool operator!() const { return !found_; }
32 
33  private:
35  bool found_{false};
36 };
37 
38 class GetIdVisitor : public RuleParameterVisitor {
39  public:
40  static Id id(const ConstRuleParameter& param) {
41  GetIdVisitor visitor;
42  boost::apply_visitor(visitor, param);
43  return visitor.id_;
44  }
45  template <typename PrimT>
46  void appendID(const PrimT& p) {
47  id_ = p.id();
48  }
49 
50  void operator()(const ConstPoint3d& p) override { appendID(p); }
51  void operator()(const ConstLineString3d& l) override { appendID(l); }
52  void operator()(const ConstPolygon3d& p) override { appendID(p); }
53  void operator()(const ConstWeakLanelet& ll) override {
54  if (!ll.expired()) {
55  appendID(ll.lock());
56  }
57  }
58  void operator()(const ConstWeakArea& ar) override {
59  if (!ar.expired()) {
60  appendID(ar.lock());
61  }
62  }
63 
64  private:
65  Id id_{};
66 };
67 
68 class ToConstVisitor : public RuleParameterVisitor {
69  public:
70  void operator()(const ConstPoint3d& p) override { param_ = p; }
71  void operator()(const ConstLineString3d& l) override { param_ = l; }
72  void operator()(const ConstPolygon3d& p) override { param_ = p; }
73  void operator()(const ConstWeakLanelet& ll) override { param_ = ll; }
74  void operator()(const ConstWeakArea& ar) override { param_ = ar; }
75 
76  ConstRuleParameter apply(const RuleParameter& rule) {
77  boost::apply_visitor(*this, rule);
78  return param_;
79  }
80 
81  private:
83 };
84 
85 } // namespace
86 
88 #if __cplusplus < 201703L
89 constexpr char GenericRegulatoryElement::RuleName[];
90 
91 constexpr const char RoleNameString::Refers[];
92 constexpr const char RoleNameString::RefLine[];
93 constexpr const char RoleNameString::Yield[];
94 constexpr const char RoleNameString::RightOfWay[];
95 constexpr const char RoleNameString::Cancels[];
96 constexpr const char RoleNameString::CancelLine[];
97 
98 // roles not included in fast lookup
99 constexpr const char RoleNameString::Left[];
100 constexpr const char RoleNameString::Right[];
101 constexpr const char RoleNameString::Centerline[];
102 constexpr const char RoleNameString::Inner[];
103 constexpr const char RoleNameString::Outer[];
104 constexpr const char RoleNameString::Lanelet[];
105 constexpr const char RoleNameString::RegulatoryElement[];
106 
107 constexpr char RegulatoryElement::RuleName[];
108 
110 #endif
111 
113 
115  if (ruleName.empty()) {
117  }
118  data->attributes[AttributeNamesString::Subtype] = ruleName;
119  auto& inst = RegulatoryElementFactory::instance();
120  auto it = inst.registry_.find(ruleName);
121  if (it != inst.registry_.end()) {
122  return it->second(data);
123  }
124  throw InvalidInputError("No regulatory element found that implements rule " + ruleName);
125 }
126 
127 std::vector<std::string> RegulatoryElementFactory::availableRules() {
129  return utils::transform(registry, [](const auto& elem) { return elem.first; });
130 }
131 
133  static RegulatoryElementFactory factory;
134  return factory;
135 }
136 
138  ConstRuleParameterMap params;
139  for (const auto& param : parameters()) {
140  params.insert(std::make_pair(
141  param.first, utils::transform(param.second, [](const auto& elem) { return traits::toConst(elem); })));
142  }
143  return params;
144 }
145 
147  for (const auto& elems : parameters()) {
148  visitor.role = elems.first;
149  for (const auto& elem : elems.second) {
150  boost::apply_visitor(visitor, elem);
151  }
152  }
153 }
154 
156  for (const auto& elems : parameters()) {
157  visitor.role = elems.first;
158  for (const auto& elem : elems.second) {
159  boost::apply_visitor(visitor, elem);
160  }
161  }
162 }
163 
164 bool utils::has(const RegulatoryElement& regElem, Id id) {
165  HasIdVisitor hasId(id);
166  regElem.applyVisitor(hasId);
167  return !!hasId;
168 }
169 
170 template <>
172  return ToConstVisitor().apply(primitive);
173 }
174 
175 std::ostream& operator<<(std::ostream& stream, const RegulatoryElement& obj) {
176  stream << "[id: " << obj.id();
177  if (!obj.empty()) {
178  stream << ", parameters: ";
179  for (auto& param : obj.getParameters()) {
180  stream << '{' << param.first << ':' << ' ';
181  for (auto& rule : param.second) {
182  stream << GetIdVisitor::id(rule) << ' ';
183  }
184  stream << '}';
185  }
186  }
187  return stream << ']';
188 }
189 
190 template <>
192  return GetIdVisitor::id(prim);
193 }
194 
195 template <>
197  return GetIdVisitor::id(prim);
198 }
199 
200 } // namespace lanelet
lanelet::RegulatoryElementFactory::registry_
std::map< std::string, FactoryFcn > registry_
Definition: primitives/RegulatoryElement.h:365
lanelet
Definition: Attribute.h:13
Point.h
lanelet::RegulatoryElement::empty
bool empty() const
returns true if this object contains no parameters
Definition: primitives/RegulatoryElement.h:233
lanelet::RegulatoryElementPtr
std::shared_ptr< RegulatoryElement > RegulatoryElementPtr
Definition: Forward.h:192
lanelet::RoleNameString::RoleNamesItem
std::pair< const char *, const RoleName > RoleNamesItem
Definition: primitives/RegulatoryElement.h:82
lanelet::RoleNameString::Inner
static constexpr const char Inner[]
Definition: primitives/RegulatoryElement.h:77
p
BasicPoint p
Definition: LineStringGeometry.cpp:196
lanelet::HybridMap::insert
std::pair< iterator, bool > insert(const value_type &v)
Definition: HybridMap.h:130
lanelet::RegulatoryElementDataPtr
std::shared_ptr< RegulatoryElementData > RegulatoryElementDataPtr
Definition: Forward.h:184
Area.h
lanelet::Id
int64_t Id
Definition: Forward.h:198
lanelet::operator<<
std::ostream & operator<<(std::ostream &stream, const Attribute &obj)
Definition: Attribute.h:369
lanelet::utils::transform
auto transform(Iterator begin, Iterator end, const Func f)
Definition: Utilities.h:176
found_
bool found_
Definition: RegulatoryElement.cpp:35
lanelet::RegulatoryElement::applyVisitor
void applyVisitor(RuleParameterVisitor &visitor) const
applies a visitor to every parameter in the regulatory element
Definition: RegulatoryElement.cpp:146
lanelet::RegulatoryElement
A general rule or limitation for a lanelet (abstract base class)
Definition: primitives/RegulatoryElement.h:174
id
Id id
Definition: LaneletMap.cpp:63
lanelet::RegulatoryElementFactory
Creates regulatory elements based on their type.
Definition: primitives/RegulatoryElement.h:332
lanelet::RuleParameterVisitor::role
std::string role
applyVisitor will set the current role here
Definition: primitives/RegulatoryElement.h:155
id_
Id id_
Definition: RegulatoryElement.cpp:34
lanelet::RoleNameString::Refers
static constexpr const char Refers[]
Definition: primitives/RegulatoryElement.h:66
lanelet::RoleNameString::Centerline
static constexpr const char Centerline[]
Definition: primitives/RegulatoryElement.h:76
lanelet::RegulatoryElement::getParameters
ConstRuleParameterMap getParameters() const
Returns all parameters as const object (coversion overhead for const)
Definition: RegulatoryElement.cpp:137
lanelet::AttributeNamesString::Subtype
static constexpr const char Subtype[]
Definition: Attribute.h:205
lanelet::ConstRuleParameter
boost::variant< ConstPoint3d, ConstLineString3d, ConstPolygon3d, ConstWeakLanelet, ConstWeakArea > ConstRuleParameter
Const-version of the parameters.
Definition: primitives/RegulatoryElement.h:94
lanelet::RoleNameString::Left
static constexpr const char Left[]
Definition: primitives/RegulatoryElement.h:74
lanelet::RoleNameString::Cancels
static constexpr const char Cancels[]
Definition: primitives/RegulatoryElement.h:70
lanelet::RoleNameString::CancelLine
static constexpr const char CancelLine[]
Definition: primitives/RegulatoryElement.h:71
BasicRegulatoryElements.h
lanelet::internal::MutableParameterVisitor::role
std::string role
applyVisitor will set the current role here
Definition: primitives/RegulatoryElement.h:167
lanelet::RegulatoryElementFactory::availableRules
static std::vector< std::string > availableRules()
returns regulatory element names that this factory can handle
Definition: RegulatoryElement.cpp:127
lanelet::RegulatoryElement::~RegulatoryElement
virtual ~RegulatoryElement()
param_
ConstRuleParameter param_
Definition: RegulatoryElement.cpp:82
lanelet::RegulatoryElement::parameters
const RuleParameterMap & parameters() const
Definition: primitives/RegulatoryElement.h:245
lanelet::RoleNameString::Outer
static constexpr const char Outer[]
Definition: primitives/RegulatoryElement.h:78
lanelet::HybridMap
A hybrid map is just like a normal map with keys as string, but elements can also be accessed using a...
Definition: HybridMap.h:67
lanelet::RegisterRegulatoryElement
template class for registering new RegulatoryElements.
Definition: primitives/RegulatoryElement.h:384
lanelet::utils::has
bool has(const ConstArea &ll, Id id)
returns true if element of a regulatory element has a matching Id
Definition: primitives/Area.h:324
lanelet::RoleNameString::Map
static constexpr RoleNamesItem Map[]
Definition: primitives/RegulatoryElement.h:83
lanelet::genRegelem
static RegisterRegulatoryElement< GenericRegulatoryElement > genRegelem
Definition: RegulatoryElement.cpp:87
lanelet::RegulatoryElementFactory::create
static RegulatoryElementPtr create(std::string ruleName, const RegulatoryElementDataPtr &data)
create a regulatory element based on the name of the rule
Definition: RegulatoryElement.cpp:114
RegulatoryElement.h
lanelet::traits::getId< RuleParameter >
Id getId< RuleParameter >(const RuleParameter &prim)
Extracts the id of a rule parameter.
Definition: RegulatoryElement.cpp:191
lanelet::RoleNameString::Right
static constexpr const char Right[]
Definition: primitives/RegulatoryElement.h:75
Lanelet.h
lanelet::GenericRegulatoryElement::RuleName
static constexpr char RuleName[]
Definition: primitives/RegulatoryElement.h:272
lanelet::traits::getId< ConstRuleParameter >
Id getId< ConstRuleParameter >(const ConstRuleParameter &prim)
Definition: RegulatoryElement.cpp:196
lanelet::traits::toConst< RuleParameter >
ConstRuleParameter toConst< RuleParameter >(const RuleParameter &primitive)
Definition: RegulatoryElement.cpp:171
lanelet::RuleParameterVisitor
You can inherit from this visitor to perform an operation on each parameter of a regulatory element.
Definition: primitives/RegulatoryElement.h:147
lanelet::RoleNameString::Yield
static constexpr const char Yield[]
Definition: primitives/RegulatoryElement.h:68
lanelet::RoleNameString::RegulatoryElement
static constexpr const char RegulatoryElement[]
Definition: primitives/RegulatoryElement.h:80
lanelet::RoleNameString::RefLine
static constexpr const char RefLine[]
Definition: primitives/RegulatoryElement.h:67
LineString.h
lanelet::RegulatoryElementFactory::instance
static RegulatoryElementFactory & instance()
Definition: RegulatoryElement.cpp:132
lanelet::RuleParameter
boost::variant< Point3d, LineString3d, Polygon3d, WeakLanelet, WeakArea > RuleParameter
Definition: primitives/RegulatoryElement.h:90
lanelet::ConstPrimitive::id
Id id() const noexcept
get the unique id of this primitive
Definition: Primitive.h:96
lanelet::internal::MutableParameterVisitor
Definition: primitives/RegulatoryElement.h:159
lanelet::RegulatoryElement::RuleName
static constexpr char RuleName[]
Definition: primitives/RegulatoryElement.h:185
lanelet::InvalidInputError
Thrown when a function was called with invalid input arguments.
Definition: Exceptions.h:56
lanelet::RoleNameString::Lanelet
static constexpr const char Lanelet[]
Definition: primitives/RegulatoryElement.h:79
lanelet::RoleNameString::RightOfWay
static constexpr const char RightOfWay[]
Definition: primitives/RegulatoryElement.h:69


lanelet2_core
Author(s): Fabian Poggenhans
autogenerated on Thu Mar 6 2025 03:25:52