libcluon  0.0.148
ToMsgPackVisitor.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_TOMSGPACKVISITOR_HPP
10 #define CLUON_TOMSGPACKVISITOR_HPP
11 
13 #include "cluon/cluon.hpp"
14 
15 #include <cstdint>
16 #include <sstream>
17 #include <string>
18 
19 namespace cluon {
24  private:
25  ToMsgPackVisitor(const ToMsgPackVisitor &) = delete;
27  ToMsgPackVisitor &operator=(const ToMsgPackVisitor &) = delete;
28  ToMsgPackVisitor &operator=(ToMsgPackVisitor &&) = delete;
29 
30  public:
31  ToMsgPackVisitor() = default;
32  ~ToMsgPackVisitor() = 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)id;
63  (void)typeName;
64 
65  encode(m_buffer, name);
66  {
67  cluon::ToMsgPackVisitor nestedMsgPackEncoder;
68  value.accept(nestedMsgPackEncoder);
69  const std::string tmp{nestedMsgPackEncoder.encodedData()};
70  const uint32_t LENGTH{static_cast<uint32_t>(tmp.size())};
71  m_buffer.write(tmp.c_str(), static_cast<std::streamsize>(LENGTH));
72  }
73  m_numberOfFields++;
74  }
75 
76  private:
77  void encode(std::ostream &o, const std::string &s);
78  void encodeUint(std::ostream &o, uint64_t v);
79  void encodeInt(std::ostream &o, int64_t v);
80 
81  private:
82  uint32_t m_numberOfFields{0};
83  std::stringstream m_buffer{""};
84 };
85 } // namespace cluon
86 
87 #endif
Definition: cluon.hpp:65
Definition: ToMsgPackVisitor.hpp:23
#define LIBCLUON_API
Definition: cluon.hpp:56
void visit(uint32_t &id, std::string &&typeName, std::string &&name, T &value) noexcept
Definition: ToMsgPackVisitor.hpp:61
std::string encodedData() const noexcept
Definition: ToMsgPackVisitor.cpp:22