GMP 0.4.0
Generative Metaprogramming library for C++
Loading...
Searching...
No Matches
value.hpp
Go to the documentation of this file.
1// ___ __ __ ___
2// / __| \/ | _ \ GMP(Generative Metaprogramming)
3// | (_ | |\/| | _/ version 0.4.0
4// \___|_| |_|_| https://github.com/lkimuk/gmp
5//
6// SPDX-FileCopyrightText: 2023-2026 Miles Li <https://www.cppmore.com/>
7// SPDX-License-Identifier: MIT
8//
9// This file is part of the GMP (Generative Metaprogramming) library.
10// Full project source: https://github.com/lkimuk/gmp
11
12#ifndef GMP_SERIALIZATION_VALUE_HPP_
13#define GMP_SERIALIZATION_VALUE_HPP_
14
15#include <concepts>
16#include <cstddef>
17#include <cstdint>
18#include <string>
19#include <type_traits>
20#include <utility>
21#include <variant>
22#include <vector>
23
25
26namespace gmp {
27
29public:
30 using null_t = std::monostate;
31 using array = std::vector<serialization_value>;
32 using object = std::vector<std::pair<std::string, serialization_value>>;
33 using storage =
34 std::variant<null_t, bool, std::int64_t, std::uint64_t, double, std::string, array, object>;
36
38
39 serialization_value(bool v) noexcept : data_(v) {}
40
41 template <std::integral I>
42 requires(!std::same_as<I, bool>)
44 : data_(std::is_signed_v<I> ? storage(std::int64_t(v)) : storage(std::uint64_t(v))) {}
45
46 template <std::floating_point F>
47 requires(!std::same_as<F, double>)
48 serialization_value(F v) noexcept : data_(static_cast<double>(v)) {}
49
50 serialization_value(std::int64_t v) noexcept : data_(v) {}
51
52 serialization_value(std::uint64_t v) noexcept : data_(v) {}
53
54 serialization_value(double v) noexcept : data_(v) {}
55
56 serialization_value(std::string v) : data_(std::move(v)) {}
57
58 serialization_value(std::string_view v) : data_(std::string(v)) {}
59
60 // A null C string has no useful string representation. Treat it as the
61 // value-level null instead of passing it to std::string (which is UB).
62 serialization_value(const char *v) : data_(v ? storage(std::string(v)) : storage(null_t{})) {}
63
64 serialization_value(array v) : data_(std::move(v)) {}
65
66 serialization_value(object v) : data_(std::move(v)) {}
67
68 template <typename T> bool is() const noexcept {
69 return std::holds_alternative<T>(data_);
70 }
71
72 template <typename T> T &get() & {
73 return std::get<T>(data_);
74 }
75
76 template <typename T> const T &get() const & {
77 return std::get<T>(data_);
78 }
79
80 template <typename T> T &&get() && {
81 return std::get<T>(std::move(data_));
82 }
83
85 return data_;
86 }
87
89 return data_;
90 }
91
93 return source_offset_;
94 }
95
96 void source_offset(std::size_t v) noexcept {
97 source_offset_ = v;
98 }
99
100private:
101 storage data_;
102 std::size_t source_offset_ = serialization_error::unknown_offset;
103};
104
105} // namespace gmp
106
107#endif // GMP_SERIALIZATION_VALUE_HPP_
serialization_value(bool v) noexcept
Definition value.hpp:39
serialization_value(std::string_view v)
Definition value.hpp:58
std::vector< std::pair< std::string, serialization_value > > object
Definition value.hpp:32
serialization_value(object v)
Definition value.hpp:66
serialization_value(F v) noexcept
Definition value.hpp:48
storage & data() noexcept
Definition value.hpp:88
std::size_t source_offset() const noexcept
Definition value.hpp:92
serialization_value() noexcept=default
serialization_value(const char *v)
Definition value.hpp:62
serialization_value(std::uint64_t v) noexcept
Definition value.hpp:52
std::vector< serialization_value > array
Definition value.hpp:31
std::variant< null_t, bool, std::int64_t, std::uint64_t, double, std::string, array, object > storage
Definition value.hpp:34
void source_offset(std::size_t v) noexcept
Definition value.hpp:96
serialization_value(std::int64_t v) noexcept
Definition value.hpp:50
serialization_value(double v) noexcept
Definition value.hpp:54
const storage & data() const noexcept
Definition value.hpp:84
serialization_value(array v)
Definition value.hpp:64
const T & get() const &
Definition value.hpp:76
serialization_value(I v) noexcept
Definition value.hpp:43
serialization_value(std::string v)
Definition value.hpp:56
std::monostate null_t
Definition value.hpp:30
bool is() const noexcept
Definition value.hpp:68
consteval auto enum_values()
Get all enumerator values of an enumeration type at compile-time.
Definition meta.hpp:193
Definition lock.hpp:21
static constexpr std::size_t unknown_offset
Definition error.hpp:49