WebCFace 3.2.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)
34 -> std::bool_constant<
35 std::is_convertible_v<decltype(*std::begin(std::declval<T>())),
36 double> &&
37 std::is_convertible_v<decltype(*std::end(std::declval<T>())), double>> {
38 return {};
39}
40template <typename T>
41using IsArrayLike = decltype(isArrayLike(std::declval<T>()));
42
43constexpr std::true_type arraySizeMatch(...) { return {}; }
44template <typename T, std::size_t Num>
45constexpr auto arraySizeMatch(T, std::integral_constant<std::size_t, Num>)
46 -> std::bool_constant<std::tuple_size<T>::value == Num> {
47 return {};
48}
49template <typename T, std::size_t Num>
51 std::declval<T>(), std::integral_constant<std::size_t, Num>()));
52
58template <typename T>
59struct ArrayLikeTrait : ArrayLikeTraitCheck<IsArrayLike<T>::value> {};
64template <typename T, std::size_t N>
65struct ArrayLikeTrait<T[N]>
66 : ArrayLikeTraitCheck<std::is_convertible_v<T, double>> {};
67template <typename T, std::size_t N>
68struct ArrayLikeTrait<T (&)[N]> : ArrayLikeTrait<T[N]> {};
69
75template <typename T, std::size_t Num>
76struct ArraySizeTrait : ArraySizeTraitCheck<ArraySizeMatch<T, Num>::value> {};
81template <typename T, std::size_t N, std::size_t Num>
82struct ArraySizeTrait<T[N], Num> : ArraySizeTraitCheck<N == Num> {};
83template <typename T, std::size_t N, std::size_t Num>
84struct ArraySizeTrait<T (&)[N], Num> : ArraySizeTrait<T[N], Num> {};
85
86template <typename T>
87std::vector<double> arrayLikeToVector(const T &array) {
88 return std::vector<double>(std::begin(array), std::end(array));
89}
90
91template <std::size_t Num, typename T>
92std::array<double, Num> arrayLikeToArray(const T &array) {
93 std::array<double, Num> ret{};
94 std::size_t n = 0;
95 auto it = std::begin(array);
96 for (; n < Num && it != std::end(array); ++it, ++n) {
97 ret[n] = *it;
98 }
99 if (n == Num && it == std::end(array)) {
100 return ret;
101 } else {
102 throw InvalidArgument(
103 "array size mismatch, expected: " + std::to_string(Num) +
104 ", got: " + std::to_string(n));
105 }
106}
107
108} // 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:41
decltype(arraySizeMatch(std::declval< T >(), std::integral_constant< std::size_t, Num >())) ArraySizeMatch
Definition array_like.h:51
std::vector< double > arrayLikeToVector(const T &array)
Definition array_like.h:87
std::array< double, Num > arrayLikeToArray(const T &array)
Definition array_like.h:92
constexpr std::true_type arraySizeMatch(...)
Definition array_like.h:43
その他のパラメーターエラー
Definition exception.h:16
TraitOkType ArrayLike
Definition array_like.h:22
Definition array_like.h:19
Definition array_like.h:59
TraitOkType SizeMatchOrDynamic
Definition array_like.h:28
Definition array_like.h:25
Definition array_like.h:76
#define WEBCFACE_NS_END
Definition webcface-config.h:113
#define WEBCFACE_NS_BEGIN
Definition webcface-config.h:112