6 #ifndef JBSON_BUILDER_HPP
7 #define JBSON_BUILDER_HPP
11 #include <jbson/element.hpp>
12 #include <jbson/document.hpp>
66 template <
typename Arg1,
typename... ArgN>
explicit builder(Arg1&& arg, ArgN&&... args) {
67 emplace(std::forward<Arg1>(arg), std::forward<ArgN>(args)...);
82 emplace(std::forward<Args>(args)...);
99 auto old_size = m_elements.size();
102 std::forward<Args>(args)...);
105 m_elements.resize(old_size);
128 return std::move(
emplace(std::forward<Args>(args)...));
145 return std::move(
emplace(std::forward<Args>(args)...));
155 m_elements.push_back(
'\0');
156 auto size = jbson::detail::native_to_little_endian(static_cast<int32_t>(m_elements.size()));
157 static_assert(4 == size.size(),
"");
159 boost::range::copy(size, m_elements.begin());
161 m_elements.pop_back();
162 return std::move(doc);
172 m_elements.push_back(
'\0');
173 auto size = jbson::detail::native_to_little_endian(static_cast<int32_t>(m_elements.size()));
174 static_assert(4 == size.size(),
"");
176 boost::range::copy(size, m_elements.begin());
181 mutable std::vector<char> m_elements{{0, 0, 0, 0}};
192 template <
typename Arg1,
typename... ArgN>
explicit array_builder(Arg1&& arg, ArgN&&... args) {
193 emplace(std::forward<Arg1>(arg), std::forward<ArgN>(args)...);
198 template <
typename... Args>
array_builder& operator()(Args&&... args) & {
199 static_assert(
sizeof...(Args) > 0,
"");
200 emplace(std::forward<Args>(args)...);
204 template <
typename... Args>
array_builder& emplace(Args&&... args) & {
205 static_assert(
sizeof...(Args) > 0,
"");
206 std::array<char, std::numeric_limits<decltype(m_count)>::digits10 + 1> int_str;
207 auto n = std::snprintf(int_str.data(), int_str.size(),
"%zd", m_count);
210 BOOST_THROW_EXCEPTION(std::system_error(errno, std::generic_category()));
213 auto old_size = m_elements.size();
216 m_elements, m_elements.end(), boost::string_ref{int_str.data(),
static_cast<size_t>(n)},
217 std::forward<Args>(args)...);
221 m_elements.resize(old_size);
230 template <
typename... Args>
array_builder&& operator()(Args&&... args) && {
231 return std::move(emplace(std::forward<Args>(args)...));
234 template <
typename... Args>
array_builder&& emplace(Args&&... args) && {
235 return std::move(emplace(std::forward<Args>(args)...));
239 m_elements.push_back(
'\0');
240 auto size = jbson::detail::native_to_little_endian(static_cast<int32_t>(m_elements.size()));
241 static_assert(4 == size.size(),
"");
243 boost::range::copy(size, m_elements.begin());
245 m_elements.pop_back();
246 return std::move(doc);
250 m_elements.push_back(
'\0');
251 auto size = jbson::detail::native_to_little_endian(static_cast<int32_t>(m_elements.size()));
252 static_assert(4 == size.size(),
"");
254 boost::range::copy(size, m_elements.begin());
259 mutable std::vector<char> m_elements{{0, 0, 0, 0}};
260 uint32_t m_count{0u};
275 #endif // JBSON_BUILDER_HPP
std::enable_if_t< detail::is_valid_element_value_type< container_type, T >::value, T > value() const
Returns the value data in the form of a specific type.
array_builder provides a simple interface for array construction
builder && operator()(Args &&...args)&&
Rvalue overload. Forwards *this as an rvalue reference. Constructs a BSON element in place with the s...
Type trait to determine whether a type is a boost::iterator_range.
builder & emplace(Args &&...args)&
Constructs a BSON element in place with the supplied args.
builder()=default
Default constructor.
basic_array< std::vector< char >> array
Default basic_array type alias for owned BSON data.
builder & operator()(Args &&...args)&
Forwards to emplace.
builder(Arg1 &&arg, ArgN &&...args)
Constructor which forwards to emplace.
basic_document< std::vector< char >> document
Default basic_document type alias for owned BSON data.
builder provides a simple interface for document construction.
builder && emplace(Args &&...args)&&
Rvalue overload. Forwards *this as an rvalue reference. Constructs a BSON element in place with the s...