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;
90 friend struct std::hash<
Oid>;
95logging::LogHelper& operator<<(logging::LogHelper& lh,
const Oid& value);
102 : data_(std::move(data))
107 const std::string& ToString()
const& {
return data_; }
108 std::string&& ToString() && {
return std::move(data_); }
110 const uint8_t* Data()
const {
return reinterpret_cast<
const uint8_t*>(data_.data()); }
111 size_t Size()
const {
return data_.size(); }
114 bool operator==(
const Binary& rhs)
const {
return data_ == rhs.data_; }
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_; }
122 friend struct std::hash<
Binary>;
137 Decimal128(
const bson_decimal128_t&);
151 const bson_decimal128_t* GetNative()
const;
158 bson_decimal128_t decimal_;
199 uint32_t timestamp_{0};
200 uint32_t increment_{0};
210struct hash<USERVER_NAMESPACE::formats::
bson::
Oid> {
211 size_t operator()(
const USERVER_NAMESPACE::formats::
bson::
Oid&)
const;
216 size_t operator()(
const USERVER_NAMESPACE::formats::
bson::
Binary& binary)
const {
217 return hash<string>()(binary.data_);
223 size_t operator()(
const USERVER_NAMESPACE::formats::
bson::
Timestamp& timestamp)
const;
229struct fmt::formatter<USERVER_NAMESPACE::formats::
bson::
Oid> {
230 constexpr static auto parse(format_parse_context& ctx) {
return ctx.begin(); }
232 template <
typename FormatContext>
234 return fmt::format_to(ctx.out(),
"{}", oid
.ToString());