2 #include <ossia/detail/flat_set.hpp>
3 #include <ossia/detail/small_vector.hpp>
18 return value::make<typename T::value_type>(*
value.min);
34 struct domain_min_visitor_helper<domain_base<impulse>>
36 OSSIA_INLINE
ossia::value operator()(
const domain_base<impulse>& value)
const
43 struct domain_min_visitor_helper<domain_base<std::string>>
45 OSSIA_INLINE
ossia::value operator()(
const domain_base<std::string>& value)
const
52 struct domain_min_visitor_helper<domain_base<
ossia::value>>
54 OSSIA_INLINE
ossia::value operator()(
const domain_base<ossia::value>& value)
const
66 struct domain_min_visitor_helper<vector_domain>
68 OSSIA_INLINE
ossia::value operator()(
const vector_domain& value)
const
74 template <std::
size_t N>
75 struct domain_min_visitor_helper<vecf_domain<N>>
77 OSSIA_INLINE
ossia::value operator()(
const vecf_domain<N>& value)
const
81 std::array<float, N> arr;
82 for(
auto& val : value.min)
86 for(std::size_t i = 0; i < N; i++)
88 arr[i] = *value.min[i];
102 return value::make<typename T::value_type>(*
value.max);
118 struct domain_max_visitor_helper<domain_base<impulse>>
120 OSSIA_INLINE
ossia::value operator()(
const domain_base<impulse>& value)
const
127 struct domain_max_visitor_helper<domain_base<std::string>>
129 OSSIA_INLINE
ossia::value operator()(
const domain_base<std::string>& value)
const
136 struct domain_max_visitor_helper<domain_base<
ossia::value>>
138 OSSIA_INLINE
ossia::value operator()(
const domain_base<ossia::value>& value)
const
150 struct domain_max_visitor_helper<vector_domain>
152 OSSIA_INLINE
ossia::value operator()(
const vector_domain& value)
const
158 template <std::
size_t N>
159 struct domain_max_visitor_helper<vecf_domain<N>>
161 OSSIA_INLINE
ossia::value operator()(
const vecf_domain<N>& value)
const
163 std::array<float, N> arr;
164 for(
auto& val : value.max)
168 for(std::size_t i = 0; i < N; i++)
170 arr[i] = *value.max[i];
178 using float_minmax = std::pair<std::optional<float>, std::optional<float>>;
179 template <
typename T>
180 struct domain_float_minmax_visitor_helper
182 OSSIA_INLINE float_minmax operator()(
const T& value)
const
186 ret.first = *value.min;
188 ret.second = *value.max;
194 struct domain_float_minmax_visitor_helper<domain_base<bool>>
196 OSSIA_INLINE float_minmax operator()(
const domain_base<bool>& value)
const
198 return std::make_pair(0.f, 1.f);
203 struct domain_float_minmax_visitor_helper<domain_base<impulse>>
205 OSSIA_INLINE float_minmax operator()(
const domain_base<impulse>& value)
const
212 struct domain_float_minmax_visitor_helper<domain_base<std::string>>
214 OSSIA_INLINE float_minmax operator()(
const domain_base<std::string>& value)
const
221 struct domain_float_minmax_visitor_helper<domain_base<
ossia::value>>
223 OSSIA_INLINE float_minmax operator()(
const domain_base<ossia::value>& value)
const
230 ret.first = ossia::convert<float>(*value.min);
232 ret.second = ossia::convert<float>(*value.max);
238 struct domain_float_minmax_visitor_helper<vector_domain>
240 OSSIA_INLINE float_minmax operator()(
const vector_domain& value)
const {
return {}; }
243 template <std::
size_t N>
244 struct domain_float_minmax_visitor_helper<vecf_domain<N>>
246 OSSIA_INLINE float_minmax operator()(
const vecf_domain<N>& value)
const {
return {}; }
251 struct domain_min_visitor
253 template <
typename T>
254 OSSIA_INLINE
ossia::value operator()(
const domain_base<T>& value)
const
256 return detail::domain_min_visitor_helper<domain_base<T>>{}(value);
259 OSSIA_INLINE
ossia::value operator()(
const vector_domain& value)
const
261 return detail::domain_min_visitor_helper<vector_domain>{}(value);
264 template <std::
size_t N>
265 OSSIA_INLINE
ossia::value operator()(
const vecf_domain<N>& value)
const
267 return detail::domain_min_visitor_helper<vecf_domain<N>>{}(value);
270 template <
typename... T>
277 struct domain_max_visitor
279 template <
typename T>
280 OSSIA_INLINE
ossia::value operator()(
const domain_base<T>& value)
const
282 return detail::domain_max_visitor_helper<domain_base<T>>{}(value);
285 OSSIA_INLINE
ossia::value operator()(
const vector_domain& value)
const
287 return detail::domain_max_visitor_helper<vector_domain>{}(value);
290 template <std::
size_t N>
291 OSSIA_INLINE
ossia::value operator()(
const vecf_domain<N>& value)
const
293 return detail::domain_max_visitor_helper<vecf_domain<N>>{}(value);
296 template <
typename... T>
303 struct domain_float_minmax_visitor
305 using return_type = detail::float_minmax;
306 template <
typename T>
307 OSSIA_INLINE return_type operator()(
const domain_base<T>& value)
const
309 return detail::domain_float_minmax_visitor_helper<domain_base<T>>{}(value);
312 OSSIA_INLINE return_type operator()(
const vector_domain& value)
const
314 return detail::domain_float_minmax_visitor_helper<vector_domain>{}(value);
317 template <std::
size_t N>
318 OSSIA_INLINE return_type operator()(
const vecf_domain<N>& value)
const
320 return detail::domain_float_minmax_visitor_helper<vecf_domain<N>>{}(value);
323 template <
typename... T>
324 OSSIA_INLINE return_type operator()(
const T&...)
const
329 struct domain_set_min_visitor
331 OSSIA_INLINE
void operator()(domain_base<int32_t>& domain, int32_t incoming)
333 domain.min = incoming;
335 OSSIA_INLINE
void operator()(domain_base<float>& domain,
float incoming)
337 domain.min = incoming;
339 OSSIA_INLINE
void operator()(domain_base<int32_t>& domain,
float incoming)
341 domain.min = incoming;
343 OSSIA_INLINE
void operator()(domain_base<float>& domain, int32_t incoming)
345 domain.min = incoming;
347 OSSIA_INLINE
void operator()(domain_base<bool>& domain,
bool incoming) { }
349 operator()(vector_domain& domain,
const std::vector<ossia::value>& incoming)
351 domain.min = incoming;
354 template <std::
size_t N>
355 OSSIA_INLINE
void operator()(vecf_domain<N>& domain,
float incoming)
357 for(std::size_t i = 0; i < N; i++)
358 domain.min[i] = incoming;
361 template <std::
size_t N>
362 OSSIA_INLINE
void operator()(vecf_domain<N>& domain,
int incoming)
364 for(std::size_t i = 0; i < N; i++)
365 domain.min[i] = incoming;
368 template <std::
size_t N>
370 operator()(vecf_domain<N>& domain,
const std::array<float, N>& incoming)
372 for(std::size_t i = 0; i < N; i++)
373 domain.min[i] = incoming[i];
376 template <std::
size_t N>
378 operator()(vecf_domain<N>& domain,
const std::vector<ossia::value>& incoming)
380 if(incoming.size() == N)
382 auto conv = ossia::convert<std::array<float, N>>(incoming);
383 for(std::size_t i = 0; i < N; i++)
384 domain.min[i] = conv[i];
388 for(std::size_t i = 0; i < N; i++)
389 domain.min[i] = std::nullopt;
393 template <
typename T>
394 OSSIA_INLINE
void operator()(domain_base<ossia::value>& domain,
const T& incoming)
402 template <
typename... U>
403 OSSIA_INLINE
void operator()(domain_base<int32_t>& domain, U&&...)
405 domain.min = std::nullopt;
407 template <
typename... U>
408 OSSIA_INLINE
void operator()(domain_base<float>& domain, U&&...)
410 domain.min = std::nullopt;
412 template <
typename... U>
413 OSSIA_INLINE
void operator()(domain_base<bool>& domain, U&&...)
416 template <
typename... U>
417 OSSIA_INLINE
void operator()(vector_domain& domain, U&&...)
421 template <std::size_t N,
typename... U>
422 OSSIA_INLINE
void operator()(vecf_domain<N>& domain, U&&...)
424 for(std::size_t i = 0; i < N; i++)
425 domain.min[i] = std::nullopt;
427 template <
typename... U>
428 OSSIA_INLINE
void operator()(domain_base<ossia::value>& domain, U&&...)
430 domain.min = std::nullopt;
433 template <
typename T,
typename... U>
434 OSSIA_INLINE
void operator()(
const domain_base<T>& domain, U&&...)
439 struct domain_set_max_visitor
441 OSSIA_INLINE
void operator()(domain_base<int32_t>& domain, int32_t incoming)
443 domain.max = incoming;
445 OSSIA_INLINE
void operator()(domain_base<float>& domain,
float incoming)
447 domain.max = incoming;
449 OSSIA_INLINE
void operator()(domain_base<int32_t>& domain,
float incoming)
451 domain.max = incoming;
453 OSSIA_INLINE
void operator()(domain_base<float>& domain, int32_t incoming)
455 domain.max = incoming;
457 OSSIA_INLINE
void operator()(domain_base<bool>& domain,
bool incoming) { }
459 operator()(vector_domain& domain,
const std::vector<ossia::value>& incoming)
461 domain.max = incoming;
464 template <std::
size_t N>
465 OSSIA_INLINE
void operator()(vecf_domain<N>& domain,
float incoming)
467 for(std::size_t i = 0; i < N; i++)
468 domain.max[i] = incoming;
471 template <std::
size_t N>
472 OSSIA_INLINE
void operator()(vecf_domain<N>& domain,
int incoming)
474 for(std::size_t i = 0; i < N; i++)
475 domain.max[i] = incoming;
478 template <std::
size_t N>
480 operator()(vecf_domain<N>& domain,
const std::array<float, N>& incoming)
482 for(std::size_t i = 0; i < N; i++)
483 domain.max[i] = incoming[i];
486 template <std::
size_t N>
488 operator()(vecf_domain<N>& domain,
const std::vector<ossia::value>& incoming)
490 if(incoming.size() == N)
492 auto conv = ossia::convert<std::array<float, N>>(incoming);
493 for(std::size_t i = 0; i < N; i++)
494 domain.max[i] = conv[i];
498 for(std::size_t i = 0; i < N; i++)
499 domain.max[i] = std::nullopt;
503 template <
typename T>
504 OSSIA_INLINE
void operator()(domain_base<ossia::value>& domain,
const T& incoming)
510 template <
typename... U>
511 OSSIA_INLINE
void operator()(domain_base<int32_t>& domain, U&&...)
513 domain.max = std::nullopt;
515 template <
typename... U>
516 OSSIA_INLINE
void operator()(domain_base<float>& domain, U&&...)
518 domain.max = std::nullopt;
520 template <
typename... U>
521 OSSIA_INLINE
void operator()(domain_base<bool>& domain, U&&...)
524 template <
typename... U>
525 OSSIA_INLINE
void operator()(vector_domain& domain, U&&...)
529 template <std::size_t N,
typename... U>
530 OSSIA_INLINE
void operator()(vecf_domain<N>& domain, U&&...)
532 for(std::size_t i = 0; i < N; i++)
533 domain.max[i] = std::nullopt;
535 template <
typename... U>
536 OSSIA_INLINE
void operator()(domain_base<ossia::value>& domain, U&&...)
538 domain.max = std::nullopt;
541 template <
typename T,
typename... U>
542 OSSIA_INLINE
void operator()(
const domain_base<T>& domain, U&&...)
547 struct domain_minmax_creation_visitor
549 template <
typename T>
550 OSSIA_INLINE domain operator()(T
min, T
max)
552 return domain_base<T>(
min,
max);
555 OSSIA_INLINE domain operator()(
bool min,
bool max) {
return domain_base<bool>{}; }
557 template <std::
size_t N>
559 operator()(
const std::array<float, N>& lhs,
const std::array<float, N>& rhs)
561 return vecf_domain<N>(lhs, rhs);
565 operator()(
const std::vector<ossia::value>&
min,
const std::vector<ossia::value>&
max)
567 return vector_domain(
min,
max);
570 operator()(std::vector<ossia::value>&&
min, std::vector<ossia::value>&&
max)
572 return vector_domain(std::move(
min), std::move(
max));
575 OSSIA_INLINE domain operator()(impulse, impulse) {
return domain_base<impulse>{}; }
577 OSSIA_INLINE domain operator()(
const std::string&,
const std::string&)
579 return domain_base<std::string>();
581 OSSIA_INLINE domain operator()(
const value_map_type&,
const value_map_type&)
587 template <
typename T,
typename U>
588 OSSIA_INLINE domain operator()(
const T&,
const U&)
594 struct domain_min_creation_visitor
596 template <
typename T>
597 OSSIA_INLINE domain operator()(T
min)
600 dom.min = std::move(
min);
604 OSSIA_INLINE domain operator()(
bool min) {
return domain_base<bool>{}; }
606 template <std::
size_t N>
607 OSSIA_INLINE domain operator()(
const std::array<float, N>&
min)
610 for(std::size_t i = 0; i < N; i++)
617 OSSIA_INLINE domain operator()(
const std::vector<ossia::value>&
min)
623 OSSIA_INLINE domain operator()(
const value_map_type&
min) {
return {}; }
624 OSSIA_INLINE domain operator()(std::vector<ossia::value>&&
min)
626 return vector_domain(std::move(
min), std::vector<ossia::value>(
min.size()));
629 OSSIA_INLINE domain operator()(impulse) {
return domain_base<impulse>{}; }
631 OSSIA_INLINE domain operator()(
const std::string&)
633 return domain_base<std::string>();
637 struct domain_max_creation_visitor
639 template <
typename T>
640 OSSIA_INLINE domain operator()(T
max)
643 dom.max = std::move(
max);
647 OSSIA_INLINE domain operator()(
bool max) {
return domain_base<bool>{}; }
649 template <std::
size_t N>
650 OSSIA_INLINE domain operator()(
const std::array<float, N>&
max)
653 for(std::size_t i = 0; i < N; i++)
660 OSSIA_INLINE domain operator()(
const std::vector<ossia::value>&
max)
666 OSSIA_INLINE domain operator()(std::vector<ossia::value>&&
max)
668 return vector_domain(std::move(
max), std::vector<ossia::value>(
max.size()));
671 OSSIA_INLINE domain operator()(
const value_map_type&
min) {
return {}; }
672 OSSIA_INLINE domain operator()(impulse) {
return domain_base<impulse>{}; }
674 OSSIA_INLINE domain operator()(
const std::string&)
676 return domain_base<std::string>();
688 const ossia::small_vector<ossia::value, 2>& values;
689 template <
typename T>
690 domain operator()(
const T&)
694 for(
auto&
value : values)
696 if(
auto r =
value.target<T>())
697 dom.values.push_back(*r);
702 domain operator()(
bool) {
return domain_base<bool>{}; }
704 domain operator()(
const std::vector<ossia::value>& orig)
707 ossia::flat_set<ossia::value> vals;
709 for(
const auto&
value : values)
713 = std::vector<ossia::flat_set<ossia::value>>(orig.size(), std::move(vals));
718 OSSIA_INLINE
domain operator()(
const value_map_type&
min) {
return {}; }
720 template <std::
size_t N>
721 domain operator()(
const std::array<float, N>&)
724 ossia::flat_set<float> vals;
726 for(
const auto&
value : values)
727 if(
auto r =
value.target<
float>())
730 for(std::size_t i = 0; i < N - 1; i++)
731 res.values[i] = vals;
732 res.values[N - 1] = std::move(vals);
The value class.
Definition: value.hpp:173
constexpr OSSIA_INLINE 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
constexpr OSSIA_INLINE 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:98
Min ///.
Definition: min_max.hpp:14
The domain_value_set_creation_visitor struct.
Definition: min_max.hpp:687
domain A domain of values
Definition: domain_base.hpp:23