makiolo

Property maps

Oct 20th, 2020 (edited)
505
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #ifndef _PROPS_H_
  2. #define _PROPS_H_
  3.  
  4. #include <string>
  5. #include "any.hpp"
  6.  
  7. class Props
  8. {
  9. public:
  10.     using PropsMap = std::unordered_map<std::string, nonstd::any>;
  11.  
  12.     explicit Props() { ; }
  13.     ~Props() { ; }
  14.  
  15.     /// set
  16.  
  17.     template <typename T>
  18.     inline void set(const std::string& name, const T& value)
  19.     {
  20.         if (_props.count(name) > 0)
  21.         {
  22.             nonstd::any& prop = _props[name];
  23.             prop = value;
  24.         }
  25.         else
  26.         {
  27.             nonstd::any newProperty = value;
  28.             _props.insert(std::make_pair(name, newProperty));
  29.         }
  30.     }
  31.  
  32.     inline void set_bool(const std::string& name, bool value)
  33.     {
  34.         set<bool>(name, value);
  35.     }
  36.  
  37.     inline void set_int(const std::string& name, int value)
  38.     {
  39.         set<int>(name, value);
  40.     }
  41.  
  42.     inline void set_float(const std::string& name, float value)
  43.     {
  44.         set<float>(name, value);
  45.     }
  46.  
  47.     inline void set_string(const std::string& name, const std::string& value)
  48.     {
  49.         set<std::string>(name, value);
  50.     }
  51.  
  52.     /// has
  53.  
  54.     template <typename T>
  55.     bool _has(const nonstd::any& prop) const
  56.     {
  57.         try
  58.         {
  59.             nonstd::any_cast<const T>(prop);
  60.             return true;
  61.         }
  62.         catch (const nonstd::bad_any_cast&)
  63.         {
  64.             return false;
  65.         }
  66.     }
  67.  
  68.     template <typename T>
  69.     bool has(const std::string& name) const
  70.     {
  71.         if (_props.count(name) > 0)
  72.         {
  73.             const nonstd::any& prop = _props.at(name);
  74.             return _has<T>(prop);
  75.         }
  76.         else
  77.         {
  78.             return false;
  79.         }
  80.     }
  81.  
  82.     inline bool has_bool(const std::string& name) const
  83.     {
  84.         return has<bool>(name);
  85.     }
  86.  
  87.     inline bool has_int(const std::string& name) const
  88.     {
  89.         return has<int>(name);
  90.     }
  91.  
  92.     inline bool has_float(const std::string& name) const
  93.     {
  94.         return has<float>(name);
  95.     }
  96.  
  97.     inline bool has_string(const std::string& name) const
  98.     {
  99.         return has<std::string>(name);
  100.     }
  101.  
  102.     inline bool has_any(const std::string& name) const
  103.     {
  104.         return _props.count(name) > 0;
  105.     }
  106.  
  107.     /// get
  108.  
  109.     template <typename T>
  110.     inline T get(const std::string& name) const
  111.     {
  112.         assert(has<T>(name));
  113.  
  114.         const nonstd::any& prop = _props.at(name);
  115.         return nonstd::any_cast<T>(prop);
  116.     }
  117.  
  118.     inline bool get_bool(const std::string& name) const
  119.     {
  120.         return get<bool>(name);
  121.     }
  122.  
  123.     inline int get_int(const std::string& name) const
  124.     {
  125.         return get<int>(name);
  126.     }
  127.  
  128.     inline float get_float(const std::string& name) const
  129.     {
  130.         return get<float>(name);
  131.     }
  132.  
  133.     inline std::string get_string(const std::string& name) const
  134.     {
  135.         return get<std::string>(name);
  136.     }
  137.  
  138. protected:
  139.     PropsMap _props;
  140. };
  141.  
  142. #endif // _PROPS_H_
  143.  
RAW Paste Data