Attribute.cpp
Go to the documentation of this file.
2 
3 #include <boost/lexical_cast.hpp>
4 #include <boost/variant/get.hpp>
5 #include <regex>
6 
9 
10 namespace lanelet {
11 namespace {
12 Optional<Velocity> getUnit(const std::string& value, size_t pos) {
13  using namespace units::literals;
14  if (pos >= value.size()) {
15  return 1._kmh;
16  }
17  auto unit = value.substr(pos);
18  const auto flags = std::regex::ECMAScript;
19  // try to match unit
20  if (std::regex_search(unit, std::regex("\\s*(m/s)|(mps)", flags))) {
21  return 1_mps;
22  }
23  if (std::regex_search(unit, std::regex("\\s*(km/h)|(kmh)", flags))) {
24  return 1_kmh;
25  }
26  if (std::regex_search(unit, std::regex("\\s*(m/h)|(mph)", flags))) {
27  return 1_mph;
28  }
29  return {};
30 }
31 
32 template <typename T>
33 T store(std::shared_ptr<Attribute::Cache>& cache, T&& value) {
34  auto newCache = std::make_shared<Attribute::Cache>(value);
35  std::atomic_store_explicit(&cache, newCache, std::memory_order_release);
36  return value;
37 }
38 
39 template <typename T>
40 T* load(const std::shared_ptr<Attribute::Cache>& cache) {
41  auto c = std::atomic_load_explicit(&cache, std::memory_order_acquire);
42  if (!c) {
43  return nullptr;
44  }
45  return boost::get<T>(&*cache);
46 }
47 } // namespace
48 
49 Attribute::Attribute(Id value) : value_(std::to_string(value)) { store(cache_, value); }
50 
51 Attribute::Attribute(bool value) : value_(std::to_string(int(value))) { store(cache_, value); }
52 
53 Attribute::Attribute(int value) : value_(std::to_string(value)) { store(cache_, value); }
54 
55 Attribute::Attribute(double value) : value_(std::to_string(value)) { store(cache_, value); }
56 
57 Attribute::Attribute(const Velocity& value) : value_{std::to_string(units::KmHQuantity(value).value())} {
58  store(cache_, value);
59 }
60 
62  // try load from cache
63  auto* val = load<bool>(cache_);
64  if (val != nullptr) {
65  return *val;
66  }
67  // need to compute value
68  try {
69  return boost::lexical_cast<bool>(value());
70  } catch (boost::bad_lexical_cast&) {
71  if (value() == "true" || value() == "yes") {
72  return store(cache_, true);
73  }
74  if (value() == "false" || value() == "no") {
75  return store(cache_, false);
76  }
77  return {};
78  }
79 }
80 
82  // try load from cache
83  auto* val = load<double>(cache_);
84  if (val != nullptr) {
85  return *val;
86  }
87  // need to compute value
88  try {
89  return store(cache_, boost::lexical_cast<double>(value()));
90  } catch (boost::bad_lexical_cast&) {
91  return {};
92  }
93 }
94 
96  // try load from cache
97  auto* val = load<Id>(cache_);
98  if (val != nullptr) {
99  return *val;
100  }
101  // need to compute value
102  try {
103  return store(cache_, boost::lexical_cast<Id>(value()));
104  } catch (boost::bad_lexical_cast&) {
105  return {};
106  }
107 }
108 
110  // try load from cache
111  auto* val = load<int>(cache_);
112  if (val != nullptr) {
113  return *val;
114  }
115  // need to compute value
116  try {
117  return store(cache_, boost::lexical_cast<int>(value()));
118  } catch (boost::bad_lexical_cast&) {
119  return {};
120  }
121 }
122 
124  // try load from cache
125  auto* val = load<Velocity>(cache_);
126  if (val != nullptr) {
127  return *val;
128  }
129  // need to compute value
130  auto asD = asDouble();
131  if (asD) {
132  // we assume kmh by default
133  return store(cache_, Velocity(*asD * units::KmH()));
134  }
135  // try to extract a unit (assuming something like "2 mps")
136  try {
137  size_t idx = 0;
138  const auto velocity = std::stod(value(), &idx);
139  auto unit = getUnit(value(), idx);
140  if (unit) {
141  return store(cache_, velocity * *unit);
142  }
143  } catch (std::exception&) {
144  }
145  // ok, give up
146  return {};
147 }
148 
149 void Attribute::setValue(const std::string& value) {
150  std::atomic_store_explicit(&cache_, std::shared_ptr<Cache>(), std::memory_order_release);
151  this->value_ = value;
152 }
153 
154 #if __cplusplus < 201703L
155 // see https://regexr.com/3knio
156 // lanelet types
157 constexpr const char AttributeValueString::Node[];
158 constexpr const char AttributeValueString::Way[];
159 constexpr const char AttributeValueString::Relation[];
160 constexpr const char AttributeValueString::Lanelet[];
161 constexpr const char AttributeValueString::RegulatoryElement[];
162 constexpr const char AttributeValueString::Multipolygon[];
163 
164 // line types
165 constexpr const char AttributeValueString::LineThick[];
166 constexpr const char AttributeValueString::LineThin[];
167 constexpr const char AttributeValueString::Curbstone[];
168 constexpr const char AttributeValueString::GuardRail[];
169 constexpr const char AttributeValueString::RoadBorder[];
170 constexpr const char AttributeValueString::Wall[];
171 constexpr const char AttributeValueString::Fence[];
172 constexpr const char AttributeValueString::Zebra[];
173 constexpr const char AttributeValueString::PedestrianMarking[];
174 constexpr const char AttributeValueString::BikeMarking[];
175 constexpr const char AttributeValueString::Keepout[];
176 constexpr const char AttributeValueString::StopLine[];
177 constexpr const char AttributeValueString::Virtual[];
178 constexpr const char AttributeValueString::Visualization[];
179 constexpr const char AttributeValueString::ZigZag[];
180 constexpr const char AttributeValueString::LiftGate[];
181 constexpr const char AttributeValueString::JerseyBarrier[];
182 constexpr const char AttributeValueString::Gate[];
183 constexpr const char AttributeValueString::Door[];
184 constexpr const char AttributeValueString::Trajectory[];
185 constexpr const char AttributeValueString::Rail[];
186 constexpr const char AttributeValueString::Bump[];
187 
188 // line subtypes
189 constexpr const char AttributeValueString::Solid[];
190 constexpr const char AttributeValueString::Dashed[];
191 constexpr const char AttributeValueString::DashedSolid[];
192 constexpr const char AttributeValueString::SolidDashed[];
193 constexpr const char AttributeValueString::SolidSolid[];
194 constexpr const char AttributeValueString::Straight[];
195 constexpr const char AttributeValueString::Left[];
196 constexpr const char AttributeValueString::Right[];
197 constexpr const char AttributeValueString::StraightLeft[];
198 constexpr const char AttributeValueString::StraightRight[];
199 constexpr const char AttributeValueString::LeftRight[];
200 constexpr const char AttributeValueString::High[];
201 constexpr const char AttributeValueString::Low[];
202 
203 // Node types
204 constexpr const char AttributeValueString::Arrow[];
205 constexpr const char AttributeValueString::Pole[];
206 constexpr const char AttributeValueString::Post[];
207 constexpr const char AttributeValueString::Symbol[];
208 constexpr const char AttributeValueString::Start[];
209 constexpr const char AttributeValueString::End[];
210 constexpr const char AttributeValueString::Dot[];
211 
212 // Color / traffic light types
213 constexpr const char AttributeValueString::RedYellowGreen[];
214 constexpr const char AttributeValueString::RedGreen[];
215 constexpr const char AttributeValueString::RedYellow[];
216 constexpr const char AttributeValueString::Red[];
217 constexpr const char AttributeValueString::Yellow[];
218 constexpr const char AttributeValueString::White[];
219 
220 // Lanelet types
221 constexpr const char AttributeValueString::Road[];
222 constexpr const char AttributeValueString::Highway[];
223 constexpr const char AttributeValueString::PlayStreet[];
224 constexpr const char AttributeValueString::BusLane[];
225 constexpr const char AttributeValueString::EmergencyLane[];
226 constexpr const char AttributeValueString::BicycleLane[];
227 constexpr const char AttributeValueString::Walkway[];
228 constexpr const char AttributeValueString::SharedWalkway[];
229 constexpr const char AttributeValueString::Crosswalk[];
230 constexpr const char AttributeValueString::Stairs[];
231 
232 // Lanelet location tag
233 constexpr const char AttributeValueString::Nonurban[];
234 constexpr const char AttributeValueString::Urban[];
235 constexpr const char AttributeValueString::Private[];
236 
237 // Area types
238 constexpr const char AttributeValueString::Parking[];
239 constexpr const char AttributeValueString::Freespace[];
240 constexpr const char AttributeValueString::Vegetation[];
241 constexpr const char AttributeValueString::Building[];
242 constexpr const char AttributeValueString::TrafficIsland[];
243 constexpr const char AttributeValueString::Exit[];
244 
245 // Regulatory elements
246 constexpr const char AttributeValueString::TrafficLight[];
247 constexpr const char AttributeValueString::TrafficSign[];
248 constexpr const char AttributeValueString::SpeedLimit[];
249 constexpr const char AttributeValueString::RightOfWay[];
250 constexpr const char AttributeValueString::AllWayStop[];
251 
252 // other
253 constexpr const char AttributeNamesString::Type[];
254 constexpr const char AttributeNamesString::Subtype[];
255 constexpr const char AttributeNamesString::OneWay[];
256 constexpr const char AttributeNamesString::ParticipantVehicle[];
257 constexpr const char AttributeNamesString::ParticipantPedestrian[];
258 constexpr const char AttributeNamesString::SpeedLimit[];
259 constexpr const char AttributeNamesString::Location[];
260 constexpr const char AttributeNamesString::Dynamic[];
261 constexpr const char AttributeNamesString::Color[];
262 
263 // attributes not used in fast lookup
264 // on points
265 constexpr const char AttributeNamesString::Ele[];
266 
267 // on linestrings
268 constexpr const char AttributeNamesString::LaneChange[];
269 constexpr const char AttributeNamesString::LaneChangeLeft[];
270 constexpr const char AttributeNamesString::LaneChangeRight[];
271 constexpr const char AttributeNamesString::Name[];
272 constexpr const char AttributeNamesString::Region[];
273 
274 // on lanelets/areas
275 constexpr const char AttributeNamesString::SpeedLimitMandatory[];
276 constexpr const char AttributeNamesString::Area[];
277 constexpr const char AttributeNamesString::Participant[];
278 constexpr const char AttributeNamesString::Fallback[];
279 constexpr const char AttributeNamesString::Width[];
280 constexpr const char AttributeNamesString::Height[];
281 constexpr const char AttributeNamesString::Temporary[];
282 
283 // on regulatory elements
284 constexpr const char AttributeNamesString::SignType[];
285 
286 // participants
287 constexpr const char Participants::Vehicle[];
288 constexpr const char Participants::VehicleBus[];
289 constexpr const char Participants::VehicleCar[];
290 constexpr const char Participants::VehicleCarElectric[];
291 constexpr const char Participants::VehicleCarCombustion[];
292 constexpr const char Participants::VehicleTruck[];
293 constexpr const char Participants::VehicleMotorcycle[];
294 constexpr const char Participants::VehicleTaxi[];
295 constexpr const char Participants::VehicleEmergency[];
296 constexpr const char Participants::Pedestrian[];
297 constexpr const char Participants::Bicycle[];
298 constexpr const char Participants::Train[];
299 
301 #endif
302 } // namespace lanelet
static constexpr const char PedestrianMarking[]
Definition: Attribute.h:289
static constexpr AttributeNamesItem Map[]
Definition: Attribute.h:237
static constexpr const char SpeedLimitMandatory[]
Definition: Attribute.h:226
static constexpr const char End[]
Definition: Attribute.h:325
static constexpr const char RedYellowGreen[]
Definition: Attribute.h:329
static constexpr const char RedGreen[]
Definition: Attribute.h:330
static constexpr const char Stairs[]
Definition: Attribute.h:346
static constexpr const char ParticipantVehicle[]
Definition: Attribute.h:207
Optional< bool > asBool() const
interpret this attribute as bool value
Definition: Attribute.cpp:61
static constexpr const char ZigZag[]
Definition: Attribute.h:295
static constexpr const char Symbol[]
Definition: Attribute.h:323
static constexpr const char Gate[]
Definition: Attribute.h:298
static constexpr const char Fallback[]
Definition: Attribute.h:229
static constexpr const char Road[]
Definition: Attribute.h:337
static constexpr const char Nonurban[]
Definition: Attribute.h:349
static constexpr const char Vehicle[]
Definition: Attribute.h:253
static constexpr const char Location[]
Definition: Attribute.h:210
static constexpr const char Region[]
Definition: Attribute.h:223
static constexpr const char LineThick[]
Definition: Attribute.h:281
static constexpr const char Area[]
Definition: Attribute.h:228
static constexpr const char Arrow[]
Definition: Attribute.h:320
static constexpr const char Curbstone[]
Definition: Attribute.h:283
static constexpr const char Trajectory[]
Definition: Attribute.h:300
static constexpr const char BikeMarking[]
Definition: Attribute.h:290
static constexpr const char Height[]
Definition: Attribute.h:231
static constexpr const char Low[]
Definition: Attribute.h:317
static constexpr const char LaneChangeLeft[]
Definition: Attribute.h:220
static constexpr const char Lanelet[]
Definition: Attribute.h:276
static constexpr const char LineThin[]
Definition: Attribute.h:282
static constexpr const char BusLane[]
Definition: Attribute.h:341
static constexpr const char GuardRail[]
Definition: Attribute.h:284
int64_t Id
Definition: Forward.h:198
static constexpr const char RedYellow[]
Definition: Attribute.h:331
boost::units::divide_typeof_helper< Km, Hour >::type KmH
Definition: Units.h:19
const std::string & value() const
gets the value of this attribute
Definition: Attribute.h:96
static constexpr const char Walkway[]
Definition: Attribute.h:343
static constexpr const char SolidSolid[]
Definition: Attribute.h:309
static constexpr const char StraightRight[]
Definition: Attribute.h:314
static constexpr const char Relation[]
Definition: Attribute.h:275
static constexpr const char Multipolygon[]
Definition: Attribute.h:278
static constexpr const char VehicleCar[]
Definition: Attribute.h:255
static constexpr const char Pole[]
Definition: Attribute.h:321
static constexpr const char Dot[]
Definition: Attribute.h:326
static constexpr const char SpeedLimit[]
Definition: Attribute.h:364
static constexpr const char BicycleLane[]
Definition: Attribute.h:342
static constexpr const char Highway[]
Definition: Attribute.h:338
static constexpr const char Start[]
Definition: Attribute.h:324
static constexpr const char Red[]
Definition: Attribute.h:332
static constexpr const char LeftRight[]
Definition: Attribute.h:315
static constexpr const char StopLine[]
Definition: Attribute.h:292
static constexpr const char Freespace[]
Definition: Attribute.h:355
static constexpr const char Train[]
Definition: Attribute.h:264
static constexpr const char Participant[]
Definition: Attribute.h:227
static constexpr const char Fence[]
Definition: Attribute.h:287
static constexpr const char RegulatoryElement[]
Definition: Attribute.h:277
static constexpr const char Node[]
Definition: Attribute.h:273
static constexpr const char Pedestrian[]
Definition: Attribute.h:262
static constexpr const char Solid[]
Definition: Attribute.h:305
static constexpr const char VehicleMotorcycle[]
Definition: Attribute.h:259
static constexpr const char Right[]
Definition: Attribute.h:312
static constexpr const char SharedWalkway[]
Definition: Attribute.h:344
static constexpr const char TrafficLight[]
Definition: Attribute.h:362
static constexpr const char Bump[]
Definition: Attribute.h:302
static constexpr const char White[]
Definition: Attribute.h:334
static constexpr const char Type[]
Definition: Attribute.h:204
boost::optional< T > Optional
Definition: Optional.h:7
static constexpr const char PlayStreet[]
Definition: Attribute.h:339
void setValue(const std::string &value)
set the value of this attribute
Definition: Attribute.cpp:149
Optional< Velocity > asVelocity() const
interpret this attribute as Velocity
Definition: Attribute.cpp:123
static constexpr const char Bicycle[]
Definition: Attribute.h:263
static constexpr const char ParticipantPedestrian[]
Definition: Attribute.h:208
static constexpr const char StraightLeft[]
Definition: Attribute.h:313
static constexpr const char Private[]
Definition: Attribute.h:351
static constexpr const char Left[]
Definition: Attribute.h:311
static constexpr const char Post[]
Definition: Attribute.h:322
static constexpr const char VehicleTruck[]
Definition: Attribute.h:258
static constexpr const char RoadBorder[]
Definition: Attribute.h:285
static constexpr const char VehicleCarElectric[]
Definition: Attribute.h:256
static constexpr const char Width[]
Definition: Attribute.h:230
static constexpr const char TrafficIsland[]
Definition: Attribute.h:358
static constexpr const char TrafficSign[]
Definition: Attribute.h:363
std::shared_ptr< Cache > cache_
cache for the last queried value
Definition: Attribute.h:106
static constexpr const char Building[]
Definition: Attribute.h:357
static constexpr const char Door[]
Definition: Attribute.h:299
static constexpr const char Rail[]
Definition: Attribute.h:301
static constexpr const char EmergencyLane[]
Definition: Attribute.h:340
static constexpr const char Urban[]
Definition: Attribute.h:350
static constexpr const char JerseyBarrier[]
Definition: Attribute.h:297
static constexpr const char Parking[]
Definition: Attribute.h:354
static constexpr const char Exit[]
Definition: Attribute.h:359
static constexpr const char Straight[]
Definition: Attribute.h:310
static constexpr const char VehicleTaxi[]
Definition: Attribute.h:260
static constexpr const char Keepout[]
Definition: Attribute.h:291
static constexpr const char High[]
Definition: Attribute.h:316
std::string value_
internal value of this parameter
Definition: Attribute.h:105
static constexpr const char Visualization[]
Definition: Attribute.h:294
static constexpr const char Crosswalk[]
Definition: Attribute.h:345
static constexpr const char Ele[]
Definition: Attribute.h:216
static constexpr const char Subtype[]
Definition: Attribute.h:205
static constexpr const char Name[]
Definition: Attribute.h:222
static constexpr const char Virtual[]
Definition: Attribute.h:293
static constexpr const char Wall[]
Definition: Attribute.h:286
static constexpr const char LiftGate[]
Definition: Attribute.h:296
static constexpr const char OneWay[]
Definition: Attribute.h:206
static constexpr const char Temporary[]
Definition: Attribute.h:232
static constexpr const char AllWayStop[]
Definition: Attribute.h:366
static constexpr const char SolidDashed[]
Definition: Attribute.h:308
boost::units::quantity< KmH > KmHQuantity
Definition: Units.h:23
static constexpr const char Dashed[]
Definition: Attribute.h:306
static constexpr const char VehicleBus[]
Definition: Attribute.h:254
Optional< double > asDouble() const
interpret this attribute as double value
Definition: Attribute.cpp:81
static constexpr const char DashedSolid[]
Definition: Attribute.h:307
std::pair< const char *, const AttributeName > AttributeNamesItem
Definition: Attribute.h:196
static constexpr const char LaneChange[]
Definition: Attribute.h:219
static constexpr const char Zebra[]
Definition: Attribute.h:288
static constexpr const char SpeedLimit[]
Definition: Attribute.h:209
Optional< Id > asId() const
interpret this attribute as an id
Definition: Attribute.cpp:95
static constexpr const char SignType[]
Definition: Attribute.h:235
static constexpr const char Color[]
Definition: Attribute.h:212
static constexpr const char Vegetation[]
Definition: Attribute.h:356
static constexpr const char Way[]
Definition: Attribute.h:274
static constexpr const char VehicleCarCombustion[]
Definition: Attribute.h:257
static constexpr const char VehicleEmergency[]
Definition: Attribute.h:261
static constexpr const char LaneChangeRight[]
Definition: Attribute.h:221
static constexpr const char Dynamic[]
Definition: Attribute.h:211
static constexpr const char RightOfWay[]
Definition: Attribute.h:365
units::MPSQuantity Velocity
Definition: Forward.h:210
Optional< int > asInt() const
interpret this attribute as an int
Definition: Attribute.cpp:109
static constexpr const char Yellow[]
Definition: Attribute.h:333


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