WebCFace 2.9.0
Web-based Communication Framework & Dashboard-like UI
Loading...
Searching...
No Matches
array_like.h
Go to the documentation of this file.
1#pragma once
2#include <stdexcept>
3#include <vector>
4#include <array>
5#include <type_traits>
6#include <string>
7#include "trait.h"
9#ifdef WEBCFACE_MESON
10#include "webcface-config.h"
11#else
12#include "webcface/common/webcface-config.h"
13#endif
14
16namespace traits {
17
18template <bool>
20template <>
21struct ArrayLikeTraitCheck<true> {
23};
24template <bool>
26template <>
27struct ArraySizeTraitCheck<true> {
29};
30
31constexpr std::false_type isArrayLike(...) { return {}; }
32template <typename T>
33constexpr auto isArrayLike(T) -> std::bool_constant<
34 std::is_convertible_v<decltype(*std::begin(std::declval<T>())), double> &&
35 std::is_convertible_v<decltype(*std::end(std::declval<T>())), double>> {
36 return {};
37}
38template <typename T>
39using IsArrayLike = decltype(isArrayLike(std::declval<T>()));
40
41constexpr std::true_type arraySizeMatch(...) { return {}; }
42template <typename T, std::size_t Num>
43constexpr auto arraySizeMatch(T, std::integral_constant<std::size_t, Num>)
44 -> std::bool_constant<std::tuple_size<T>::value == Num> {
45 return {};
46}
47template <typename T, std::size_t Num>
49 std::declval<T>(), std::integral_constant<std::size_t, Num>()));
50
56template <typename T>
57struct ArrayLikeTrait : ArrayLikeTraitCheck<IsArrayLike<T>::value> {};
62template <typename T, std::size_t N>
63struct ArrayLikeTrait<T[N]>
64 : ArrayLikeTraitCheck<std::is_convertible_v<T, double>> {};
65template <typename T, std::size_t N>
66struct ArrayLikeTrait<T (&)[N]> : ArrayLikeTrait<T[N]> {};
67
73template <typename T, std::size_t Num>
74struct ArraySizeTrait : ArraySizeTraitCheck<ArraySizeMatch<T, Num>::value> {};
79template <typename T, std::size_t N, std::size_t Num>
80struct ArraySizeTrait<T[N], Num> : ArraySizeTraitCheck<N == Num> {};
81template <typename T, std::size_t N, std::size_t Num>
82struct ArraySizeTrait<T (&)[N], Num> : ArraySizeTrait<T[N], Num> {};
83
84template <typename T>
85std::vector<double> arrayLikeToVector(const T &array) {
86 return std::vector<double>(std::begin(array), std::end(array));
87}
88
89template <std::size_t Num, typename T>
90std::array<double, Num> arrayLikeToArray(const T &array) {
91 std::array<double, Num> ret{};
92 std::size_t n = 0;
93 auto it = std::begin(array);
94 for (; n < Num && it != std::end(array); ++it, ++n) {
95 ret[n] = *it;
96 }
97 if (n == Num && it == std::end(array)) {
98 return ret;
99 } else {
100 throw InvalidArgument(
101 "array size mismatch, expected: " + std::to_string(Num) +
102 ", got: " + std::to_string(n));
103 }
104}
105
106} // namespace traits
std::nullptr_t TraitOkType
Definition trait.h:11
constexpr std::false_type isArrayLike(...)
Definition array_like.h:31
decltype(isArrayLike(std::declval< T >())) IsArrayLike
Definition array_like.h:39
decltype(arraySizeMatch(std::declval< T >(), std::integral_constant< std::size_t, Num >())) ArraySizeMatch
Definition array_like.h:49
std::vector< double > arrayLikeToVector(const T &array)
Definition array_like.h:85
std::array< double, Num > arrayLikeToArray(const T &array)
Definition array_like.h:90
constexpr std::true_type arraySizeMatch(...)
Definition array_like.h:41
その他のパラメーターエラー
Definition exception.h:89
TraitOkType ArrayLike
Definition array_like.h:22
Definition array_like.h:19
Definition array_like.h:57
TraitOkType SizeMatchOrDynamic
Definition array_like.h:28
Definition array_like.h:25
Definition array_like.h:74
#define WEBCFACE_NS_END
Definition webcface-config.h:118
#define WEBCFACE_NS_BEGIN
Definition webcface-config.h:117