WebCFace 2.9.0
Web-based Communication Framework & Dashboard-like UI
Loading...
Searching...
No Matches
val_adaptor_vec.h
Go to the documentation of this file.
1#pragma once
2#include "val_adaptor.h"
3#ifdef WEBCFACE_MESON
4#include "webcface-config.h"
5#else
6#include "webcface/common/webcface-config.h"
7#endif
8
10
17 mutable std::vector<ValAdaptor> vec;
18
19 public:
21 ValAdaptorVector(const ValAdaptor &val);
22 ValAdaptorVector &operator=(const ValAdaptor &val);
23 ValAdaptorVector(std::vector<ValAdaptor> init);
24 ValAdaptorVector &operator=(std::vector<ValAdaptor> init);
25
27 ValAdaptorVector &operator=(StringInitializer str);
28
29 template <typename T,
30 typename std::enable_if_t<
31 !std::is_same_v<ValAdaptor, T> &&
32 !std::is_same_v<ValAdaptorVector, T> &&
33 !std::is_constructible_v<StringInitializer, T> &&
34 std::is_constructible_v<ValAdaptor, T>,
35 std::nullptr_t> = nullptr>
36 explicit ValAdaptorVector(T &&val)
37 : ValAdaptorVector(ValAdaptor(std::forward<T>(val))) {}
38 template <typename T,
39 typename std::enable_if_t<
40 !std::is_same_v<ValAdaptor, T> &&
41 !std::is_same_v<ValAdaptorVector, T> &&
42 !std::is_constructible_v<StringInitializer, T> &&
43 std::is_constructible_v<ValAdaptor, T>,
44 std::nullptr_t> = nullptr>
46 return *this = ValAdaptor(std::forward<T>(val));
47 }
48
49 template <
50 typename R,
51 typename std::enable_if_t<
52 !std::is_same_v<ValAdaptor, R> &&
53 !std::is_same_v<ValAdaptorVector, R> &&
54 !std::is_constructible_v<StringInitializer, R> &&
55 !std::is_constructible_v<ValAdaptor, R> &&
56 std::is_constructible_v<
57 ValAdaptor, decltype(*std::begin(std::declval<R>()))> &&
58 std::is_constructible_v<ValAdaptor,
59 decltype(*std::end(std::declval<R>()))>,
60 std::nullptr_t> = nullptr>
61 ValAdaptorVector(const R &range)
62 : vec(std::begin(range), std::end(range)) {}
63 template <
64 typename R,
65 typename std::enable_if_t<
66 !std::is_same_v<ValAdaptor, R> &&
67 !std::is_same_v<ValAdaptorVector, R> &&
68 !std::is_constructible_v<StringInitializer, R> &&
69 !std::is_constructible_v<ValAdaptor, R> &&
70 std::is_constructible_v<
71 ValAdaptor, decltype(*std::begin(std::declval<R>()))> &&
72 std::is_constructible_v<ValAdaptor,
73 decltype(*std::end(std::declval<R>()))>,
74 std::nullptr_t> = nullptr>
75 ValAdaptorVector &operator=(const R &range) {
76 return *this =
77 std::vector<ValAdaptor>(std::begin(range), std::end(range));
78 }
79 template <typename T, std::size_t N,
80 typename std::enable_if_t<
81 !std::is_same_v<T, char> && !std::is_same_v<T, wchar_t> &&
82 std::is_convertible_v<T, ValAdaptor>,
83 std::nullptr_t> = nullptr>
84 ValAdaptorVector(const T (&range)[N])
85 : vec(std::begin(range), std::end(range)) {}
86 template <typename T, std::size_t N,
87 typename std::enable_if_t<
88 !std::is_same_v<T, char> && !std::is_same_v<T, wchar_t> &&
89 std::is_convertible_v<T, ValAdaptor>,
90 std::nullptr_t> = nullptr>
91 ValAdaptorVector &operator=(const T (&range)[N]) {
92 return *this =
93 std::vector<ValAdaptor>(std::begin(range), std::end(range));
94 }
95
96 const ValAdaptor &get() const;
97 ValType valType() const;
98
99 explicit operator const ValAdaptor &() const { return get(); }
100 template <typename T,
101 typename std::enable_if_t<std::is_convertible_v<ValAdaptor, T>,
102 std::nullptr_t> = nullptr>
103 operator T() const {
104 return get().as<T>();
105 }
106 template <typename T,
107 typename std::enable_if_t<!std::is_convertible_v<ValAdaptor, T>,
108 std::nullptr_t> = nullptr,
109#ifdef _MSC_VER
110 // gccでなぜか正しく機能しない
111 typename = decltype(std::declval<ValAdaptor>().operator T())>
112#else
113 // msvcでなぜか正しく機能しない
114 typename std::enable_if_t<std::is_constructible_v<T, ValAdaptor>,
115 std::nullptr_t> = nullptr>
116#endif
117 explicit operator T() const {
118 return get().as<T>();
119 }
120 template <typename T,
121 typename = std::void_t<
122 decltype(std::declval<ValAdaptor>().operator T())>>
123 std::vector<T> asVector() const {
124 return std::vector<T>(vec.begin(), vec.end());
125 }
126 template <typename T,
127 typename = std::void_t<
128 decltype(std::declval<ValAdaptor>().operator T())>>
129 operator std::vector<T>() const {
130 return asVector<T>();
131 }
132 template <typename T, std::size_t N,
133 typename = std::void_t<
134 decltype(std::declval<ValAdaptor>().operator T())>>
135 std::array<T, N> asArray() const {
136 if (N != vec.size()) {
137 throw std::invalid_argument(
138 "array size mismatch, expected: " + std::to_string(N) +
139 ", got: " + std::to_string(vec.size()));
140 }
141 std::array<T, N> a;
142 for (std::size_t i = 0; i < N; i++) {
143 a[i] = vec[i].as<T>();
144 }
145 return a;
146 }
147 template <typename T, std::size_t N,
148 typename = std::void_t<
149 decltype(std::declval<ValAdaptor>().operator T())>>
150 operator std::array<T, N>() const {
151 return asArray<T, N>();
152 }
153
154 template <typename T>
155 T as() const {
156 if constexpr (std::is_same_v<T, ValAdaptorVector>) {
157 return *this;
158 } else {
159 return this->operator T();
160 }
161 }
162
163 const ValAdaptor &operator[](std::size_t index) const { return at(index); }
164 const ValAdaptor &at(std::size_t index) const;
165
166 const ValAdaptor *data() const;
167 const ValAdaptor *begin() const { return data(); }
168 const ValAdaptor *end() const { return data() + size(); }
169 const ValAdaptor *cbegin() const { return data(); }
170 const ValAdaptor *cend() const { return data() + size(); }
171
172 std::size_t size() const;
173
174 [[deprecated("(ver2.10〜) use asStringView() or asString() instead")]]
175 std::string asStringRef() const {
176 return asString();
177 }
178 [[deprecated("(ver2.10〜) use asWStringView() or asWString() instead")]]
179 std::wstring asWStringRef() const {
180 return asWString();
181 }
182 StringView asStringView() const { return get().asStringView(); }
183 WStringView asWStringView() const { return get().asWStringView(); }
184 std::string_view asU8StringView() const { return get().asU8StringView(); }
185 std::string asString() const { return get().asString(); }
186 std::wstring asWString() const { return get().asWString(); }
187 double asDouble() const { return get().asDouble(); }
188 int asInt() const { return get().asInt(); }
189 long long asLLong() const { return get().asLLong(); }
190 bool asBool() const { return get().asBool(); }
191
192 bool operator==(const ValAdaptorVector &other) const;
193 bool operator!=(const ValAdaptorVector &other) const {
194 return !(*this == other);
195 }
196
197 template <typename T, typename std::enable_if_t<
198 std::is_constructible_v<ValAdaptorVector, T> &&
199 !std::is_same_v<ValAdaptorVector, T>,
200 std::nullptr_t> = nullptr>
201 bool operator==(const T &other) const {
202 return *this == ValAdaptorVector(other);
203 }
204 template <typename T, typename std::enable_if_t<
205 std::is_constructible_v<ValAdaptorVector, T> &&
206 !std::is_same_v<ValAdaptorVector, T>,
207 std::nullptr_t> = nullptr>
208 bool operator!=(const T &other) const {
209 return *this != ValAdaptorVector(other);
210 }
211};
212
213template <typename T, typename V,
214 typename std::enable_if_t<
215 std::is_same_v<V, ValAdaptorVector> &&
216 std::is_constructible_v<ValAdaptorVector, T> &&
217 !std::is_same_v<ValAdaptorVector, T>,
218 std::nullptr_t> = nullptr>
219bool operator==(const T &other, const V &val) {
220 return val == ValAdaptorVector(other);
221}
222template <typename T, typename V,
223 typename std::enable_if_t<
224 std::is_same_v<V, ValAdaptorVector> &&
225 std::is_constructible_v<ValAdaptorVector, T> &&
226 !std::is_same_v<ValAdaptorVector, T>,
227 std::nullptr_t> = nullptr>
228bool operator!=(const T &other, const V &val) {
229 return val != ValAdaptorVector(other);
230}
231
238template <int n = 0, typename T>
239void argToTuple(const std::vector<ValAdaptorVector> &args, T &tuple) {
240 constexpr int tuple_size = std::tuple_size<T>::value;
241 if constexpr (n < tuple_size) {
242 using Type = typename std::tuple_element<n, T>::type;
243 std::get<n>(tuple) = args[n].as<Type>();
244 argToTuple<n + 1>(args, tuple);
245 }
246}
247
248template <typename T>
249[[deprecated("Unknown type T is passed to webcface::valTypeOf(). "
250 "This should not happen. Maybe there's a bug in WebCFace...")]]
251inline void warningOnUnknownType() {}
252
259template <typename T>
261 if constexpr (std::is_void_v<T>) {
262 return ValType::none_;
263 } else if constexpr (!std::is_constructible_v<ValAdaptor, T> &&
264 std::is_constructible_v<ValAdaptorVector, T>) {
265 return static_cast<ValType>(
266 static_cast<int>(ValType::vector_) +
267 static_cast<int>(
268 valTypeOf<decltype(*std::declval<T>().begin())>()));
269 } else if constexpr (std::is_same_v<bool, std::decay_t<T>>) {
270 return ValType::bool_;
271 } else if constexpr (std::is_integral_v<std::decay_t<T>>) {
272 return ValType::int_;
273 } else if constexpr (std::is_floating_point_v<std::decay_t<T>>) {
274 return ValType::float_;
275 } else if constexpr (std::is_constructible_v<StringInitializer, T>) {
276 return ValType::string_;
277 } else {
278 warningOnUnknownType<T>();
279 return ValType::none_;
280 }
281}
282
SharedString のpublicなコンストラクタインタフェース (入力専用)
Definition encoding.h:215
webcfaceで管理されている文字列を参照するstring_view
Definition encoding.h:60
ValAdaptorのVector.
Definition val_adaptor_vec.h:16
std::string_view asU8StringView() const
Definition val_adaptor_vec.h:184
T as() const
Definition val_adaptor_vec.h:155
bool operator==(const T &other) const
Definition val_adaptor_vec.h:201
std::string asString() const
Definition val_adaptor_vec.h:185
ValAdaptorVector & operator=(T &&val)
Definition val_adaptor_vec.h:45
std::string asStringRef() const
Definition val_adaptor_vec.h:175
const ValAdaptor & operator[](std::size_t index) const
Definition val_adaptor_vec.h:163
ValAdaptorVector & operator=(const T(&range)[N])
Definition val_adaptor_vec.h:91
StringView asStringView() const
Definition val_adaptor_vec.h:182
std::wstring asWStringRef() const
Definition val_adaptor_vec.h:179
const ValAdaptor * cbegin() const
Definition val_adaptor_vec.h:169
ValAdaptorVector(const T(&range)[N])
Definition val_adaptor_vec.h:84
const ValAdaptor * begin() const
Definition val_adaptor_vec.h:167
long long asLLong() const
Definition val_adaptor_vec.h:189
bool operator!=(const T &other) const
Definition val_adaptor_vec.h:208
bool operator!=(const ValAdaptorVector &other) const
Definition val_adaptor_vec.h:193
bool asBool() const
Definition val_adaptor_vec.h:190
int asInt() const
Definition val_adaptor_vec.h:188
const ValAdaptor * end() const
Definition val_adaptor_vec.h:168
ValAdaptorVector(const R &range)
Definition val_adaptor_vec.h:61
double asDouble() const
Definition val_adaptor_vec.h:187
const ValAdaptor * cend() const
Definition val_adaptor_vec.h:170
ValAdaptorVector(T &&val)
Definition val_adaptor_vec.h:36
std::wstring asWString() const
Definition val_adaptor_vec.h:186
std::array< T, N > asArray() const
Definition val_adaptor_vec.h:135
std::vector< T > asVector() const
Definition val_adaptor_vec.h:123
WStringView asWStringView() const
Definition val_adaptor_vec.h:183
数値、文字列などの値を相互変換するクラス
Definition val_adaptor.h:81
bool operator==(const T &other, const InputRef &ref)
Definition text.h:638
const auto & get(const AxisAngle &aa)
Definition transform.h:231
void argToTuple(const std::vector< ValAdaptorVector > &args, T &tuple)
ValAdaptorのリストから任意の型のタプルに変換する
Definition val_adaptor_vec.h:239
void warningOnUnknownType()
Definition val_adaptor_vec.h:251
ValType
引数や戻り値の型を表すenum
Definition val_adaptor.h:21
ValType valTypeOf()
TのValTypeを得る
Definition val_adaptor_vec.h:260
bool operator!=(const T &other, const InputRef &ref)
Definition text.h:644
#define WEBCFACE_DLL
Definition webcface-config.h:69
#define WEBCFACE_NS_END
Definition webcface-config.h:113
#define WEBCFACE_NS_BEGIN
Definition webcface-config.h:112