LaneletOrArea.h
Go to the documentation of this file.
1 #pragma once
2 #include <boost/variant.hpp>
3 
6 
7 namespace lanelet {
8 
11  public:
12  ConstLaneletOrArea() = default;
13  ConstLaneletOrArea(ConstLaneletOrArea&& rhs) = default;
15  ConstLaneletOrArea(const ConstLaneletOrArea& rhs) = default;
16  ConstLaneletOrArea& operator=(const ConstLaneletOrArea& rhs) = default;
17  ~ConstLaneletOrArea() noexcept = default;
18 
20  : laneletOrArea_{std::move(lanelet)} {}
22  : laneletOrArea_{std::move(area)} {}
24  laneletOrArea_ = std::move(lanelet);
25  return *this;
26  }
28  laneletOrArea_ = std::move(area);
29  return *this;
30  }
31 
33  bool isArea() const { return laneletOrArea_.which() == 1; }
34 
36  bool isLanelet() const { return laneletOrArea_.which() == 0; }
37 
39  explicit operator const ConstLanelet&() const { return boost::get<ConstLanelet>(laneletOrArea_); }
40 
42  explicit operator const ConstArea&() const { return boost::get<ConstArea>(laneletOrArea_); }
43 
45  template <typename VisitorT>
46  decltype(auto) applyVisitor(VisitorT visitor) const {
47  return boost::apply_visitor(visitor, laneletOrArea_);
48  }
49 
51  Id id() const {
52  return applyVisitor([](auto& elem) { return elem.id(); });
53  }
54 
56  const AttributeMap& attributes() const {
57  return applyVisitor([](auto& elem) -> const AttributeMap& { return elem.attributes(); });
58  }
59 
61  return applyVisitor([](auto& elem) { return elem.regulatoryElements(); });
62  }
63 
64  template <typename T>
65  std::vector<std::shared_ptr<const T>> regulatoryElementsAs() const {
66  return applyVisitor([](auto& elem) { return elem.template regulatoryElementsAs<T>(); });
67  }
68 
71  const auto* ll = boost::get<ConstLanelet>(&laneletOrArea_);
72  if (ll != nullptr) {
73  return *ll;
74  }
75  return {};
76  }
77 
80  const auto* ar = boost::get<ConstArea>(&laneletOrArea_);
81  if (ar != nullptr) {
82  return *ar;
83  }
84  return {};
85  }
87  bool equals(const ConstLaneletOrArea& other) const { return laneletOrArea_ == other.laneletOrArea_; }
88 
91  if (isArea()) {
92  return area()->outerBoundPolygon();
93  }
94  return lanelet()->polygon3d();
95  }
96 
97  private:
98  boost::variant<ConstLanelet, ConstArea> laneletOrArea_;
99 };
100 
101 inline bool operator==(const ConstLaneletOrArea& lhs, const ConstLaneletOrArea& rhs) { return lhs.equals(rhs); }
102 inline bool operator!=(const ConstLaneletOrArea& lhs, const ConstLaneletOrArea& rhs) { return !(lhs == rhs); }
103 
104 inline std::ostream& operator<<(std::ostream& stream, const ConstLaneletOrArea& obj) {
105  if (obj.isArea()) {
106  stream << *obj.area();
107  }
108  if (obj.isLanelet()) {
109  stream << *obj.lanelet();
110  }
111  return stream;
112 }
113 
114 namespace utils {
116  ConstLanelets lanelets;
117  lanelets.reserve(lars.size());
118  for (const auto& lar : lars) {
119  if (lar.isLanelet()) {
120  lanelets.push_back(static_cast<const ConstLanelet&>(lar));
121  }
122  };
123  return lanelets;
124 }
126  ConstAreas lanelets;
127  lanelets.reserve(lars.size());
128  for (const auto& lar : lars) {
129  if (lar.isArea()) {
130  lanelets.push_back(static_cast<const ConstArea&>(lar));
131  }
132  };
133  return lanelets;
134 }
135 } // namespace utils
136 
137 } // namespace lanelet
138 
139 // Hash function for usage in containers
140 namespace std {
141 template <>
142 struct hash<lanelet::ConstLaneletOrArea> : public lanelet::HashBase<lanelet::ConstLaneletOrArea> {};
143 
144 } // namespace std
Optional< ConstLanelet > lanelet() const
return the managed lanelet
Definition: LaneletOrArea.h:70
An object that can either refer to a lanelet or an area.
Definition: LaneletOrArea.h:10
bool equals(const ConstLaneletOrArea &other) const
compares this lanelet or area
Definition: LaneletOrArea.h:87
std::vector< ConstLaneletOrArea > ConstLaneletOrAreas
Definition: Forward.h:138
ConstLaneletOrArea(ConstLanelet lanelet)
Definition: LaneletOrArea.h:19
ConstLaneletOrArea & operator=(ConstArea area)
Definition: LaneletOrArea.h:27
int64_t Id
Definition: Forward.h:198
Id id() const
get the id of the lanelet or area
Definition: LaneletOrArea.h:51
std::ostream & operator<<(std::ostream &stream, const Attribute &obj)
Definition: Attribute.h:369
Optional< ConstArea > area() const
get the managed area
Definition: LaneletOrArea.h:79
bool operator==(const Attribute &lhs, const Attribute &rhs)
Definition: Attribute.h:179
ConstLaneletOrArea(ConstArea area)
Definition: LaneletOrArea.h:21
ConstLaneletOrArea & operator=(ConstLaneletOrArea &&rhs)=default
~ConstLaneletOrArea() noexcept=default
CompoundPolygon3d boundingPolygon() const
returns the outer bound if it is an area or the polygon made of the lanelet bounds if it&#39;s a lanelet ...
Definition: LaneletOrArea.h:90
Combines multiple linestrings to one polygon in 3d.
boost::optional< T > Optional
Definition: Optional.h:7
bool operator!=(const Attribute &lhs, const Attribute &rhs)
Definition: Attribute.h:180
ConstLanelets getAllLanelets(const ConstLaneletOrAreas &lars)
boost::variant< ConstLanelet, ConstArea > laneletOrArea_
Definition: LaneletOrArea.h:98
An immutable lanelet.
std::vector< std::shared_ptr< const T > > regulatoryElementsAs() const
Definition: LaneletOrArea.h:65
bool isArea() const
true if this object holds an area
Definition: LaneletOrArea.h:33
std::vector< RegulatoryElementConstPtr > RegulatoryElementConstPtrs
Definition: Forward.h:195
bool isLanelet() const
true if this objct holds a lanelet
Definition: LaneletOrArea.h:36
decltype(auto) applyVisitor(VisitorT visitor) const
apply a generic visitor
Definition: LaneletOrArea.h:46
ConstLaneletOrArea & operator=(ConstLanelet lanelet)
Definition: LaneletOrArea.h:23
A const (i.e. immutable) Area.
RegulatoryElementConstPtrs regulatoryElements() const
Definition: LaneletOrArea.h:60
ConstAreas getAllAreas(const ConstLaneletOrAreas &lars)
std::vector< ConstArea > ConstAreas
Definition: Forward.h:126
const AttributeMap & attributes() const
get the attributes of the lanelet or area
Definition: LaneletOrArea.h:56
std::vector< ConstLanelet > ConstLanelets
Definition: Forward.h:114


lanelet2_core
Author(s): Fabian Poggenhans
autogenerated on Tue Jun 6 2023 02:23:32