9 #ifndef CLUON_FROMPROTOVISITOR_HPP 10 #define CLUON_FROMPROTOVISITOR_HPP 14 #include "cluon/any/any.hpp" 21 #include <unordered_map> 46 void decodeFrom(std::istream &in) noexcept;
52 void preVisit(int32_t
id,
const std::string &shortName,
const std::string &longName) noexcept;
53 void postVisit() noexcept;
55 void visit(uint32_t
id, std::string &&typeName, std::string &&name,
bool &v) noexcept;
56 void visit(uint32_t
id, std::string &&typeName, std::string &&name,
char &v) noexcept;
57 void visit(uint32_t
id, std::string &&typeName, std::string &&name, int8_t &v) noexcept;
58 void visit(uint32_t
id, std::string &&typeName, std::string &&name, uint8_t &v) noexcept;
59 void visit(uint32_t
id, std::string &&typeName, std::string &&name, int16_t &v) noexcept;
60 void visit(uint32_t
id, std::string &&typeName, std::string &&name, uint16_t &v) noexcept;
61 void visit(uint32_t
id, std::string &&typeName, std::string &&name, int32_t &v) noexcept;
62 void visit(uint32_t
id, std::string &&typeName, std::string &&name, uint32_t &v) noexcept;
63 void visit(uint32_t
id, std::string &&typeName, std::string &&name, int64_t &v) noexcept;
64 void visit(uint32_t
id, std::string &&typeName, std::string &&name, uint64_t &v) noexcept;
65 void visit(uint32_t
id, std::string &&typeName, std::string &&name,
float &v) noexcept;
66 void visit(uint32_t
id, std::string &&typeName, std::string &&name,
double &v) noexcept;
67 void visit(uint32_t
id, std::string &&typeName, std::string &&name, std::string &v) noexcept;
70 void visit(uint32_t &
id, std::string &&typeName, std::string &&name, T &v) noexcept {
74 if (m_callToDecodeFromWithDirectVisit) {
75 std::stringstream sstr{std::move(std::string(m_stringValue.data(),
static_cast<std::size_t
>(m_value)))};
79 else if (0 < m_mapOfKeyValues.count(
id)) {
81 std::stringstream sstr{linb::any_cast<std::string>(m_mapOfKeyValues[id])};
84 v.accept(nestedProtoDecoder);
85 }
catch (
const linb::bad_any_cast &) {
99 m_callToDecodeFromWithDirectVisit =
true;
102 if (0 < fromVarInt(in, m_keyFieldType)) {
105 m_fieldId =
static_cast<uint32_t
>(m_keyFieldType >> 3);
106 switch (m_protoType) {
110 fromVarInt(in, m_value);
111 v.accept(m_fieldId, *
this);
116 readBytesFromStream(in,
sizeof(
double), m_doubleValue.buffer.data());
117 m_doubleValue.uint64Value = le64toh(m_doubleValue.uint64Value);
118 v.accept(m_fieldId, *
this);
123 readBytesFromStream(in,
sizeof(
float), m_floatValue.buffer.data());
124 m_floatValue.uint32Value = le32toh(m_floatValue.uint32Value);
125 v.accept(m_fieldId, *
this);
130 fromVarInt(in, m_value);
131 const std::size_t BYTES_TO_READ_FROM_STREAM{
static_cast<std::size_t
>(m_value)};
132 if (m_stringValue.capacity() < BYTES_TO_READ_FROM_STREAM) {
133 m_stringValue.reserve(BYTES_TO_READ_FROM_STREAM);
135 readBytesFromStream(in, BYTES_TO_READ_FROM_STREAM, m_stringValue.data());
136 v.accept(m_fieldId, *
this);
142 m_callToDecodeFromWithDirectVisit =
false;
146 int8_t fromZigZag8(uint8_t v) noexcept;
147 int16_t fromZigZag16(uint16_t v) noexcept;
148 int32_t fromZigZag32(uint32_t v) noexcept;
149 int64_t fromZigZag64(uint64_t v) noexcept;
151 std::size_t fromVarInt(std::istream &in, uint64_t &value) noexcept;
153 void readBytesFromStream(std::istream &in, std::size_t bytesToReadFromStream,
char *buffer) noexcept;
158 bool m_callToDecodeFromWithDirectVisit{
false};
159 std::unordered_map<uint32_t, linb::any, UseUInt32ValueAsHashKey> m_mapOfKeyValues{};
167 std::array<char, sizeof(double)> buffer;
168 uint64_t uint64Value;
169 double doubleValue{0};
174 std::array<char, sizeof(float)> buffer;
175 uint32_t uint32Value;
180 std::vector<char> m_stringValue;
182 uint64_t m_keyFieldType{0};
184 uint32_t m_fieldId{0};
void decodeFrom(std::istream &in, T &v) noexcept
Definition: FromProtoVisitor.hpp:98
ProtoConstants
Definition: ProtoConstants.hpp:16
Definition: FromProtoVisitor.hpp:28
#define LIBCLUON_API
Definition: cluon.hpp:56
void decodeFrom(std::istream &in) noexcept
Definition: FromProtoVisitor.cpp:35
void visit(uint32_t &id, std::string &&typeName, std::string &&name, T &v) noexcept
Definition: FromProtoVisitor.hpp:70