11#include <unordered_map>
17#include <userver/formats/common/path.hpp>
18#include <userver/logging/log_helper_fwd.hpp>
19#include <userver/utils/fmt_compat.hpp>
21USERVER_NAMESPACE_BEGIN
23namespace formats::
bson {
26#pragma GCC diagnostic push
27#pragma GCC diagnostic ignored "-Wignored-attributes"
28using BsonHolder = std::shared_ptr<
const bson_t>;
29#pragma GCC diagnostic pop
32using ValueImplPtr = std::shared_ptr<ValueImpl>;
34using ParsedArray = std::vector<ValueImplPtr>;
35using ParsedDocument = std::unordered_map<std::string, ValueImplPtr>;
38using formats::
common::Path;
40inline constexpr auto kNull =
nullptr;
49 explicit Oid(std::string_view hex_encoded);
59 Oid(
const bson_oid_t&);
67 const uint8_t* Data()
const;
69 constexpr static size_t Size() {
return 12; }
80 const bson_oid_t* GetNative()
const;
83 bool operator==(
const Oid&)
const;
84 bool operator!=(
const Oid&)
const;
85 bool operator<(
const Oid&)
const;
86 bool operator>(
const Oid&)
const;
87 bool operator<=(
const Oid&)
const;
88 bool operator>=(
const Oid&)
const;
91 friend struct std::hash<
Oid>;
96logging::LogHelper& operator<<(logging::LogHelper& lh,
const Oid& value);
103 : data_(std::move(data))
108 const std::string& ToString()
const& {
return data_; }
109 std::string&& ToString() && {
return std::move(data_); }
111 const uint8_t* Data()
const {
return reinterpret_cast<
const uint8_t*>(data_.data()); }
112 size_t Size()
const {
return data_.size(); }
115 bool operator==(
const Binary& rhs)
const {
return data_ == rhs.data_; }
116 bool operator!=(
const Binary& rhs)
const {
return data_ != rhs.data_; }
117 bool operator<(
const Binary& rhs)
const {
return data_ < rhs.data_; }
118 bool operator>(
const Binary& rhs)
const {
return data_ > rhs.data_; }
119 bool operator<=(
const Binary& rhs)
const {
return data_ <= rhs.data_; }
120 bool operator>=(
const Binary& rhs)
const {
return data_ >= rhs.data_; }
123 friend struct std::hash<
Binary>;
138 Decimal128(
const bson_decimal128_t&);
152 const bson_decimal128_t* GetNative()
const;
159 bson_decimal128_t decimal_;
200 uint32_t timestamp_{0};
201 uint32_t increment_{0};
211struct hash<USERVER_NAMESPACE::formats::
bson::
Oid> {
212 size_t operator()(
const USERVER_NAMESPACE::formats::
bson::
Oid&)
const;
217 size_t operator()(
const USERVER_NAMESPACE::formats::
bson::
Binary& binary)
const {
218 return hash<string>()(binary.data_);
224 size_t operator()(
const USERVER_NAMESPACE::formats::
bson::
Timestamp& timestamp)
const;
230struct fmt::formatter<USERVER_NAMESPACE::formats::
bson::
Oid> {
231 constexpr static auto parse(format_parse_context& ctx) {
return ctx.begin(); }
233 template <
typename FormatContext>
235 return fmt::format_to(ctx.out(),
"{}", oid
.ToString());