2#include <ossia/network/value/value.hpp>
8template <
typename TernaryFun>
9struct apply_ternary_fun_visitor
11 template <
typename T,
typename U,
typename V>
12 OSSIA_INLINE ossia::value operator()(
const T& val,
const U&
min,
const V&
max)
16#if !defined(FAST_COMPILES)
17 template <
typename U,
typename V>
18 OSSIA_INLINE ossia::value operator()(List&& val,
const U&
min,
const V&
max)
20 return std::move(val);
22 template <
typename U,
typename V>
23 OSSIA_INLINE ossia::value operator()(
const List& val,
const U&
min,
const V&
max)
27 template <
typename U,
typename V>
28 OSSIA_INLINE ossia::value operator()(String&& val,
const U&
min,
const V&
max)
30 return std::move(val);
32 template <
typename U,
typename V>
33 OSSIA_INLINE ossia::value operator()(
const String& val,
const U&
min,
const V&
max)
39 OSSIA_INLINE ossia::value operator()(int32_t val, int32_t
min, int32_t
max)
41 return TernaryFun::compute(val,
min,
max);
43 OSSIA_INLINE ossia::value operator()(
float val,
float min,
float max)
45 return TernaryFun::compute(val,
min,
max);
47 OSSIA_INLINE ossia::value operator()(
char val,
char min,
char max)
49 return (
char)TernaryFun::compute((int32_t)val, (int32_t)
min, (int32_t)
max);
51 OSSIA_INLINE ossia::value operator()(
bool val,
bool min,
bool max)
53 return (
bool)TernaryFun::compute((int32_t)val, (int32_t)
min, (int32_t)
max);
56 template <std::
size_t N>
57 ossia::value operator()(
58 std::array<float, N> val,
const std::array<float, N>&
min,
59 const std::array<float, N>&
max)
61 for(std::size_t i = 0; i < N; i++)
63 val[i] = TernaryFun::compute(val[i],
min[i],
max[i]);
68 template <std::
size_t N>
69 ossia::value operator()(std::array<float, N> val,
float min,
float max)
71 for(std::size_t i = 0; i < N; i++)
73 val[i] = TernaryFun::compute(val[i],
min,
max);
80 ossia::value operator()(
81 const std::vector<ossia::value>& incoming,
const std::vector<ossia::value>&
min,
82 const std::vector<ossia::value>&
max)
84 std::vector<ossia::value> val;
85 const auto N = incoming.size();
86 const auto nmin =
min.size();
87 const auto nmax =
max.size();
88 if(N == nmin && N == nmax)
91 for(std::size_t i = 0; i < N; i++)
93 val.push_back(ossia::apply(*
this, incoming[i].v,
min[i].v,
max[i].v));
96 return ossia::value{std::move(val)};
99 ossia::value operator()(
100 std::vector<ossia::value>&& val,
const std::vector<ossia::value>&
min,
101 const std::vector<ossia::value>&
max)
103 const auto N = val.size();
104 const auto nmin =
min.size();
105 const auto nmax =
max.size();
106 if(N == nmin && N == nmax)
108 for(std::size_t i = 0; i < N; i++)
110 val[i] = ossia::apply(*
this, std::move(val)[i].v,
min[i].v,
max[i].v);
113 return ossia::value{std::move(val)};
116 ossia::value operator()(
117 const std::vector<ossia::value>& incoming,
const ossia::value&
min,
118 const ossia::value&
max)
120 std::vector<ossia::value> val;
121 const auto N = incoming.size();
123 for(std::size_t i = 0; i < N; i++)
125 val.push_back(ossia::apply(*
this, incoming[i].v,
min.v,
max.v));
127 return ossia::value{std::move(val)};
130 ossia::value operator()(
131 std::vector<ossia::value>&& val,
const ossia::value&
min,
const ossia::value&
max)
133 const auto N = val.size();
134 for(std::size_t i = 0; i < N; i++)
136 val[i] = ossia::apply(*
this, std::move(val)[i].v,
min.v,
max.v);
138 return ossia::value{std::move(val)};
142 operator()(
const ossia::value& val,
const ossia::value&
min,
const ossia::value&
max)
144 return ossia::apply(*
this, val.v,
min.v,
max.v);
148 operator()(ossia::value&& val,
const ossia::value&
min,
const ossia::value&
max)
150 return ossia::apply(*
this, std::move(val.v),
min.v,
max.v);
155template <
typename BinaryFun>
156struct apply_binary_fun_visitor
158 template <
typename T,
typename U>
159 OSSIA_INLINE ossia::value operator()(
const T& val,
const U&
min)
164#if !defined(FAST_COMPILES)
165 template <
typename U>
166 OSSIA_INLINE ossia::value operator()(List&& val,
const U&
min)
168 return std::move(val);
170 template <
typename U>
171 OSSIA_INLINE ossia::value operator()(
const List& val,
const U&
min)
175 template <
typename U>
176 OSSIA_INLINE ossia::value operator()(String&& val,
const U&
min)
178 return std::move(val);
180 template <
typename U>
181 OSSIA_INLINE ossia::value operator()(
const String& val,
const U&
min)
187 OSSIA_INLINE ossia::value operator()(int32_t val, int32_t
min)
189 return int32_t{BinaryFun::compute(val,
min)};
191 OSSIA_INLINE ossia::value operator()(
float val,
float min)
193 return float{BinaryFun::compute(val,
min)};
195 OSSIA_INLINE ossia::value operator()(
char val,
char min)
197 return (
char)BinaryFun::compute((int32_t)val, (int32_t)
min);
199 OSSIA_INLINE ossia::value operator()(
bool val,
bool min)
201 return (
bool)BinaryFun::compute((int32_t)val, (int32_t)
min);
204 template <std::
size_t N>
205 ossia::value operator()(std::array<float, N> val,
const std::array<float, N>&
min)
207 for(std::size_t i = 0; i < N; i++)
209 val[i] = BinaryFun::compute(val[i],
min[i]);
214 template <std::
size_t N>
215 ossia::value operator()(std::array<float, N> val,
float min)
217 for(std::size_t i = 0; i < N; i++)
219 val[i] = BinaryFun::compute(val[i],
min);
226 ossia::value operator()(
227 const std::vector<ossia::value>& incoming,
const std::vector<ossia::value>&
min)
229 std::vector<ossia::value> val;
230 const auto N = incoming.size();
231 const auto nmin =
min.size();
235 for(std::size_t i = 0; i < N; i++)
237 val.push_back(ossia::apply(*
this, incoming[i].v,
min[i].v));
240 return ossia::value{std::move(val)};
244 operator()(std::vector<ossia::value>&& val,
const std::vector<ossia::value>&
min)
246 const auto N = val.size();
247 const auto nmin =
min.size();
250 for(std::size_t i = 0; i < N; i++)
252 val[i] = ossia::apply(*
this, std::move(val)[i].v,
min[i].v);
255 return ossia::value{std::move(val)};
259 operator()(
const std::vector<ossia::value>& incoming,
const ossia::value&
min)
261 std::vector<ossia::value> val;
262 const auto N = incoming.size();
264 for(std::size_t i = 0; i < N; i++)
266 val.push_back(ossia::apply(*
this, incoming[i].v,
min.v));
268 return ossia::value{std::move(val)};
271 ossia::value operator()(std::vector<ossia::value>&& val,
const ossia::value&
min)
273 const auto N = val.size();
274 for(std::size_t i = 0; i < N; i++)
276 val[i] = ossia::apply(*
this, std::move(val)[i].v,
min.v);
278 return ossia::value{std::move(val)};
281 ossia::value operator()(
const ossia::value& val,
const ossia::value&
min)
283 return ossia::apply(*
this, val.v,
min.v);
286 ossia::value operator()(ossia::value&& val,
const ossia::value&
min)
288 return ossia::apply(*
this, std::move(val.v),
min.v);
OSSIA_INLINE constexpr auto min(const T a, const U b) noexcept -> typename std::conditional<(sizeof(T) > sizeof(U)), T, U >::type
min function tailored for values
Definition math.hpp:125
OSSIA_INLINE constexpr auto max(const T a, const U b) noexcept -> typename std::conditional<(sizeof(T) > sizeof(U)), T, U >::type
max function tailored for values
Definition math.hpp:96