Skip to content

Commit bbf7a66

Browse files
Better solution for the writer
1 parent 661dced commit bbf7a66

File tree

1 file changed

+30
-22
lines changed

1 file changed

+30
-22
lines changed

include/rfl/bson/Writer.hpp

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ namespace bson {
2222

2323
/// Please refer to https://mongoc.org/libbson/current/api.html
2424
class Writer {
25+
struct BSONType {
26+
bson_t val_;
27+
};
28+
2529
struct IsArray {
2630
bson_array_builder_t* ptr_;
2731
};
@@ -43,10 +47,10 @@ class Writer {
4347
};
4448

4549
struct BSONOutputObject {
46-
BSONOutputObject(bson_t _val, ParentType _parent)
50+
BSONOutputObject(bson_t* _val, ParentType _parent)
4751
: parent_(_parent), val_(_val) {}
4852
ParentType parent_;
49-
bson_t val_;
53+
bson_t* val_;
5054
};
5155

5256
struct BSONOutputVar {};
@@ -65,9 +69,7 @@ class Writer {
6569
}
6670

6771
OutputObjectType object_as_root(const size_t _size) const noexcept {
68-
bson_t val;
69-
bson_init(&val);
70-
return OutputObjectType(val, IsRoot{});
72+
return OutputObjectType(doc_, IsRoot{});
7173
}
7274

7375
OutputVarType null_as_root() const noexcept {
@@ -93,25 +95,27 @@ class Writer {
9395
const std::string& _name, const size_t _size,
9496
OutputObjectType* _parent) const noexcept {
9597
bson_array_builder_t* val;
96-
bson_append_array_builder_begin(&(_parent->val_), _name.c_str(),
98+
bson_append_array_builder_begin(_parent->val_, _name.c_str(),
9799
static_cast<int>(_name.size()), &val);
98-
return OutputArrayType(val, IsObject{&(_parent->val_)});
100+
return OutputArrayType(val, IsObject{_parent->val_});
99101
}
100102

101103
OutputObjectType add_object_to_array(
102104
const size_t _size, OutputArrayType* _parent) const noexcept {
103-
bson_t val;
104-
bson_array_builder_append_document_begin(_parent->val_, &val);
105-
return OutputObjectType(val, IsArray{_parent->val_});
105+
subdocs_->push_back(BSONType{});
106+
bson_array_builder_append_document_begin(_parent->val_,
107+
&subdocs_->back().val_);
108+
return OutputObjectType(&subdocs_->back().val_, IsArray{_parent->val_});
106109
}
107110

108111
OutputObjectType add_object_to_object(
109112
const std::string& _name, const size_t _size,
110113
OutputObjectType* _parent) const noexcept {
111-
bson_t val;
112-
bson_append_document_begin(&(_parent->val_), _name.c_str(),
113-
static_cast<int>(_name.size()), &val);
114-
return OutputObjectType(val, IsObject{&(_parent->val_)});
114+
subdocs_->push_back(BSONType{});
115+
bson_append_document_begin(_parent->val_, _name.c_str(),
116+
static_cast<int>(_name.size()),
117+
&subdocs_->back().val_);
118+
return OutputObjectType(&subdocs_->back().val_, IsObject{_parent->val_});
115119
}
116120

117121
template <class T>
@@ -138,18 +142,18 @@ class Writer {
138142
OutputVarType add_value_to_object(const std::string& _name, const T& _var,
139143
OutputObjectType* _parent) const noexcept {
140144
if constexpr (std::is_same<std::remove_cvref_t<T>, std::string>()) {
141-
bson_append_utf8(&(_parent->val_), _name.c_str(),
145+
bson_append_utf8(_parent->val_, _name.c_str(),
142146
static_cast<int>(_name.size()), _var.c_str(),
143147
static_cast<int>(_var.size()));
144148
} else if constexpr (std::is_same<std::remove_cvref_t<T>, bool>()) {
145-
bson_append_bool(&(_parent->val_), _name.c_str(),
149+
bson_append_bool(_parent->val_, _name.c_str(),
146150
static_cast<int>(_name.size()), _var);
147151
} else if constexpr (std::is_floating_point<std::remove_cvref_t<T>>()) {
148-
bson_append_double(&(_parent->val_), _name.c_str(),
152+
bson_append_double(_parent->val_, _name.c_str(),
149153
static_cast<int>(_name.size()),
150154
static_cast<double>(_var));
151155
} else if constexpr (std::is_integral<std::remove_cvref_t<T>>()) {
152-
bson_append_int64(&(_parent->val_), _name.c_str(),
156+
bson_append_int64(_parent->val_, _name.c_str(),
153157
static_cast<int>(_name.size()),
154158
static_cast<std::int32_t>(_var));
155159
} else {
@@ -165,7 +169,7 @@ class Writer {
165169

166170
OutputVarType add_null_to_object(const std::string& _name,
167171
OutputObjectType* _parent) const noexcept {
168-
bson_append_null(&(_parent->val_), _name.c_str(),
172+
bson_append_null(_parent->val_, _name.c_str(),
169173
static_cast<int>(_name.size()));
170174
return OutputVarType{};
171175
}
@@ -190,11 +194,10 @@ class Writer {
190194
const auto handle = [&](const auto _parent) {
191195
using Type = std::remove_cvref_t<decltype(_parent)>;
192196
if constexpr (std::is_same<Type, IsArray>()) {
193-
bson_array_builder_append_document_end(_parent.ptr_, &(_obj->val_));
197+
bson_array_builder_append_document_end(_parent.ptr_, _obj->val_);
194198
} else if constexpr (std::is_same<Type, IsObject>()) {
195-
bson_append_document_end(_parent.ptr_, &(_obj->val_));
199+
bson_append_document_end(_parent.ptr_, _obj->val_);
196200
} else if constexpr (std::is_same<Type, IsRoot>()) {
197-
*doc_ = _obj->val_;
198201
} else {
199202
static_assert(rfl::always_false_v<Type>, "Unsupported type.");
200203
}
@@ -203,7 +206,12 @@ class Writer {
203206
}
204207

205208
private:
209+
/// Pointer to the main document. In BSON, documents are what are usually
210+
/// called objects.
206211
bson_t* const doc_;
212+
213+
/// Contain all of the subdocuments.
214+
const rfl::Ref<std::vector<BSONType>> subdocs_;
207215
};
208216

209217
} // namespace bson

0 commit comments

Comments
 (0)