OSSIA
Open Scenario System for Interactive Application
value_set_domain.hpp
1 #pragma once
4 
5 namespace ossia
6 {
7 
8 template <typename T>
9 struct domain_base;
10 
11 template <typename Domain>
12 struct value_set_clamp
13 {
14  const Domain& domain;
15  template <typename U>
16  value operator()(bounding_mode b, U&& val)
17  {
18  const auto& values = domain.values;
19  if(b == bounding_mode::FREE || values.empty())
20  {
21  return std::forward<U>(val);
22  }
23  else
24  {
25  auto it = ossia::find(values, val);
26  return (it != values.end()) ? ossia::value{std::forward<U>(val)} : ossia::value{};
27  }
28  }
29 };
30 
31 struct value_set_get_visitor
32 {
33  template <typename T>
34  std::vector<ossia::value> operator()(const ossia::domain_base<T>& dom)
35  {
36  return std::vector<ossia::value>(dom.values.begin(), dom.values.end());
37  }
38 
39  std::vector<ossia::value> operator()(const ossia::domain_base<bool>&)
40  {
41  return std::vector<ossia::value>{ossia::value{false}, ossia::value{true}};
42  }
43 
44  std::vector<ossia::value> operator()(const ossia::domain_base<ossia::impulse>& dom)
45  {
46  return std::vector<ossia::value>{};
47  }
48 
49  std::vector<ossia::value> operator()(const ossia::vector_domain& dom)
50  {
51  std::vector<ossia::value> v(dom.values.size());
52  for(std::size_t i = 0; i < dom.values.size(); i++)
53  {
54  v[i] = std::vector<ossia::value>(dom.values[i].begin(), dom.values[i].end());
55  }
56  return v;
57  }
58 
59  template <std::size_t N>
60  std::vector<ossia::value> operator()(const ossia::vecf_domain<N>& dom)
61  {
62  std::vector<ossia::value> v(N);
63  for(std::size_t i = 0; i < N; i++)
64  {
65  v[i] = std::vector<ossia::value>(dom.values[i].begin(), dom.values[i].end());
66  }
67  return v;
68  }
69 };
70 
71 struct value_set_update_visitor
72 {
73  const std::vector<ossia::value>& values;
74  template <typename T>
75  void operator()(ossia::domain_base<T>& dom)
76  {
77  dom.values.clear();
78  dom.values.reserve(values.size());
79  for(auto& value : values)
80  {
81  if(auto r = value.target<T>())
82  dom.values.push_back(*r);
83  }
84  }
85 
86  void operator()(ossia::vector_domain& dom)
87  {
88  for(auto& set : dom.values)
89  {
90  set.clear();
91  for(auto& value : values)
92  {
93  dom.values[0].insert(value);
94  }
95  }
96  }
97 
98  void operator()(ossia::domain_base<ossia::value>& dom)
99  {
100  dom.values.clear();
101  for(auto& value : values)
102  {
103  dom.values.push_back(value);
104  }
105  }
106 
107  template <std::size_t N>
108  void operator()(ossia::vecf_domain<N>& dom)
109  {
110  for(std::size_t i = 0; i < N; i++)
111  dom.values[i].clear();
112 
113  for(auto& value : values)
114  {
115  if(auto r = value.target<float>())
116  {
117  for(std::size_t i = 0; i < N; i++)
118  {
119  dom.values[i].insert(*r);
120  }
121  }
122  }
123  }
124 
125  void operator()(ossia::domain_base<impulse>&) { }
126 
127  void operator()(ossia::domain_base<bool>&) { }
128 };
129 }
The value class.
Definition: value.hpp:173
Definition: git_info.h:7
bounding_mode
Address behaviors at crossing domain boundaries.
Definition: parameter_properties.hpp:56