18 #ifndef SDFORMAT_PARAM_HH_ 
   19 #define SDFORMAT_PARAM_HH_ 
   33 #include <ignition/math.hh> 
   36 #include "sdf/sdf_config.h" 
   44 #pragma warning(disable: 4251) 
   50   inline namespace SDF_VERSION_NAMESPACE {
 
   85     std::visit([&os](
auto const &v)
 
  104     public: 
Param(
const std::string &_key, 
const std::string &_typeName,
 
  105                   const std::string &_default, 
bool _required,
 
  106                   const std::string &_description = 
"");
 
  109     public: 
virtual ~
Param();
 
  113     public: std::string GetAsString() 
const;
 
  117     public: std::string GetDefaultAsString() 
const;
 
  121     public: 
bool SetFromString(
const std::string &_value);
 
  124     public: 
void Reset();
 
  128     public: 
const std::string &GetKey() 
const;
 
  133     public: 
template<
typename Type>
 
  138     public: 
const std::string &GetTypeName() 
const;
 
  142     public: 
bool GetRequired() 
const;
 
  146     public: 
bool GetSet() 
const;
 
  155     public: 
template<
typename T>
 
  156             void SetUpdateFunc(T _updateFunc);
 
  160     public: 
void Update();
 
  167     public: 
template<
typename T>
 
  168             bool Set(
const T &_value);
 
  173     public: 
bool GetAny(std::any &_anyVal) 
const;
 
  179     public: 
template<
typename T>
 
  180             bool Get(T &_value) 
const;
 
  186     public: 
template<
typename T>
 
  187             bool GetDefault(T &_value) 
const;
 
  193     public: 
Param &operator=(
const Param &_param);
 
  197     public: 
void SetDescription(
const std::string &_desc);
 
  201     public: std::string GetDescription() 
const;
 
  217     private: 
bool ValueFromString(
const std::string &_value);
 
  220     private: std::unique_ptr<ParamPrivate> dataPtr;
 
  249     public: 
typedef std::variant<bool, char, std::string, int, std::uint64_t,
 
  251                                    ignition::math::Angle,
 
  252                                    ignition::math::Color,
 
  253                                    ignition::math::Vector2i,
 
  254                                    ignition::math::Vector2d,
 
  255                                    ignition::math::Vector3d,
 
  256                                    ignition::math::Quaterniond,
 
  271                                     const std::string &_typeName,
 
  272                                     const std::string &_valueStr,
 
  277     public: 
template<
typename T>
 
  278             std::string TypeToString() 
const;
 
  283   std::string ParamPrivate::TypeToString()
 const 
  286     if constexpr (std::is_same_v<T, bool>)
 
  288     else if constexpr (std::is_same_v<T, char>)
 
  290     else if constexpr (std::is_same_v<T, std::string>)
 
  292     else if constexpr (std::is_same_v<T, int>)
 
  294     else if constexpr (std::is_same_v<T, std::uint64_t>)
 
  296     else if constexpr (std::is_same_v<T, unsigned int>)
 
  297       return "unsigned int";
 
  298     else if constexpr (std::is_same_v<T, double>)
 
  300     else if constexpr (std::is_same_v<T, float>)
 
  302     else if constexpr (std::is_same_v<T, sdf::Time>)
 
  304     else if constexpr (std::is_same_v<T, ignition::math::Angle>)
 
  306     else if constexpr (std::is_same_v<T, ignition::math::Color>)
 
  308     else if constexpr (std::is_same_v<T, ignition::math::Vector2i>)
 
  310     else if constexpr (std::is_same_v<T, ignition::math::Vector2d>)
 
  312     else if constexpr (std::is_same_v<T, ignition::math::Vector3d>)
 
  314     else if constexpr (std::is_same_v<T, ignition::math::Quaterniond>)
 
  316     else if constexpr (std::is_same_v<T, ignition::math::Pose3d>)
 
  324   void Param::SetUpdateFunc(T _updateFunc)
 
  326     this->dataPtr->updateFunc = _updateFunc;
 
  331   bool Param::Set(
const T &_value)
 
  335       std::stringstream ss;
 
  337       return this->SetFromString(ss.str());
 
  341       sdferr << 
"Unable to set parameter[" 
  342              << this->dataPtr->key << 
"]." 
  343              << 
"Type used must have a stream input and output operator," 
  344              << 
"which allows proper functioning of Param.\n";
 
  351   bool Param::Get(T &_value)
 const 
  353     T *value = std::get_if<T>(&this->dataPtr->value);
 
  360       std::string typeStr = this->dataPtr->TypeToString<T>();
 
  363         sdferr << 
"Unknown parameter type[" << 
typeid(T).name() << 
"]\n";
 
  367       std::string valueStr = this->GetAsString();
 
  369       bool success = this->dataPtr->ValueFromStringImpl(typeStr, valueStr, pv);
 
  373         _value = std::get<T>(pv);
 
  375       else if (typeStr == 
"bool" && this->dataPtr->typeName == 
"string")
 
  382         std::stringstream tmp;
 
  383         if (valueStr == 
"true" || valueStr == 
"1")
 
  400   bool Param::GetDefault(T &_value)
 const 
  402     std::stringstream ss;
 
  411       sdferr << 
"Unable to convert parameter[" 
  412              << this->dataPtr->key << 
"] " 
  414              << this->dataPtr->typeName << 
"], to " 
  415              << 
"type[" << 
typeid(T).name() << 
"]\n";
 
  423   template<
typename Type>
 
  424   bool Param::IsType()
 const 
  426     return std::holds_alternative<Type>(this->dataPtr->value);