userver: userver/formats/bson/bson_builder.hpp Source File
Loading...
Searching...
No Matches
bson_builder.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/formats/bson/bson_builder.hpp
4/// @brief Internal helpers for inline document build
5
6#include <chrono>
7#include <cstddef>
8#include <string_view>
9#include <type_traits>
10
11#include <userver/compiler/select.hpp>
12#include <userver/formats/bson/types.hpp>
13#include <userver/formats/bson/value.hpp>
14#include <userver/formats/bson/value_builder.hpp>
15#include <userver/utils/fast_pimpl.hpp>
16
17USERVER_NAMESPACE_BEGIN
18
19namespace formats::bson::impl {
20
21class MutableBson;
22
23class BsonBuilder {
24public:
25 BsonBuilder();
26 explicit BsonBuilder(const ValueImpl&);
27 ~BsonBuilder();
28
29 BsonBuilder(const BsonBuilder&);
30 BsonBuilder(BsonBuilder&&) noexcept;
31 BsonBuilder& operator=(const BsonBuilder&);
32 BsonBuilder& operator=(BsonBuilder&&) noexcept;
33
34 BsonBuilder& Append(std::string_view key, std::nullptr_t);
35 BsonBuilder& Append(std::string_view key, bool);
36 BsonBuilder& Append(std::string_view key, int);
37 BsonBuilder& Append(std::string_view key, unsigned int);
38 BsonBuilder& Append(std::string_view key, long);
39 BsonBuilder& Append(std::string_view key, unsigned long);
40 BsonBuilder& Append(std::string_view key, long long);
41 BsonBuilder& Append(std::string_view key, unsigned long long);
42 BsonBuilder& Append(std::string_view key, double);
43 BsonBuilder& Append(std::string_view key, const char*);
44 BsonBuilder& Append(std::string_view key, std::string_view);
45
46 template <typename Duration>
47 BsonBuilder& Append(std::string_view key, std::chrono::time_point<std::chrono::system_clock, Duration> value) {
48 return Append(key, std::chrono::time_point_cast<std::chrono::milliseconds>(value));
49 }
50 BsonBuilder&
51 Append(std::string_view key, std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>);
52
53 BsonBuilder& Append(std::string_view key, const Oid&);
54 BsonBuilder& Append(std::string_view key, const Binary&);
55 BsonBuilder& Append(std::string_view key, const Decimal128&);
56 BsonBuilder& Append(std::string_view key, MinKey);
57 BsonBuilder& Append(std::string_view key, MaxKey);
58 BsonBuilder& Append(std::string_view key, const Timestamp&);
59
60 BsonBuilder& Append(std::string_view key, const Value&);
61
62 BsonBuilder& Append(std::string_view key, const bson_t*);
63
64 template <typename T>
65 std::enable_if_t<
66 !std::is_integral_v<T> && //
67 !std::is_convertible_v<T, std::string_view> && //
68 !std::is_convertible_v<T, Value>, // Excludes Document that inherits Value
69 BsonBuilder&>
70 Append(std::string_view key, const T& val) {
71 return Append(key, ValueBuilder(val).ExtractValue());
72 }
73
74 const bson_t* Get() const;
75 bson_t* Get();
76
77 BsonHolder Extract();
78
79private:
80 void AppendInto(bson_t*, std::string_view key, const ValueImpl&);
81
82 static constexpr std::size_t kSize = compiler::SelectSize() //
83 .For64Bit(8)
84 .For32Bit(4);
85 static constexpr std::size_t kAlignment = alignof(void*);
86 utils::FastPimpl<MutableBson, kSize, kAlignment, utils::kStrictMatch> bson_;
87};
88
89} // namespace formats::bson::impl
90
91USERVER_NAMESPACE_END