libcluon  0.0.148
ToProtoVisitor.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2017-2018 Christian Berger
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7  */
8 
9 #ifndef CLUON_TOPROTOVISITOR_HPP
10 #define CLUON_TOPROTOVISITOR_HPP
11 
12 #include "cluon/ProtoConstants.hpp"
13 #include "cluon/cluon.hpp"
14 
15 #include <cstdint>
16 #include <sstream>
17 #include <string>
18 
19 namespace cluon {
24  private:
25  ToProtoVisitor(const ToProtoVisitor &) = delete;
26  ToProtoVisitor(ToProtoVisitor &&) = delete;
27  ToProtoVisitor &operator=(const ToProtoVisitor &) = delete;
28  ToProtoVisitor &operator=(ToProtoVisitor &&) = delete;
29 
30  public:
31  ToProtoVisitor() = default;
32  ~ToProtoVisitor() = default;
33 
37  std::string encodedData() const noexcept;
38 
39  public:
40  // The following methods are provided to allow an instance of this class to
41  // be used as visitor for an instance with the method signature void accept<T>(T&);
42 
43  void preVisit(int32_t id, const std::string &shortName, const std::string &longName) noexcept;
44  void postVisit() noexcept;
45 
46  void visit(uint32_t id, std::string &&typeName, std::string &&name, bool &v) noexcept;
47  void visit(uint32_t id, std::string &&typeName, std::string &&name, char &v) noexcept;
48  void visit(uint32_t id, std::string &&typeName, std::string &&name, int8_t &v) noexcept;
49  void visit(uint32_t id, std::string &&typeName, std::string &&name, uint8_t &v) noexcept;
50  void visit(uint32_t id, std::string &&typeName, std::string &&name, int16_t &v) noexcept;
51  void visit(uint32_t id, std::string &&typeName, std::string &&name, uint16_t &v) noexcept;
52  void visit(uint32_t id, std::string &&typeName, std::string &&name, int32_t &v) noexcept;
53  void visit(uint32_t id, std::string &&typeName, std::string &&name, uint32_t &v) noexcept;
54  void visit(uint32_t id, std::string &&typeName, std::string &&name, int64_t &v) noexcept;
55  void visit(uint32_t id, std::string &&typeName, std::string &&name, uint64_t &v) noexcept;
56  void visit(uint32_t id, std::string &&typeName, std::string &&name, float &v) noexcept;
57  void visit(uint32_t id, std::string &&typeName, std::string &&name, double &v) noexcept;
58  void visit(uint32_t id, std::string &&typeName, std::string &&name, std::string &v) noexcept;
59 
60  template <typename T>
61  void visit(uint32_t &id, std::string &&typeName, std::string &&name, T &value) noexcept {
62  (void)typeName;
63  (void)name;
64 
65  toVarInt(m_buffer, std::move(encodeKey(id, static_cast<uint8_t>(ProtoConstants::LENGTH_DELIMITED))));
66  cluon::ToProtoVisitor nestedProtoEncoder;
67  value.accept(nestedProtoEncoder);
68  encode(m_buffer, std::move(nestedProtoEncoder.encodedData()));
69  }
70 
71  private:
72  std::size_t encode(std::ostream &o, bool &v) noexcept;
73  std::size_t encode(std::ostream &o, int8_t &v) noexcept;
74  std::size_t encode(std::ostream &o, uint8_t &v) noexcept;
75  std::size_t encode(std::ostream &o, int16_t &v) noexcept;
76  std::size_t encode(std::ostream &o, uint16_t &v) noexcept;
77  std::size_t encode(std::ostream &o, int32_t &v) noexcept;
78  std::size_t encode(std::ostream &o, uint32_t &v) noexcept;
79  std::size_t encode(std::ostream &o, int64_t &v) noexcept;
80  std::size_t encode(std::ostream &o, uint64_t &v) noexcept;
81  std::size_t encode(std::ostream &o, float &v) noexcept;
82  std::size_t encode(std::ostream &o, double &v) noexcept;
83  std::size_t encode(std::ostream &o, const std::string &v) noexcept;
84 
85  private:
86  uint8_t toZigZag8(int8_t v) noexcept;
87  uint16_t toZigZag16(int16_t v) noexcept;
88  uint32_t toZigZag32(int32_t v) noexcept;
89  uint64_t toZigZag64(int64_t v) noexcept;
90 
98  std::size_t toVarInt(std::ostream &out, uint64_t v) noexcept;
99 
107  template <typename T>
108  std::size_t toKeyValue(uint32_t fieldIdentifier, T &v) noexcept {
109  std::size_t size{0};
110  uint64_t key = encodeKey(fieldIdentifier, static_cast<uint8_t>(ProtoConstants::VARINT));
111  size += toVarInt(m_buffer, key);
112  size += encode(m_buffer, v);
113  return size;
114  }
115 
123  uint64_t encodeKey(uint32_t fieldIdentifier, uint8_t protoType) noexcept;
124 
125  private:
126  std::stringstream m_buffer{""};
127 };
128 } // namespace cluon
129 
130 #endif
Definition: cluon.hpp:65
mf fieldIdentifier((!_fieldIdentifier.empty() ? static_cast< uint32_t >(std::stoi(::stringtoolbox::trim(_fieldIdentifier))) :fieldIdentifierCounter))
#define LIBCLUON_API
Definition: cluon.hpp:56
std::string encodedData() const noexcept
Definition: ToProtoVisitor.cpp:15
void visit(uint32_t &id, std::string &&typeName, std::string &&name, T &value) noexcept
Definition: ToProtoVisitor.hpp:61
Definition: ToProtoVisitor.hpp:23