WebCFace 3.2.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#include "trait.h"
10#ifdef WEBCFACE_MESON
11#include "webcface-config.h"
12#else
13#include "webcface/common/webcface-config.h"
14#endif
15
17
22enum class ValType {
23 none_ = 0,
24 string_ = 1,
25 bool_ = 2,
26 int_ = 3,
27 float_ = 4,
28 double_ = 4,
29 vector_ = 16,
30 vector_string_ = 17,
31 vector_bool_ = 18,
32 vector_int_ = 19,
33 vector_float_ = 20,
34 vector_double_ = 20,
35};
36
41inline std::string valTypeStr(ValType a) {
42 if (static_cast<int>(a) & static_cast<int>(ValType::vector_)) {
43 return std::string("vector<") +
44 valTypeStr(static_cast<ValType>(
45 static_cast<int>(a) ^ static_cast<int>(ValType::vector_))) +
46 ">";
47 }
48 switch (a) {
49 case ValType::none_:
50 return "none";
51 case ValType::string_:
52 return "string";
53 case ValType::bool_:
54 return "bool";
55 case ValType::int_:
56 return "int";
57 case ValType::float_:
58 return "float";
59 default:
60 return "unknown";
61 }
62}
67inline std::ostream &operator<<(std::ostream &os, ValType a) {
68 return os << valTypeStr(a);
69}
70
71namespace traits {
72template <typename T, typename U = TraitOkType>
73struct EnableIfBool {};
74template <typename U>
75struct EnableIfBool<bool, U> {
76 using Type = U;
77};
78} // namespace traits
79
96 mutable SharedString as_str;
97
98 std::variant<double, std::int64_t> as_val;
99 ValType type;
100
101 enum ValVariant { DOUBLEV = 0, INT64V = 1 };
102
103 void initStr() const;
104 void initWStr() const;
105
106 public:
107 ValAdaptor();
108
112 explicit ValAdaptor(const SharedString &str);
116 ValAdaptor &operator=(const SharedString &str);
117
123 explicit ValAdaptor(StringInitializer str);
129 ValAdaptor &operator=(StringInitializer str);
130
141 template <typename Bool>
142 explicit ValAdaptor(Bool value, typename traits::EnableIfBool<Bool>::Type =
143 traits::TraitOk);
155 template <typename Bool>
156 auto operator=(Bool v) ->
158
159 explicit ValAdaptor(std::int64_t value);
160 ValAdaptor &operator=(std::int64_t v);
161
162 explicit ValAdaptor(double value);
163 ValAdaptor &operator=(double v);
164
165 template <typename T, typename std::enable_if_t<!std::is_same_v<T, bool> &&
166 std::is_integral_v<T>,
167 std::nullptr_t> = nullptr>
168 explicit ValAdaptor(T value)
169 : ValAdaptor(static_cast<std::int64_t>(value)) {}
170 template <typename T, typename std::enable_if_t<!std::is_same_v<T, bool> &&
171 std::is_integral_v<T>,
172 std::nullptr_t> = nullptr>
174 return *this = static_cast<std::int64_t>(v);
175 }
176
177 template <typename T, typename std::enable_if_t<std::is_floating_point_v<T>,
178 std::nullptr_t> = nullptr>
179 explicit ValAdaptor(T value) : ValAdaptor(static_cast<double>(value)) {}
180 template <typename T, typename std::enable_if_t<std::is_floating_point_v<T>,
181 std::nullptr_t> = nullptr>
183 return *this = static_cast<double>(v);
184 }
185
186 ValType valType() const { return type; }
187
188 static const ValAdaptor &emptyVal();
189
194 bool empty() const;
195
206 [[deprecated("(ver3.0〜) use asStringView() or asString() instead")]]
207 std::string asStringRef() const {
208 return asString();
209 }
219 StringView asStringView() const;
229 [[deprecated("(ver3.0〜) use asWStringView() or asWString() instead")]]
230 std::wstring asWStringRef() const {
231 return asWString();
232 }
241 WStringView asWStringView() const;
245 std::string_view asU8StringView() const;
250 std::string asString() const { return std::string(asStringView()); }
255 std::wstring asWString() const { return std::wstring(asWStringView()); }
256
266 template <typename T,
267 typename std::enable_if_t<std::is_convertible_v<StringView, T>,
268 std::nullptr_t> = nullptr>
269 operator T() const {
270 return asStringView();
271 }
281 template <typename T, typename std::enable_if_t<
282 !std::is_convertible_v<StringView, T> &&
283 std::is_convertible_v<WStringView, T>,
284 std::nullptr_t> = nullptr>
285 operator T() const {
286 return asWStringView();
287 }
296 template <typename T, typename std::enable_if_t<
297 !std::is_convertible_v<StringView, T> &&
298 !std::is_convertible_v<WStringView, T> &&
299 std::is_constructible_v<T, StringView>,
300 std::nullptr_t> = nullptr>
301 explicit operator T() const {
302 return T(asStringView());
303 }
312 template <typename T, typename std::enable_if_t<
313 !std::is_convertible_v<StringView, T> &&
314 !std::is_convertible_v<WStringView, T> &&
315 !std::is_constructible_v<T, StringView> &&
316 std::is_constructible_v<T, WStringView>,
317 std::nullptr_t> = nullptr>
318 explicit operator T() const {
319 return T(asWStringView());
320 }
321
326 double asDouble() const;
331 int asInt() const;
336 long long asLLong() const;
348 template <typename T>
349 T as() const {
350 if constexpr (std::is_same_v<T, ValAdaptor>) {
351 return *this;
352 } else {
353 // ↓ MSVCでなぜかコンパイルできない
354 // return static_cast<T>(*this);
355 return this->operator T();
356 }
357 }
361 template <typename T,
362 typename std::enable_if_t<std::is_convertible_v<double, T> &&
363 !std::is_same_v<T, bool>,
364 std::nullptr_t> = nullptr>
365 operator T() const {
366 if constexpr (std::is_floating_point_v<T>) {
367 return static_cast<T>(asDouble());
368 } else if constexpr (sizeof(T) > sizeof(int)) {
369 return static_cast<T>(asLLong());
370 } else {
371 return static_cast<T>(asInt());
372 }
373 }
374
383 bool asBool() const;
387 operator bool() const { return asBool(); }
388
389 bool operator==(const ValAdaptor &other) const;
390 bool operator!=(const ValAdaptor &other) const { return !(*this == other); }
391
392 template <typename T, typename std::enable_if_t<
393 std::is_constructible_v<ValAdaptor, T> &&
394 !std::is_same_v<ValAdaptor, T>,
395 std::nullptr_t> = nullptr>
396 bool operator==(const T &other) const {
397 return *this == ValAdaptor(other);
398 }
399 template <typename T, typename std::enable_if_t<
400 std::is_constructible_v<ValAdaptor, T> &&
401 !std::is_same_v<ValAdaptor, T>,
402 std::nullptr_t> = nullptr>
403 bool operator!=(const T &other) const {
404 return *this != ValAdaptor(other);
405 }
406};
407
408extern template ValAdaptor::ValAdaptor(
409 bool value, typename traits::EnableIfBool<bool>::Type);
410extern template auto ValAdaptor::operator= <bool>(bool v) ->
411 typename traits::EnableIfBool<bool, ValAdaptor &>::Type;
412
413
414template <typename T,
415 typename std::enable_if_t<std::is_constructible_v<ValAdaptor, T> &&
416 !std::is_same_v<ValAdaptor, T>,
417 std::nullptr_t> = nullptr>
418bool operator==(const T &other, const ValAdaptor &val) {
419 return val == ValAdaptor(other);
420}
421template <typename T,
422 typename std::enable_if_t<std::is_constructible_v<ValAdaptor, T> &&
423 !std::is_same_v<ValAdaptor, T>,
424 std::nullptr_t> = nullptr>
425bool operator!=(const T &other, const ValAdaptor &val) {
426 return val != ValAdaptor(other);
427}
428
429inline std::ostream &operator<<(std::ostream &os, const ValAdaptor &a) {
430 return os << a.asStringView();
431}
432
u8stringとstringとwstringをshared_ptrで持ち共有する
Definition encoding.h:170
SharedString のpublicなコンストラクタインタフェース (入力専用)
Definition encoding.h:235
webcfaceで管理されている文字列を参照するstring_view
Definition encoding.h:71
数値、文字列などの値を相互変換するクラス
Definition val_adaptor.h:91
T as() const
数値として返す 明示的なキャストをする
Definition val_adaptor.h:349
bool operator==(const T &other) const
Definition val_adaptor.h:396
std::string asString() const
文字列として返す(コピー)
Definition val_adaptor.h:250
static const ValAdaptor & emptyVal()
std::string asStringRef() const
文字列として返す
Definition val_adaptor.h:207
StringView asStringView() const
null終端の文字列を返す
Definition val_adaptor.cc:91
std::wstring asWStringRef() const
文字列として返す (wstring)
Definition val_adaptor.h:230
bool operator!=(const ValAdaptor &other) const
Definition val_adaptor.h:390
bool operator!=(const T &other) const
Definition val_adaptor.h:403
ValAdaptor(T value)
Definition val_adaptor.h:168
ValType valType() const
Definition val_adaptor.h:186
ValAdaptor & operator=(T v)
Definition val_adaptor.h:173
std::wstring asWString() const
文字列として返す(コピー) (wstring)
Definition val_adaptor.h:255
std::ostream & operator<<(std::ostream &os, const Arg &arg)
Definition func_info.cc:99
bool operator==(const T &other, const InputRef &ref)
Definition text.h:608
std::string valTypeStr(ValType a)
型名を文字列で取得
Definition val_adaptor.h:41
ValType
引数や戻り値の型を表すenum
Definition val_adaptor.h:22
bool operator!=(const T &other, const InputRef &ref)
Definition text.h:614
U Type
Definition val_adaptor.h:76
Definition val_adaptor.h:73
#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