#ifndef RFL_BSON_WRITE_HPP_ #define RFL_BSON_WRITE_HPP_ #include #include #include #include #include #include "../Processors.hpp" #include "../parsing/Parent.hpp" #include "Parser.hpp" namespace rfl { namespace bson { /// Returns BSON bytes. Careful: It is the responsibility of the caller to call /// bson_free on the returned pointer. template std::pair to_buffer(const auto& _obj) noexcept { using T = std::remove_cvref_t; using ParentType = parsing::Parent; bson_t* doc = nullptr; uint8_t* buf = nullptr; size_t buflen = 0; bson_writer_t* bson_writer = bson_writer_new(&buf, &buflen, 0, bson_realloc_ctx, NULL); bson_writer_begin(bson_writer, &doc); const auto rfl_writer = Writer(doc); Parser>::write(rfl_writer, _obj, typename ParentType::Root{}); bson_writer_end(bson_writer); const auto len = bson_writer_get_length(bson_writer); bson_writer_destroy(bson_writer); return std::make_pair(buf, len); } /// Returns BSON bytes. template std::vector write(const auto& _obj) noexcept { auto [buf, len] = to_buffer(_obj); const auto result = std::vector(reinterpret_cast(buf), reinterpret_cast(buf) + len); bson_free(buf); return result; } /// Writes a BSON into an ostream. template std::ostream& write(const auto& _obj, std::ostream& _stream) noexcept { auto [buf, len] = to_buffer(_obj); _stream.write(reinterpret_cast(buf), len); bson_free(buf); return _stream; } } // namespace bson } // namespace rfl #endif // BSON_PARSER_HPP_