OSSIA
Open Scenario System for Interactive Application
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
domain_conversion.hpp
1#pragma once
2#include <ossia/network/domain/domain.hpp>
3
4namespace ossia
5{
6template <typename U>
7struct domain_conversion
8{
9
10 template <typename T>
11 OSSIA_INLINE domain operator()(const T&)
12 {
13 return U{};
14 }
15
16 domain operator()(const domain_base<int32_t>& t)
17 {
18 U f;
19 if(t.min)
20 f.min = *t.min;
21 if(t.max)
22 f.max = *t.max;
23 if(!t.values.empty())
24 for(auto val : t.values)
25 f.values.push_back(val);
26 return f;
27 }
28
29 domain operator()(const domain_base<float>& t)
30 {
31 U f;
32 if(t.min)
33 f.min = *t.min;
34 if(t.max)
35 f.max = *t.max;
36 if(!t.values.empty())
37 for(auto val : t.values)
38 f.values.push_back(val);
39 return f;
40 }
41
42 domain operator()(const domain_base<bool>& t)
43 {
44 U f;
45 f.min = 0;
46 f.max = 1;
47 return f;
48 }
49};
50
51template <>
52struct domain_conversion<domain_base<impulse>>
53{
54 template <typename T>
55 OSSIA_INLINE domain operator()(const T&)
56 {
57 return domain_base<impulse>{};
58 }
59};
60
61template <>
62struct domain_conversion<domain_base<bool>>
63{
64 template <typename T>
65 OSSIA_INLINE domain operator()(const T&)
66 {
67 return domain_base<bool>{};
68 }
69};
70template <>
71struct domain_conversion<vector_domain>
72{
73 OSSIA_INLINE domain operator()(const vector_domain& src) { return src; }
74
75 template <typename T>
76 OSSIA_INLINE domain operator()(const T&)
77 {
78 return vector_domain();
79 }
80};
81
82template <std::size_t N>
83struct domain_conversion<vecf_domain<N>>
84{
85 OSSIA_INLINE domain operator()(const vecf_domain<N>& src) { return src; }
86 vecf_domain<N> list_func(const vector_domain& t)
87 {
88 vecf_domain<N> dom;
89#if !defined(OSSIA_FREESTANDING)
90 const std::size_t min_size = std::min(N, t.min.size());
91 for(std::size_t i = 0; i < min_size; i++)
92 {
93 dom.min[i] = ossia::convert<float>(t.min[i]);
94 }
95
96 const std::size_t max_size = std::min(N, t.max.size());
97 for(std::size_t i = 0; i < max_size; i++)
98 {
99 dom.max[i] = ossia::convert<float>(t.max[i]);
100 }
101
102 const std::size_t vals_size = std::min(N, t.values.size());
103 for(std::size_t i = 0; i < vals_size; i++)
104 {
105 dom.values[i].clear();
106 for(auto& val : t.values[i])
107 dom.values[i].insert(ossia::convert<float>(val));
108 }
109#endif
110 return dom;
111 }
112
113 OSSIA_INLINE domain operator()(const vector_domain& t) { return list_func(t); }
114
115 OSSIA_INLINE domain operator()(const domain_base<int32_t>& d)
116 {
117 domain_base<float> res;
118 if(d.min)
119 res.min = *d.min;
120 if(d.max)
121 res.max = *d.max;
122 for(auto& val : d.values)
123 res.values.push_back(val);
124 return res;
125 }
126
127 OSSIA_INLINE domain operator()(const domain_base<bool>& d)
128 {
129 domain_base<float> res;
130 res.min = 0.f;
131 res.max = 1.f;
132 return res;
133 }
134
135 OSSIA_INLINE domain operator()(const domain_base<float>& d) { return d; }
136
137 template <typename T>
138 OSSIA_INLINE domain operator()(const T&)
139 {
140 return vecf_domain<N>();
141 }
142};
143
144template <>
145struct domain_conversion<domain_base<std::string>>
146{
147 OSSIA_INLINE domain operator()(const domain_base<std::string>& src) { return src; }
148
149 template <typename T>
150 OSSIA_INLINE domain operator()(const T&)
151 {
152 return domain_base<std::string>();
153 }
154};
155
156// TODO handle the ossia::value case
157
158inline domain convert_domain(const domain& dom, ossia::val_type newtype)
159{
160 switch(newtype)
161 {
163 return ossia::apply_nonnull(domain_conversion<domain_base<impulse>>{}, dom);
164 case val_type::INT:
165 return ossia::apply_nonnull(domain_conversion<domain_base<int32_t>>{}, dom);
166 case val_type::FLOAT:
167 return ossia::apply_nonnull(domain_conversion<domain_base<float>>{}, dom);
168 case val_type::BOOL:
169 return ossia::apply_nonnull(domain_conversion<domain_base<bool>>{}, dom);
170 case val_type::STRING:
171 return ossia::apply_nonnull(domain_conversion<domain_base<std::string>>{}, dom);
172 case val_type::LIST:
173 return ossia::apply_nonnull(domain_conversion<vector_domain>{}, dom);
174 case val_type::VEC2F:
175 return ossia::apply_nonnull(domain_conversion<vecf_domain<2>>{}, dom);
176 case val_type::VEC3F:
177 return ossia::apply_nonnull(domain_conversion<vecf_domain<3>>{}, dom);
178 case val_type::VEC4F:
179 return ossia::apply_nonnull(domain_conversion<vecf_domain<4>>{}, dom);
180 default:
181 return domain{};
182 }
183}
184
186{
187 constexpr const auto list_index = 6;
188 // eggs::variants::detail::checked_index_of<vector_domain,
189 // domain_base_variant>::count;
190
191 // Converts domains but keeps compatible different domains.
192 // e.g. a float domain works for vec4f or list.
194 if(dom.which() < list_index)
195 {
196 dom = convert_domain(dom, newtype);
197 }
198 else if(dom.which() == list_index)
199 {
200 switch(newtype)
201 {
205 dom = convert_domain(dom, newtype);
206 break;
207 }
208 default:
209 break;
210 }
211 }
212}
213}
Definition git_info.h:7
val_type
Enum to represent the types that a value can take.
Definition parameter_properties.hpp:16
@ IMPULSE
array<float, 4>
@ VEC3F
array<float, 2>
@ LIST
std::string
@ VEC4F
array<float, 3>
@ BOOL
ossia::impulse
void convert_compatible_domain(domain &dom, ossia::val_type newtype)
Definition domain_conversion.hpp:185
domain A domain of values
Definition domain_base.hpp:23