userver: userver/storages/postgres/io/boost_multiprecision.hpp Source File
Loading...
Searching...
No Matches
boost_multiprecision.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/storages/postgres/io/boost_multiprecision.hpp
4/// @brief boost::multiprecision I/O support
5/// @ingroup userver_postgres_parse_and_format
6
7#include <userver/storages/postgres/io/buffer_io.hpp>
8#include <userver/storages/postgres/io/buffer_io_base.hpp>
9#include <userver/storages/postgres/io/numeric_data.hpp>
10#include <userver/storages/postgres/io/type_mapping.hpp>
11
12#include <boost/multiprecision/cpp_dec_float.hpp>
13
14USERVER_NAMESPACE_BEGIN
15
16namespace storages::postgres {
17
18template <unsigned Precision = 50>
20
21namespace io {
22
23template <unsigned Precision>
24struct BufferFormatter<MultiPrecision<Precision>> {
25 using Value = MultiPrecision<Precision>;
26 const Value& value;
27
28 BufferFormatter(const Value& val)
29 : value{val}
30 {}
31
32 template <typename Buffer>
33 void operator()(const UserTypes&, Buffer& buf) const {
34 auto str_rep = value.str(std::numeric_limits<Value>::max_digits10, std::ios_base::fixed);
35 auto bin_str = detail::StringToNumericBuffer(str_rep);
36 buf.reserve(buf.size() + bin_str.size());
37 std::copy(bin_str.begin(), bin_str.end(), std::back_inserter(buf));
38 }
39};
40
41template <unsigned Precision>
42struct BufferParser<MultiPrecision<Precision>> : detail::BufferParserBase<MultiPrecision<Precision>> {
43 using BaseType = detail::BufferParserBase<MultiPrecision<Precision>>;
44 using BaseType::BaseType;
45 using NumberType = boost::multiprecision::cpp_dec_float<Precision>;
46
47 void operator()(const FieldBuffer& buffer) {
48 auto str = detail::NumericBufferToString(buffer);
49 // cpp_dec_float provides const char* constructor, where it parses the
50 // contents to internal buffers. no std::string constructor is provided.
51 this->value = NumberType{str.c_str()};
52 }
53};
54
55template <unsigned Precision>
56struct CppToSystemPg<MultiPrecision<Precision>> : PredefinedOid<PredefinedOids::kNumeric> {};
57
58} // namespace io
59} // namespace storages::postgres
60
61USERVER_NAMESPACE_END