boat
C++23 geospatial library
Loading...
Searching...
No Matches
variant.hpp
Go to the documentation of this file.
1// Andrew Naplavkov
2
3#ifndef BOAT_DB_VARIANT_HPP
4#define BOAT_DB_VARIANT_HPP
5
6#include <boat/blob.hpp>
7#include <cstdint>
8
9namespace boat::db {
10
11using null = std::monostate;
12using variant_base = std::variant<null, int64_t, double, std::string, blob>;
13
15 using variant_base::variant_base;
16 explicit variant(std::string_view v) { emplace<std::string>(v); }
17 explicit operator bool() const { return has_value(); }
18 bool has_value() const { return !std::holds_alternative<null>(*this); }
19 void reset() { emplace<null>(); }
20};
21
24template <std::convertible_to<variant_base> T>
25void read(variant const& in, T& out)
26{
27 auto vis = overloaded{
28 [&](null) { out = {}; },
29 [&](std::convertible_to<T> auto& v) { out = static_cast<T>(v); },
30 [](...) { throw std::bad_variant_access{}; }};
31 std::visit(vis, in);
32}
33
34void write(variant& out, std::convertible_to<variant_base> auto const& in)
35{
36 out = static_cast<variant>(in);
37}
38
39template <class T>
40T get(variant const& var)
41 requires requires(T val) { read(var, val); }
42{
43 T ret;
44 read(var, ret);
45 return ret;
46}
47
48variant to_variant(auto const& val)
49 requires requires(variant var) { write(var, val); }
50{
51 auto ret = variant{};
52 write(ret, val);
53 return ret;
54}
55
57template <class>
58struct kind;
59
60template <std::integral T>
61struct kind<T> {
62 static constexpr auto value = "int";
63};
64
65template <std::floating_point T>
66struct kind<T> {
67 static constexpr auto value = "float";
68};
69
70template <>
71struct kind<std::string> {
72 static constexpr auto value = "varchar";
73};
74
75template <>
76struct kind<blob> {
77 static constexpr auto value = "blob";
78};
79
80} // namespace boat::db
81
82#endif // BOAT_DB_VARIANT_HPP
Definition geometry.hpp:9
void write(variant &out, geometry::ogc99 auto const &in)
Serializes an OGC geometry as WKB in a blob.
Definition geometry.hpp:21
std::variant< null, int64_t, double, std::string, blob > variant_base
Definition variant.hpp:12
void read(variant const &in, geometry::ogc99 auto &out)
Reads WKB from a blob; NULL produces a default-constructed geometry.
Definition geometry.hpp:12
std::monostate null
Definition variant.hpp:11
variant to_variant(auto const &val)
Definition variant.hpp:48
T get(variant const &var)
Definition variant.hpp:40
Definition blob.hpp:19
static constexpr auto value
Definition variant.hpp:77
static constexpr auto value
Definition variant.hpp:72
Maps a C++ type to the database-neutral type name used by boat.
Definition variant.hpp:58
Definition variant.hpp:14
void reset()
Definition variant.hpp:19
variant(std::string_view v)
Definition variant.hpp:16
bool has_value() const
Definition variant.hpp:18