2#include <ossia/detail/flat_set.hpp>
3#include <ossia/detail/small_vector.hpp>
20 return value::make<typename T::value_type>(*
value.min);
36struct domain_min_visitor_helper<domain_base<impulse>>
38 OSSIA_INLINE
ossia::value operator()(
const domain_base<impulse>& value)
const
45struct domain_min_visitor_helper<domain_base<std::string>>
47 OSSIA_INLINE
ossia::value operator()(
const domain_base<std::string>& value)
const
54struct domain_min_visitor_helper<domain_base<
ossia::value>>
56 OSSIA_INLINE
ossia::value operator()(
const domain_base<ossia::value>& value)
const
68struct domain_min_visitor_helper<vector_domain>
70 OSSIA_INLINE
ossia::value operator()(
const vector_domain& value)
const
76template <std::
size_t N>
77struct domain_min_visitor_helper<vecf_domain<N>>
79 OSSIA_INLINE
ossia::value operator()(
const vecf_domain<N>& value)
const
83 std::array<float, N> arr;
84#if !defined(OSSIA_FREESTANDING)
85 for(
auto& val : value.
min)
87 return
ossia::value{};
89 for(std::size_t i = 0; i < N; i++)
91 arr[i] = *value.min[i];
105 return value::make<typename T::value_type>(*
value.max);
121struct domain_max_visitor_helper<domain_base<impulse>>
123 OSSIA_INLINE
ossia::value operator()(
const domain_base<impulse>& value)
const
130struct domain_max_visitor_helper<domain_base<std::string>>
132 OSSIA_INLINE
ossia::value operator()(
const domain_base<std::string>& value)
const
139struct domain_max_visitor_helper<domain_base<
ossia::value>>
141 OSSIA_INLINE
ossia::value operator()(
const domain_base<ossia::value>& value)
const
153struct domain_max_visitor_helper<vector_domain>
155 OSSIA_INLINE
ossia::value operator()(
const vector_domain& value)
const
161template <std::
size_t N>
162struct domain_max_visitor_helper<vecf_domain<N>>
164 OSSIA_INLINE
ossia::value operator()(
const vecf_domain<N>& value)
const
166 std::array<float, N> arr;
167#if !defined(OSSIA_FREESTANDING)
168 for(
auto& val : value.
max)
170 return
ossia::value{};
172 for(std::size_t i = 0; i < N; i++)
174 arr[i] = *value.max[i];
182using float_minmax = std::pair<std::optional<float>, std::optional<float>>;
184struct domain_float_minmax_visitor_helper
186 OSSIA_INLINE float_minmax operator()(
const T& value)
const
190 ret.first = *value.min;
192 ret.second = *value.max;
198struct domain_float_minmax_visitor_helper<domain_base<bool>>
200 OSSIA_INLINE float_minmax operator()(
const domain_base<bool>& value)
const
202 return std::make_pair(0.f, 1.f);
207struct domain_float_minmax_visitor_helper<domain_base<impulse>>
209 OSSIA_INLINE float_minmax operator()(
const domain_base<impulse>& value)
const
216struct domain_float_minmax_visitor_helper<domain_base<std::string>>
218 OSSIA_INLINE float_minmax operator()(
const domain_base<std::string>& value)
const
225struct domain_float_minmax_visitor_helper<domain_base<
ossia::value>>
227 OSSIA_INLINE float_minmax operator()(
const domain_base<ossia::value>& value)
const
234 ret.first = ossia::convert<float>(*value.min);
236 ret.second = ossia::convert<float>(*value.max);
242struct domain_float_minmax_visitor_helper<vector_domain>
244 OSSIA_INLINE float_minmax operator()(
const vector_domain& value)
const {
return {}; }
248template <std::
size_t N>
249struct domain_float_minmax_visitor_helper<vecf_domain<N>>
251 OSSIA_INLINE float_minmax operator()(
const vecf_domain<N>&
value)
const
254 for(
const auto& m :
value.min)
256 ret.first = ret.first ? std::min(*ret.first, *m) : *m;
257 for(
const auto& m :
value.max)
259 ret.second = ret.second ? std::max(*ret.second, *m) : *m;
266struct domain_min_visitor
268 template <
typename T>
274 OSSIA_INLINE
ossia::value operator()(
const vector_domain& value)
const
276 return detail::domain_min_visitor_helper<vector_domain>{}(value);
279 template <std::
size_t N>
280 OSSIA_INLINE
ossia::value operator()(
const vecf_domain<N>& value)
const
282 return detail::domain_min_visitor_helper<vecf_domain<N>>{}(value);
285 template <
typename... T>
292struct domain_max_visitor
294 template <
typename T>
295 OSSIA_INLINE
ossia::value operator()(
const domain_base<T>& value)
const
297 return detail::domain_max_visitor_helper<domain_base<T>>{}(value);
300 OSSIA_INLINE
ossia::value operator()(
const vector_domain& value)
const
302 return detail::domain_max_visitor_helper<vector_domain>{}(value);
305 template <std::
size_t N>
306 OSSIA_INLINE
ossia::value operator()(
const vecf_domain<N>& value)
const
308 return detail::domain_max_visitor_helper<vecf_domain<N>>{}(value);
311 template <
typename... T>
318struct domain_float_minmax_visitor
320 using return_type = detail::float_minmax;
321 template <
typename T>
322 OSSIA_INLINE return_type operator()(
const domain_base<T>& value)
const
324 return detail::domain_float_minmax_visitor_helper<domain_base<T>>{}(value);
327 OSSIA_INLINE return_type operator()(
const vector_domain& value)
const
329 return detail::domain_float_minmax_visitor_helper<vector_domain>{}(value);
332 template <std::
size_t N>
333 OSSIA_INLINE return_type operator()(
const vecf_domain<N>& value)
const
335 return detail::domain_float_minmax_visitor_helper<vecf_domain<N>>{}(value);
338 template <
typename... T>
339 OSSIA_INLINE return_type operator()(
const T&...)
const
344struct domain_set_min_visitor
346 OSSIA_INLINE
void operator()(domain_base<int32_t>& domain, int32_t incoming)
348 domain.min = incoming;
350 OSSIA_INLINE
void operator()(domain_base<float>& domain,
float incoming)
352 domain.min = incoming;
354 OSSIA_INLINE
void operator()(domain_base<int32_t>& domain,
float incoming)
356 domain.min = incoming;
358 OSSIA_INLINE
void operator()(domain_base<float>& domain, int32_t incoming)
360 domain.min = incoming;
362 OSSIA_INLINE
void operator()(domain_base<bool>& domain,
bool incoming) { }
364 operator()(vector_domain& domain,
const std::vector<ossia::value>& incoming)
366 domain.min = incoming;
369 template <std::
size_t N>
370 OSSIA_INLINE
void operator()(vecf_domain<N>& domain,
float incoming)
372#if !defined(OSSIA_FREESTANDING)
373 for(std::size_t i = 0; i < N; i++)
374 domain.min[i] = incoming;
378 template <std::
size_t N>
379 OSSIA_INLINE
void operator()(vecf_domain<N>& domain,
int incoming)
381#if !defined(OSSIA_FREESTANDING)
382 for(std::size_t i = 0; i < N; i++)
383 domain.min[i] = incoming;
387 template <std::
size_t N>
389 operator()(vecf_domain<N>& domain,
const std::array<float, N>& incoming)
391#if !defined(OSSIA_FREESTANDING)
392 for(std::size_t i = 0; i < N; i++)
393 domain.min[i] = incoming[i];
397 template <std::
size_t N>
399 operator()(vecf_domain<N>& domain,
const std::vector<ossia::value>& incoming)
401#if !defined(OSSIA_FREESTANDING)
402 if(incoming.size() == N)
404 auto conv = ossia::convert<std::array<float, N>>(incoming);
405 for(std::size_t i = 0; i < N; i++)
406 domain.min[i] = conv[i];
410 for(std::size_t i = 0; i < N; i++)
411 domain.min[i] = std::nullopt;
416 template <
typename T>
417 OSSIA_INLINE
void operator()(domain_base<ossia::value>& domain,
const T& incoming)
419#if !defined(OSSIA_FREESTANDING)
427 template <
typename... U>
428 OSSIA_INLINE
void operator()(domain_base<int32_t>& domain, U&&...)
430 domain.min = std::nullopt;
432 template <
typename... U>
433 OSSIA_INLINE
void operator()(domain_base<float>& domain, U&&...)
435 domain.min = std::nullopt;
437 template <
typename... U>
438 OSSIA_INLINE
void operator()(domain_base<bool>& domain, U&&...)
441 template <
typename... U>
442 OSSIA_INLINE
void operator()(vector_domain& domain, U&&...)
446 template <std::size_t N,
typename... U>
447 OSSIA_INLINE
void operator()(vecf_domain<N>& domain, U&&...)
449#if !defined(OSSIA_FREESTANDING)
450 for(std::size_t i = 0; i < N; i++)
451 domain.min[i] = std::nullopt;
454 template <
typename... U>
455 OSSIA_INLINE
void operator()(domain_base<ossia::value>& domain, U&&...)
457 domain.min = std::nullopt;
460 template <
typename T,
typename... U>
461 OSSIA_INLINE
void operator()(
const domain_base<T>& domain, U&&...)
466struct domain_set_max_visitor
468 OSSIA_INLINE
void operator()(domain_base<int32_t>& domain, int32_t incoming)
470 domain.max = incoming;
472 OSSIA_INLINE
void operator()(domain_base<float>& domain,
float incoming)
474 domain.max = incoming;
476 OSSIA_INLINE
void operator()(domain_base<int32_t>& domain,
float incoming)
478 domain.max = incoming;
480 OSSIA_INLINE
void operator()(domain_base<float>& domain, int32_t incoming)
482 domain.max = incoming;
484 OSSIA_INLINE
void operator()(domain_base<bool>& domain,
bool incoming) { }
486 operator()(vector_domain& domain,
const std::vector<ossia::value>& incoming)
488 domain.max = incoming;
491 template <std::
size_t N>
492 OSSIA_INLINE
void operator()(vecf_domain<N>& domain,
float incoming)
494#if !defined(OSSIA_FREESTANDING)
495 for(std::size_t i = 0; i < N; i++)
496 domain.max[i] = incoming;
500 template <std::
size_t N>
501 OSSIA_INLINE
void operator()(vecf_domain<N>& domain,
int incoming)
503#if !defined(OSSIA_FREESTANDING)
504 for(std::size_t i = 0; i < N; i++)
505 domain.max[i] = incoming;
509 template <std::
size_t N>
511 operator()(vecf_domain<N>& domain,
const std::array<float, N>& incoming)
513#if !defined(OSSIA_FREESTANDING)
514 for(std::size_t i = 0; i < N; i++)
515 domain.max[i] = incoming[i];
519 template <std::
size_t N>
521 operator()(vecf_domain<N>& domain,
const std::vector<ossia::value>& incoming)
523#if !defined(OSSIA_FREESTANDING)
524 if(incoming.size() == N)
526 auto conv = ossia::convert<std::array<float, N>>(incoming);
527 for(std::size_t i = 0; i < N; i++)
528 domain.max[i] = conv[i];
532 for(std::size_t i = 0; i < N; i++)
533 domain.max[i] = std::nullopt;
538 template <
typename T>
539 OSSIA_INLINE
void operator()(domain_base<ossia::value>& domain,
const T& incoming)
541#if !defined(OSSIA_FREESTANDING)
547 template <
typename... U>
548 OSSIA_INLINE
void operator()(domain_base<int32_t>& domain, U&&...)
550 domain.max = std::nullopt;
552 template <
typename... U>
553 OSSIA_INLINE
void operator()(domain_base<float>& domain, U&&...)
555 domain.max = std::nullopt;
557 template <
typename... U>
558 OSSIA_INLINE
void operator()(domain_base<bool>& domain, U&&...)
561 template <
typename... U>
562 OSSIA_INLINE
void operator()(vector_domain& domain, U&&...)
566 template <std::size_t N,
typename... U>
567 OSSIA_INLINE
void operator()(vecf_domain<N>& domain, U&&...)
569#if !defined(OSSIA_FREESTANDING)
570 for(std::size_t i = 0; i < N; i++)
571 domain.max[i] = std::nullopt;
574 template <
typename... U>
575 OSSIA_INLINE
void operator()(domain_base<ossia::value>& domain, U&&...)
577 domain.max = std::nullopt;
580 template <
typename T,
typename... U>
581 OSSIA_INLINE
void operator()(
const domain_base<T>& domain, U&&...)
586struct domain_minmax_creation_visitor
588 template <
typename T>
589 OSSIA_INLINE domain operator()(T
min, T
max)
591 return domain_base<T>(
min,
max);
594 OSSIA_INLINE domain operator()(
bool min,
bool max) {
return domain_base<bool>{}; }
596 template <std::
size_t N>
598 operator()(
const std::array<float, N>& lhs,
const std::array<float, N>& rhs)
600 return vecf_domain<N>(lhs, rhs);
604 operator()(
const std::vector<ossia::value>&
min,
const std::vector<ossia::value>&
max)
606 return vector_domain(
min,
max);
609 operator()(std::vector<ossia::value>&&
min, std::vector<ossia::value>&&
max)
611 return vector_domain(std::move(
min), std::move(
max));
614 OSSIA_INLINE domain operator()(impulse, impulse) {
return domain_base<impulse>{}; }
616 OSSIA_INLINE domain operator()(
const std::string&,
const std::string&)
618 return domain_base<std::string>();
620 OSSIA_INLINE domain operator()(
const value_map_type&,
const value_map_type&)
626 template <
typename T,
typename U>
627 OSSIA_INLINE domain operator()(
const T&,
const U&)
633struct domain_min_creation_visitor
635 template <
typename T>
636 OSSIA_INLINE domain operator()(T
min)
639 dom.min = std::move(
min);
643 OSSIA_INLINE domain operator()(
bool min) {
return domain_base<bool>{}; }
645 template <std::
size_t N>
646 OSSIA_INLINE domain operator()(
const std::array<float, N>&
min)
649#if !defined(OSSIA_FREESTANDING)
650 for(std::size_t i = 0; i < N; i++)
658 OSSIA_INLINE domain operator()(
const std::vector<ossia::value>&
min)
664 OSSIA_INLINE domain operator()(
const value_map_type&
min) {
return {}; }
665 OSSIA_INLINE domain operator()(std::vector<ossia::value>&&
min)
667 return vector_domain(std::move(
min), std::vector<ossia::value>(
min.size()));
670 OSSIA_INLINE domain operator()(impulse) {
return domain_base<impulse>{}; }
672 OSSIA_INLINE domain operator()(
const std::string&)
674 return domain_base<std::string>();
678struct domain_max_creation_visitor
680 template <
typename T>
681 OSSIA_INLINE domain operator()(T
max)
684 dom.max = std::move(
max);
688 OSSIA_INLINE domain operator()(
bool max) {
return domain_base<bool>{}; }
690 template <std::
size_t N>
691 OSSIA_INLINE domain operator()(
const std::array<float, N>&
max)
694#if !defined(OSSIA_FREESTANDING)
695 for(std::size_t i = 0; i < N; i++)
703 OSSIA_INLINE domain operator()(
const std::vector<ossia::value>&
max)
709 OSSIA_INLINE domain operator()(std::vector<ossia::value>&&
max)
711 return vector_domain(std::move(
max), std::vector<ossia::value>(
max.size()));
714 OSSIA_INLINE domain operator()(
const value_map_type&
min) {
return {}; }
715 OSSIA_INLINE domain operator()(impulse) {
return domain_base<impulse>{}; }
717 OSSIA_INLINE domain operator()(
const std::string&)
719 return domain_base<std::string>();
731 const ossia::small_vector<ossia::value, 2>& values;
732 template <
typename T>
733 domain operator()(
const T&)
737 for(
auto&
value : values)
739 if(
auto r =
value.target<T>())
740 dom.values.push_back(*r);
745 domain operator()(
bool) {
return domain_base<bool>{}; }
747 domain operator()(
const std::vector<ossia::value>& orig)
750 ossia::flat_set<ossia::value> vals;
752 for(
const auto&
value : values)
756 = std::vector<ossia::flat_set<ossia::value>>(orig.size(), std::move(vals));
761 OSSIA_INLINE
domain operator()(
const value_map_type&
min) {
return {}; }
763 template <std::
size_t N>
764 domain operator()(
const std::array<float, N>&)
767#if !defined(OSSIA_FREESTANDING)
768 ossia::flat_set<float> vals;
770 for(
const auto&
value : values)
771 if(
auto r =
value.target<
float>())
774 for(std::size_t i = 0; i < N - 1; i++)
775 res.values[i] = vals;
776 res.values[N - 1] = std::move(vals);
The value class.
Definition value.hpp:173
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
Max ///.
Definition min_max.hpp:101
Min ///.
Definition min_max.hpp:16
The domain_value_set_creation_visitor struct.
Definition min_max.hpp:730
domain A domain of values
Definition domain_base.hpp:23