OSSIA
Open Scenario System for Interactive Application
any_map.hpp
Go to the documentation of this file.
1 #pragma once
2 #include <ossia/detail/config.hpp>
3 
4 #include <ossia/detail/any.hpp>
5 #include <ossia/detail/optional.hpp>
7 
11 namespace ossia
12 {
14 using any_map = string_map<ossia::any>;
15 
16 using extended_attributes = any_map;
28 template <typename T>
29 auto get_attribute(const any_map& e, std::string_view name)
30 {
31  auto it = e.find(name);
32  if(it != e.cend())
33  {
34  auto val = ossia::any_cast<T>(&it->second);
35  if(val)
36  return *val;
37  }
38 
39  return T{};
40 }
41 
54 template <typename T>
55 std::optional<T> get_optional_attribute(const any_map& e, std::string_view name)
56 {
57  auto it = e.find(name);
58  if(it != e.cend())
59  {
60  auto val = ossia::any_cast<T>(&it->second);
61  if(val)
62  return *val;
63  }
64 
65  return std::nullopt;
66 }
67 
68 struct is_empty_value
69 {
70  template <typename T>
71  bool operator()(const T&) noexcept
72  {
73  return false;
74  }
75  bool operator()(const std::string& v) noexcept { return v.empty(); }
76  bool operator()(const std::string_view& v) noexcept { return v.empty(); }
77  template <typename T>
78  bool operator()(const std::vector<T>& v) noexcept
79  {
80  return v.empty();
81  }
82 };
83 
85 OSSIA_EXPORT
86 void unset_attribute(any_map& e, std::string_view str);
87 
89 template <typename T>
90 void set_attribute(any_map& e, std::string_view str, const T& val)
91 {
92  if(!is_empty_value{}(val))
93  {
94  // TODO insert_or_assign
95  auto it = e.find(str);
96  if(it != e.end())
97  it->second = val;
98  else
99  e.insert(std::make_pair(std::string(str), ossia::any{val}));
100  }
101  else
102  {
103  unset_attribute(e, str);
104  }
105 }
106 
108 OSSIA_EXPORT
109 bool has_attribute(const any_map& e, std::string_view str) noexcept;
110 
112 OSSIA_EXPORT
113 void set_attribute(any_map& e, std::string_view str);
114 
116 template <typename T>
117 void set_attribute(any_map& e, std::string_view str, T&& val)
118 {
119  if(!is_empty_value{}(val))
120  {
121  // TODO insert_or_assign
122  auto it = e.find(str);
123  if(it != e.end())
124  it->second = std::move(val);
125  else
126  e.insert(std::make_pair(std::string(str), ossia::any{std::move(val)}));
127  }
128  else
129  {
130  unset_attribute(e, str);
131  }
132 }
133 
135 OSSIA_EXPORT
136 void set_attribute(any_map& e, std::string_view str, std::nullopt_t);
137 
139 template <typename T>
141  any_map& e, std::string_view str, const std::optional<T>& opt)
142 {
143  if(opt && !is_empty_value{}(*opt))
144  set_attribute(e, str, *opt);
145  else
146  set_attribute(e, str, std::nullopt);
147 }
148 
149 template <typename T>
150 void set_optional_attribute(any_map& e, std::string_view str, std::optional<T>&& opt)
151 {
152  if(opt && !is_empty_value{}(*opt))
153  set_attribute(e, str, *std::move(opt));
154  else
155  set_attribute(e, str, std::nullopt);
156 }
157 }
Definition: git_info.h:7
string_map< ossia::any > any_map
A container to store any kind of data indexed by a string.
Definition: any_map.hpp:14
auto get_attribute(const any_map &e, std::string_view name)
get_attribute Get an attribute of an any_map.
Definition: any_map.hpp:29
bool has_attribute(const any_map &e, std::string_view str) noexcept
Checks if an attribute is present.
Definition: any_map.cpp:6
std::optional< T > get_optional_attribute(const any_map &e, std::string_view name)
get_optional_attribute Maybe get an attribute of an any_map.
Definition: any_map.hpp:55
void set_optional_attribute(any_map &e, std::string_view str, const std::optional< T > &opt)
Sets an attribute if opt has a value, else remove the attribute.
Definition: any_map.hpp:140
void set_attribute(any_map &e, std::string_view str)
Sets a bool-like attribute. It should be checked for with has_attribute.
Definition: any_map.cpp:11
void unset_attribute(any_map &e, std::string_view str)
Remove an attribute.
Definition: any_map.cpp:23