| Fast DDS Version 3.3.0 Fast DDS

Loading...
Searching...
No Matches
Property.hpp
1// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
18#ifndef FASTDDS_RTPS_COMMON__PROPERTY_HPP
19#define FASTDDS_RTPS_COMMON__PROPERTY_HPP
20
21#include <functional>
22#include <stdexcept>
23#include <string>
24#include <vector>
25
26 namespace eprosima {
27 namespace fastdds {
28 namespace rtps {
29
30 class Property
31{
32 public:
33
34 Property()
35 {
36 }
37
38 Property(
39 const Property& property)
40 : name_(property.name_)
41 , value_(property.value_)
42 , propagate_(property.propagate_)
43 {
44 }
45
46 Property(
47 Property&& property)
48 : name_(std::move(property.name_))
49 , value_(std::move(property.value_))
50 , propagate_(property.propagate_)
51 {
52 }
53
54 Property(
55 const std::string& name,
56 const std::string& value,
57 bool propagate = false)
58 : name_(name)
59 , value_(value)
60 , propagate_(propagate)
61 {
62 }
63
64 Property(
65 std::string&& name,
66 std::string&& value,
67 bool propagate = false)
68 : name_(std::move(name))
69 , value_(std::move(value))
70 , propagate_(propagate)
71 {
72 }
73
74 Property& operator =(
75 const Property& property)
76 {
77 name_ = property.name_;
78 value_ = property.value_;
79 propagate_ = property.propagate_;
80 return *this;
81 }
82
83 Property& operator =(
84 Property&& property)
85 {
86 name_ = std::move(property.name_);
87 value_ = std::move(property.value_);
88 propagate_ = property.propagate_;
89 return *this;
90 }
91
92 bool operator ==(
93 const Property& b) const
94 {
95 return (this->name_ == b.name_) &&
96 (this->value_ == b.value_);
97 }
98
99 void name(
100 const std::string& name)
101 {
102 name_ = name;
103 }
104
105 void name(
106 std::string&& name)
107 {
108 name_ = std::move(name);
109 }
110
111 const std::string& name() const
112 {
113 return name_;
114 }
115
116 std::string& name()
117 {
118 return name_;
119 }
120
121 void value(
122 const std::string& value)
123 {
124 value_ = value;
125 }
126
127 void value(
128 std::string&& value)
129 {
130 value_ = std::move(value);
131 }
132
133 const std::string& value() const
134 {
135 return value_;
136 }
137
138 std::string& value()
139 {
140 return value_;
141 }
142
143 void propagate(
144 bool propagate)
145 {
146 propagate_ = propagate;
147 }
148
149 bool propagate() const
150 {
151 return propagate_;
152 }
153
154 bool& propagate()
155 {
156 return propagate_;
157 }
158
159 private:
160
161 std::string name_;
162
163 std::string value_;
164
165 bool propagate_ = false;
166};
167
168 typedef std::vector<Property> PropertySeq;
169
170 class PropertyHelper
171{
172 public:
173
174 static size_t serialized_size(
175 const Property& property,
176 size_t current_alignment = 0)
177 {
178 if (property.propagate())
179 {
180 size_t initial_alignment = current_alignment;
181
182 current_alignment += 4 + alignment(current_alignment, 4) + property.name().size() + 1;
183 current_alignment += 4 + alignment(current_alignment, 4) + property.value().size() + 1;
184
185 return current_alignment - initial_alignment;
186 }
187 else
188 {
189 return 0;
190 }
191 }
192
193 static size_t serialized_size(
194 const PropertySeq& properties,
195 size_t current_alignment = 0)
196 {
197 size_t initial_alignment = current_alignment;
198
199 current_alignment += 4 + alignment(current_alignment, 4);
200 for (auto property = properties.begin(); property != properties.end(); ++property)
201 {
202 current_alignment += serialized_size(*property, current_alignment);
203 }
204
205 return current_alignment - initial_alignment;
206 }
207
208 private:
209
210 inline static size_t alignment(
211 size_t current_alignment,
212 size_t dataSize)
213 {
214 return (dataSize - (current_alignment % dataSize)) & (dataSize - 1);
215 }
216
217};
218
219 struct PropertyParser
220{
221
235 template<typename exception_t>
236 inline static int as_int(
237 const Property& property,
238 const bool& check_upper_bound,
239 const int& upper_bound,
240 const bool& check_lower_bound,
241 const int& lower_bound,
242 const exception_t& exception)
243 {
244 return parse_value(
245 std::function<int(const Property& property)>(
246 [](const Property& property)
247 {
248 return std::stoi(property.value());
249 }
250 ),
251 property,
252 check_upper_bound,
253 upper_bound,
254 check_lower_bound,
255 lower_bound,
256 exception);
257 }
258
272 template<typename exception_t>
273 inline static double as_double(
274 const Property& property,
275 const bool& check_upper_bound,
276 const double& upper_bound,
277 const bool& check_lower_bound,
278 const double& lower_bound,
279 const exception_t& exception)
280 {
281 return parse_value(
282 std::function<double(const Property& property)>(
283 [](const Property& property)
284 {
285 return std::stod(property.value());
286 }
287 ),
288 property,
289 check_upper_bound,
290 upper_bound,
291 check_lower_bound,
292 lower_bound,
293 exception);
294 }
295
302 inline static bool as_bool(
303 const Property& property)
304 {
305 bool ret = false;
306 const std::string& value = property.value();
307 if (value == "true" || value == "TRUE" || value == "True" || value == "1")
308 {
309 ret = true;
310 }
311 return ret;
312 }
313
314 private:
315
316 template <typename value_t,
317 typename exception_t>
318 inline static value_t parse_value(
319 const std::function<value_t(const Property&)>& conversor,
320 const Property& property,
321 const bool& check_upper_bound,
322 const value_t& upper_bound,
323 const bool& check_lower_bound,
324 const value_t& lower_bound,
325 const exception_t& exception)
326 {
327 try
328 {
329 value_t converted_value = conversor(property);
330
331 if (check_lower_bound && converted_value < lower_bound)
332 {
333 throw exception_t("Value '" + property.value() +
334 "' for " + property.name() + " must be greater or equal to " +
335 std::to_string(lower_bound));
336 }
337
338 if (check_upper_bound && converted_value > upper_bound)
339 {
340 throw exception_t("Value '" + property.value() +
341 "' for " + property.name() + " must be lower or equal to " +
342 std::to_string(upper_bound));
343 }
344
345 return converted_value;
346 }
347 catch (const std::invalid_argument&)
348 {
349 throw exception;
350 }
351 catch (const std::out_of_range&)
352 {
353 throw exception;
354 }
355 }
356
357};
358
359} //namespace eprosima
360} //namespace fastdds
361} //namespace rtps
362
363#endif // FASTDDS_RTPS_COMMON__PROPERTY_HPP
eprosima::fastdds::rtps::PropertyHelper
Definition Property.hpp:171
eprosima::fastdds::rtps::PropertyHelper::serialized_size
static size_t serialized_size(const PropertySeq &properties, size_t current_alignment=0)
Definition Property.hpp:193
eprosima::fastdds::rtps::PropertyHelper::serialized_size
static size_t serialized_size(const Property &property, size_t current_alignment=0)
Definition Property.hpp:174
eprosima::fastdds::rtps::Property
Definition Property.hpp:31
eprosima::fastdds::rtps::Property::operator=
Property & operator=(const Property &property)
Definition Property.hpp:74
eprosima::fastdds::rtps::Property::name
void name(std::string &&name)
Definition Property.hpp:105
eprosima::fastdds::rtps::Property::name
const std::string & name() const
Definition Property.hpp:111
eprosima::fastdds::rtps::Property::Property
Property(std::string &&name, std::string &&value, bool propagate=false)
Definition Property.hpp:64
eprosima::fastdds::rtps::Property::value
void value(const std::string &value)
Definition Property.hpp:121
eprosima::fastdds::rtps::Property::value
std::string & value()
Definition Property.hpp:138
eprosima::fastdds::rtps::Property::Property
Property()
Definition Property.hpp:34
eprosima::fastdds::rtps::Property::value
const std::string & value() const
Definition Property.hpp:133
eprosima::fastdds::rtps::Property::Property
Property(const std::string &name, const std::string &value, bool propagate=false)
Definition Property.hpp:54
eprosima::fastdds::rtps::Property::name
std::string & name()
Definition Property.hpp:116
eprosima::fastdds::rtps::Property::value
void value(std::string &&value)
Definition Property.hpp:127
eprosima::fastdds::rtps::Property::propagate
bool & propagate()
Definition Property.hpp:154
eprosima::fastdds::rtps::Property::Property
Property(const Property &property)
Definition Property.hpp:38
eprosima::fastdds::rtps::Property::name
void name(const std::string &name)
Definition Property.hpp:99
eprosima::fastdds::rtps::Property::Property
Property(Property &&property)
Definition Property.hpp:46
eprosima::fastdds::rtps::Property::propagate
bool propagate() const
Definition Property.hpp:149
eprosima::fastdds::rtps::Property::propagate
void propagate(bool propagate)
Definition Property.hpp:143
eprosima::fastdds::rtps::Property::operator==
bool operator==(const Property &b) const
Definition Property.hpp:92
eprosima::fastdds::rtps
Contains the RTPS protocol implementation.
eprosima::fastdds::rtps::PropertySeq
std::vector< Property > PropertySeq
Definition Property.hpp:168
eprosima::fastdds
eprosima
eProsima namespace.
std
Definition EntityId_t.hpp:388
eprosima::fastdds::rtps::PropertyParser
Definition Property.hpp:220
eprosima::fastdds::rtps::PropertyParser::as_double
static double as_double(const Property &property, const bool &check_upper_bound, const double &upper_bound, const bool &check_lower_bound, const double &lower_bound, const exception_t &exception)
Parse a property value as a double.
Definition Property.hpp:273
eprosima::fastdds::rtps::PropertyParser::as_int
static int as_int(const Property &property, const bool &check_upper_bound, const int &upper_bound, const bool &check_lower_bound, const int &lower_bound, const exception_t &exception)
Parse a property value as an integer.
Definition Property.hpp:236
eprosima::fastdds::rtps::PropertyParser::as_bool
static bool as_bool(const Property &property)
Parse a property value as a boolean.
Definition Property.hpp:302