WebCFace 2.9.0
Web-based Communication Framework & Dashboard-like UI
Loading...
Searching...
No Matches
val_adaptor.h
Go to the documentation of this file.
1#pragma once
2#include <string>
3#include <vector>
4#include <tuple>
5#include <cstdint>
6#include <ostream>
7#include <variant>
8#include "encoding.h"
9#ifdef WEBCFACE_MESON
10#include "webcface-config.h"
11#else
12#include "webcface/common/webcface-config.h"
13#endif
14
16
21enum class ValType {
22 none_ = 0,
23 string_ = 1,
24 bool_ = 2,
25 int_ = 3,
26 float_ = 4,
27 double_ = 4,
28};
33template <typename T>
35 if constexpr (std::is_void_v<T>) {
36 return ValType::none_;
37 } else if constexpr (std::is_same_v<bool, T>) {
38 return ValType::bool_;
39 } else if constexpr (std::is_integral_v<T>) {
40 return ValType::int_;
41 } else if constexpr (std::is_floating_point_v<T>) {
42 return ValType::float_;
43 } else {
44 return ValType::string_;
45 }
46}
47
52inline std::string valTypeStr(ValType a) {
53 switch (a) {
54 case ValType::none_:
55 return "none";
56 case ValType::string_:
57 return "string";
58 case ValType::bool_:
59 return "bool";
60 case ValType::int_:
61 return "int";
62 case ValType::float_:
63 return "float";
64 default:
65 return "unknown";
66 }
67}
72inline std::ostream &operator<<(std::ostream &os, ValType a) {
73 return os << valTypeStr(a);
74}
75
92 mutable SharedString as_str;
93
94 std::variant<double, std::int64_t> as_val;
95 ValType type;
96
97 enum ValVariant { DOUBLEV = 0, INT64V = 1 };
98
99 void initStr() const;
100 void initWStr() const;
101
102 public:
103 ValAdaptor();
104
108 explicit ValAdaptor(const SharedString &str);
112 ValAdaptor &operator=(const SharedString &str);
113
119 explicit ValAdaptor(StringInitializer str);
125 ValAdaptor &operator=(StringInitializer str);
126
132 template <typename Bool, typename std::enable_if_t<
133 std::is_same_v<Bool, bool>, bool> = true>
134 explicit ValAdaptor(Bool value);
143 template <typename Bool>
144 auto operator=(Bool v)
145 -> std::enable_if_t<std::is_same_v<Bool, bool>, ValAdaptor &>;
146
147 explicit ValAdaptor(std::int64_t value);
148 ValAdaptor &operator=(std::int64_t v);
149
150 explicit ValAdaptor(double value);
151 ValAdaptor &operator=(double v);
152
153 template <typename T, typename std::enable_if_t<!std::is_same_v<T, bool> &&
154 std::is_integral_v<T>,
155 std::nullptr_t> = nullptr>
156 explicit ValAdaptor(T value)
157 : ValAdaptor(static_cast<std::int64_t>(value)) {}
158 template <typename T, typename std::enable_if_t<!std::is_same_v<T, bool> &&
159 std::is_integral_v<T>,
160 std::nullptr_t> = nullptr>
162 return *this = static_cast<std::int64_t>(v);
163 }
164
165 template <typename T, typename std::enable_if_t<std::is_floating_point_v<T>,
166 std::nullptr_t> = nullptr>
167 explicit ValAdaptor(T value) : ValAdaptor(static_cast<double>(value)) {}
168 template <typename T, typename std::enable_if_t<std::is_floating_point_v<T>,
169 std::nullptr_t> = nullptr>
171 return *this = static_cast<double>(v);
172 }
173
174 ValType valType() const { return type; }
175
180 bool empty() const;
181
192 [[deprecated("(ver2.10〜) use asStringView() or asString() instead")]]
193 std::string asStringRef() const {
194 return asString();
195 }
205 StringView asStringView() const;
215 [[deprecated("(ver2.10〜) use asWStringView() or asWString() instead")]]
216 std::wstring asWStringRef() const {
217 return asWString();
218 }
227 WStringView asWStringView() const;
231 std::string_view asU8StringView() const;
236 std::string asString() const { return std::string(asStringView()); }
241 std::wstring asWString() const { return std::wstring(asWStringView()); }
242
252 template <typename T,
253 typename std::enable_if_t<std::is_convertible_v<StringView, T>,
254 std::nullptr_t> = nullptr>
255 operator T() const {
256 return asStringView();
257 }
267 template <typename T, typename std::enable_if_t<
268 !std::is_convertible_v<StringView, T> &&
269 std::is_convertible_v<WStringView, T>,
270 std::nullptr_t> = nullptr>
271 operator T() const {
272 return asWStringView();
273 }
282 template <typename T, typename std::enable_if_t<
283 !std::is_convertible_v<StringView, T> &&
284 !std::is_convertible_v<WStringView, T> &&
285 std::is_constructible_v<T, StringView>,
286 std::nullptr_t> = nullptr>
287 explicit operator T() const {
288 return T(asStringView());
289 }
298 template <typename T, typename std::enable_if_t<
299 !std::is_convertible_v<StringView, T> &&
300 !std::is_convertible_v<WStringView, T> &&
301 !std::is_constructible_v<T, StringView> &&
302 std::is_constructible_v<T, WStringView>,
303 std::nullptr_t> = nullptr>
304 explicit operator T() const {
305 return T(asWStringView());
306 }
307
312 double asDouble() const;
317 int asInt() const;
322 long long asLLong() const;
334 template <typename T>
335 T as() const {
336 // ↓ MSVCでなぜかコンパイルできない
337 // return static_cast<T>(*this);
338 return this->operator T();
339 }
343 template <typename T,
344 typename std::enable_if_t<std::is_convertible_v<double, T> &&
345 !std::is_same_v<T, bool>,
346 std::nullptr_t> = nullptr>
347 operator T() const {
348 if constexpr (std::is_floating_point_v<T>) {
349 return static_cast<T>(asDouble());
350 } else if constexpr (sizeof(T) > sizeof(int)) {
351 return static_cast<T>(asLLong());
352 } else {
353 return static_cast<T>(asInt());
354 }
355 }
356
365 bool asBool() const;
369 operator bool() const { return asBool(); }
370
371 bool operator==(const ValAdaptor &other) const;
372 bool operator!=(const ValAdaptor &other) const { return !(*this == other); }
373
374 template <typename T, typename std::enable_if_t<
375 std::is_constructible_v<ValAdaptor, T> &&
376 !std::is_same_v<ValAdaptor, T>,
377 std::nullptr_t> = nullptr>
378 bool operator==(const T &other) const {
379 return *this == ValAdaptor(other);
380 }
381 template <typename T, typename std::enable_if_t<
382 std::is_constructible_v<ValAdaptor, T> &&
383 !std::is_same_v<ValAdaptor, T>,
384 std::nullptr_t> = nullptr>
385 bool operator!=(const T &other) const {
386 return *this != ValAdaptor(other);
387 }
388};
389
390extern template ValAdaptor::ValAdaptor(bool value);
391extern template ValAdaptor &ValAdaptor::operator= <bool>(bool v);
392
393
394template <typename T,
395 typename std::enable_if_t<std::is_constructible_v<ValAdaptor, T> &&
396 !std::is_same_v<ValAdaptor, T>,
397 std::nullptr_t> = nullptr>
398bool operator==(const T &other, const ValAdaptor &val) {
399 return val == ValAdaptor(other);
400}
401template <typename T,
402 typename std::enable_if_t<std::is_constructible_v<ValAdaptor, T> &&
403 !std::is_same_v<ValAdaptor, T>,
404 std::nullptr_t> = nullptr>
405bool operator!=(const T &other, const ValAdaptor &val) {
406 return val != ValAdaptor(other);
407}
408
409inline std::ostream &operator<<(std::ostream &os, const ValAdaptor &a) {
410 return os << a.asStringView();
411}
412
417
422template <int n = 0, typename T>
423void argToTuple(const std::vector<ValAdaptor> &args, T &tuple) {
424 constexpr int tuple_size = std::tuple_size<T>::value;
425 if constexpr (n < tuple_size) {
426 using Type = typename std::tuple_element<n, T>::type;
427 std::get<n>(tuple) = args[n].as<Type>();
428 argToTuple<n + 1>(args, tuple);
429 }
430}
431
432namespace [[deprecated("symbols in webcface::encoding namespace are "
433 "now directly in webcface namespace")]] encoding {
435template <typename T>
437 return webcface::valTypeOf<T>();
438}
439inline std::string valTypeStr(webcface::ValType a) {
440 return webcface::valTypeStr(a);
441}
443
444template <int n = 0, typename T>
445void argToTuple(const std::vector<webcface::ValAdaptor> &args, T &tuple) {
446 webcface::argToTuple<n>(args, tuple);
447}
448
449} // namespace encoding
u8stringとstringとwstringをshared_ptrで持ち共有する
Definition encoding.h:159
SharedString のpublicなコンストラクタインタフェース (入力専用)
Definition encoding.h:215
webcfaceで管理されている文字列を参照するstring_view
Definition encoding.h:60
数値、文字列などの値を相互変換するクラス
Definition val_adaptor.h:87
T as() const
数値として返す 明示的なキャストをする
Definition val_adaptor.h:335
bool operator==(const T &other) const
Definition val_adaptor.h:378
std::string asString() const
文字列として返す(コピー)
Definition val_adaptor.h:236
std::string asStringRef() const
文字列として返す
Definition val_adaptor.h:193
StringView asStringView() const
null終端の文字列を返す
Definition val_adaptor.cc:85
std::wstring asWStringRef() const
文字列として返す (wstring)
Definition val_adaptor.h:216
bool operator!=(const ValAdaptor &other) const
Definition val_adaptor.h:372
bool operator!=(const T &other) const
Definition val_adaptor.h:385
ValAdaptor(T value)
Definition val_adaptor.h:156
ValType valType() const
Definition val_adaptor.h:174
ValAdaptor & operator=(T v)
Definition val_adaptor.h:161
std::wstring asWString() const
文字列として返す(コピー) (wstring)
Definition val_adaptor.h:241
std::ostream & operator<<(std::ostream &os, const Arg &arg)
Definition func_info.cc:98
bool operator==(const T &other, const InputRef &ref)
Definition text.h:641
void argToTuple(const std::vector< ValAdaptor > &args, T &tuple)
ValAdaptorのリストから任意の型のタプルに変換する
Definition val_adaptor.h:423
std::string valTypeStr(ValType a)
型名を文字列で取得
Definition val_adaptor.h:52
ValType
引数や戻り値の型を表すenum
Definition val_adaptor.h:21
ValType valTypeOf()
TのValTypeを得る
Definition val_adaptor.h:34
bool operator!=(const T &other, const InputRef &ref)
Definition text.h:647
#define WEBCFACE_DLL
Definition webcface-config.h:69
#define WEBCFACE_NS_END
Definition webcface-config.h:118
#define WEBCFACE_NS_BEGIN
Definition webcface-config.h:117