18 #ifndef SDFORMAT_PARAM_HH_ 19 #define SDFORMAT_PARAM_HH_ 36 #include <ignition/math.hh> 47 #pragma warning(disable: 4251) 53 inline namespace SDF_VERSION_NAMESPACE {
78 std::ostream& operator<<(std::ostream &os, ParamStreamer<T> s)
85 inline std::ostream& operator<<(std::ostream &os, ParamStreamer<double> s)
87 os << std::setprecision(std::numeric_limits<double>::max_digits10) << s.val;
92 inline std::ostream& operator<<(std::ostream &os, ParamStreamer<float> s)
94 os << std::setprecision(std::numeric_limits<float>::max_digits10) << s.val;
102 std::visit([&os](
auto const &v)
121 public:
Param(
const std::string &_key,
const std::string &_typeName,
122 const std::string &_default,
bool _required,
123 const std::string &_description =
"");
135 public:
Param(
const std::string &_key,
const std::string &_typeName,
136 const std::string &_default,
bool _required,
137 const std::string &_minValue,
const std::string &_maxValue,
138 const std::string &_description =
"");
147 public:
Param(
Param &&_param) noexcept =
default;
153 public:
Param &operator=(
const Param &_param);
158 public:
Param &operator=(
Param &&_param) noexcept =
default;
161 public:
virtual ~
Param();
165 public: std::string GetAsString()
const;
169 public: std::string GetDefaultAsString()
const;
175 public: std::optional<std::string> GetMinValueAsString()
const;
181 public: std::optional<std::string> GetMaxValueAsString()
const;
185 public:
bool SetFromString(
const std::string &_value);
188 public:
void Reset();
192 public:
const std::string &GetKey()
const;
197 public:
template<
typename Type>
202 public:
const std::string &GetTypeName()
const;
206 public:
bool GetRequired()
const;
210 public:
bool GetSet()
const;
214 public: ParamPtr Clone()
const;
219 public:
template<
typename T>
220 void SetUpdateFunc(T _updateFunc);
224 public:
void Update();
231 public:
template<
typename T>
232 bool Set(
const T &_value);
237 public:
bool GetAny(std::any &_anyVal)
const;
243 public:
template<
typename T>
244 bool Get(T &_value)
const;
250 public:
template<
typename T>
251 bool GetDefault(T &_value)
const;
255 public:
void SetDescription(
const std::string &_desc);
259 public: std::string GetDescription()
const;
263 public:
bool ValidateValue()
const;
279 private:
bool ValueFromString(
const std::string &_value);
282 private: std::unique_ptr<ParamPrivate> dataPtr;
311 public:
typedef std::variant<bool, char, std::string, int, std::uint64_t,
312 unsigned int, double, float, sdf::Time,
313 ignition::math::Angle,
314 ignition::math::Color,
315 ignition::math::Vector2i,
316 ignition::math::Vector2d,
317 ignition::math::Vector3d,
318 ignition::math::Quaterniond,
339 const std::string &_typeName,
340 const std::string &_valueStr,
341 ParamVariant &_valueToSet)
const;
345 public:
template<
typename T>
346 std::string TypeToString()
const;
354 if constexpr (std::is_same_v<T, bool>)
356 else if constexpr (std::is_same_v<T, char>)
358 else if constexpr (std::is_same_v<T, std::string>)
360 else if constexpr (std::is_same_v<T, int>)
362 else if constexpr (std::is_same_v<T, std::uint64_t>)
364 else if constexpr (std::is_same_v<T, unsigned int>)
365 return "unsigned int";
366 else if constexpr (std::is_same_v<T, double>)
368 else if constexpr (std::is_same_v<T, float>)
370 else if constexpr (std::is_same_v<T, sdf::Time>)
372 else if constexpr (std::is_same_v<T, ignition::math::Angle>)
374 else if constexpr (std::is_same_v<T, ignition::math::Color>)
376 else if constexpr (std::is_same_v<T, ignition::math::Vector2i>)
378 else if constexpr (std::is_same_v<T, ignition::math::Vector2d>)
380 else if constexpr (std::is_same_v<T, ignition::math::Vector3d>)
382 else if constexpr (std::is_same_v<T, ignition::math::Quaterniond>)
384 else if constexpr (std::is_same_v<T, ignition::math::Pose3d>)
394 this->dataPtr->updateFunc = _updateFunc;
403 std::stringstream ss;
405 return this->SetFromString(ss.str());
409 sdferr <<
"Unable to set parameter[" 410 << this->dataPtr->key <<
"]." 411 <<
"Type used must have a stream input and output operator," 412 <<
"which allows proper functioning of Param.\n";
421 T *value = std::get_if<T>(&this->dataPtr->value);
428 std::string typeStr = this->dataPtr->TypeToString<T>();
431 sdferr <<
"Unknown parameter type[" <<
typeid(T).name() <<
"]\n";
435 std::string valueStr = this->GetAsString();
437 bool success = this->dataPtr->ValueFromStringImpl(typeStr, valueStr, pv);
441 _value = std::get<T>(pv);
443 else if (typeStr ==
"bool" && this->dataPtr->typeName ==
"string")
450 std::stringstream tmp;
451 if (valueStr ==
"true" || valueStr ==
"1")
470 std::stringstream ss;
479 sdferr <<
"Unable to convert parameter[" 480 << this->dataPtr->key <<
"] " 482 << this->dataPtr->typeName <<
"], to " 483 <<
"type[" <<
typeid(T).name() <<
"]\n";
491 template<
typename Type>
494 return std::holds_alternative<Type>(this->dataPtr->value);
void SetUpdateFunc(T _updateFunc)
Set the update function.
Definition: Param.hh:392
std::ostream & operator<<(std::ostream &os, ParamStreamer< T > s)
Definition: Param.hh:78
std::shared_ptr< Param > ParamPtr
Definition: Param.hh:60
ParamVariant value
This parameter's value.
Definition: Param.hh:322
friend std::ostream & operator<<(std::ostream &_out, const Param &_p)
Ostream operator.
Definition: Param.hh:269
std::string SDFORMAT_VISIBLE lowercase(const std::string &_in)
Transforms a string to its lowercase equivalent.
std::vector< ParamPtr > Param_V
Definition: Param.hh:64
bool required
True if the parameter is required.
Definition: Param.hh:293
std::function< std::any()> updateFunc
Update function pointer.
Definition: Param.hh:305
std::string TypeToString() const
Data type to string mapping.
Definition: Param.hh:351
std::optional< ParamVariant > maxValue
This parameter's maximum allowed value.
Definition: Param.hh:331
class SDFORMAT_VISIBLE Param
Definition: Param.hh:56
std::variant< bool, char, std::string, int, std::uint64_t, unsigned int, double, float, sdf::Time, ignition::math::Angle, ignition::math::Color, ignition::math::Vector2i, ignition::math::Vector2d, ignition::math::Vector3d, ignition::math::Quaterniond, ignition::math::Pose3d > ParamVariant
Definition: Param.hh:319
std::optional< ParamVariant > minValue
This parameter's minimum allowed value.
Definition: Param.hh:328
bool GetDefault(T &_value) const
Get the default value of the parameter.
Definition: Param.hh:468
std::string key
Key value.
Definition: Param.hh:290
#define SDFORMAT_VISIBLE
Use to represent "symbol visible" if supported.
Definition: system_util.hh:25
#define sdferr
Output an error message.
Definition: Console.hh:57
const T & val
Definition: Param.hh:72
std::string GetAsString() const
Get the value as a string.
ParamVariant defaultValue
This parameter's default value.
Definition: Param.hh:325
std::string typeName
Definition: Param.hh:299
bool IsType() const
Return true if the param is a particular type.
Definition: Param.hh:492
ParamStreamer(T) -> ParamStreamer< T >
namespace for Simulation Description Format parser
Definition: Actor.hh:33
bool Get(T &_value) const
Get the value of the parameter.
Definition: Param.hh:419
std::string description
Description of the parameter.
Definition: Param.hh:302
bool Set(const T &_value)
Set the parameter's value.
Definition: Param.hh:399
A parameter class.
Definition: Param.hh:111