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
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>;
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>;
102 explicit Binary(std::string data) : data_(std::move(data)) {}
106 const std::string& ToString()
const& {
return data_; }
107 std::string&& ToString() && {
return std::move(data_); }
109 const uint8_t* Data()
const {
return reinterpret_cast<
const uint8_t*>(data_.data()); }
110 size_t Size()
const {
return data_.size(); }
113 bool operator==(
const Binary& rhs)
const {
return data_ == rhs.data_; }
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_; }
121 friend struct std::hash<
Binary>;
136 Decimal128(
const bson_decimal128_t&);
150 const bson_decimal128_t* GetNative()
const;
157 bson_decimal128_t decimal_;
198 uint32_t timestamp_{0};
199 uint32_t increment_{0};
210 size_t operator()(
const USERVER_NAMESPACE::
formats::
bson::
Oid&)
const;
215 size_t operator()(
const USERVER_NAMESPACE::
formats::
bson::
Binary& binary)
const {
216 return hash<string>()(binary.data_);
229 constexpr static auto parse(format_parse_context& ctx) {
return ctx.begin(); }
231 template <
typename FormatContext>
233 return fmt::format_to(ctx.out(),
"{}", oid
.ToString());