Goby3 3.2.3
2025.05.13
Loading...
Searching...
No Matches
dccl.h
Go to the documentation of this file.
1// Copyright 2016-2022:
2// GobySoft, LLC (2013-)
3// Community contributors (see AUTHORS file)
4// File authors:
5// Toby Schneider <toby@gobysoft.org>
6//
7//
8// This file is part of the Goby Underwater Autonomy Project Libraries
9// ("The Goby Libraries").
10//
11// The Goby Libraries are free software: you can redistribute them and/or modify
12// them under the terms of the GNU Lesser General Public License as published by
13// the Free Software Foundation, either version 2.1 of the License, or
14// (at your option) any later version.
15//
16// The Goby Libraries are distributed in the hope that they will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU Lesser General Public License for more details.
20//
21// You should have received a copy of the GNU Lesser General Public License
22// along with Goby. If not, see <http://www.gnu.org/licenses/>.
23
24#ifndef GOBY_MIDDLEWARE_MARSHALLING_DCCL_H
25#define GOBY_MIDDLEWARE_MARSHALLING_DCCL_H
26
28
29#include "protobuf.h"
30
31namespace goby
32{
33namespace middleware
34{
35namespace protobuf
36{
37class InterVehicleSubscription;
38} // namespace protobuf
39
43template <typename DataType>
46{
47 public:
49 static std::vector<char> serialize(const DataType& msg)
50 {
51 std::lock_guard<std::mutex> lock(dccl_mutex_);
52 check_load<DataType>();
53 std::vector<char> bytes(codec().size(msg), 0);
54 codec().encode(bytes.data(), bytes.size(), msg);
55 return bytes;
56 }
57
65 static std::string type_name(const DataType& d = DataType())
66 {
67 return DataType::descriptor()->full_name();
68 }
69
73 template <typename CharIterator>
74 static std::shared_ptr<DataType> parse(CharIterator bytes_begin, CharIterator bytes_end,
75 CharIterator& actual_end,
76 const std::string& type = type_name())
77 {
78 std::lock_guard<std::mutex> lock(dccl_mutex_);
79 check_load<DataType>();
80 auto msg = std::make_shared<DataType>();
81 actual_end = codec().decode(bytes_begin, bytes_end, msg.get());
82 return msg;
83 }
84
94 static unsigned id()
95 {
96 std::lock_guard<std::mutex> lock(dccl_mutex_);
97 check_load<DataType>();
98 return codec().template id<DataType>();
99 }
100
101 static unsigned id(const google::protobuf::Message& d) { return id(); }
102
103 private:
104};
105
107template <>
110{
111 public:
113 static std::vector<char> serialize(const google::protobuf::Message& msg)
114 {
115 std::lock_guard<std::mutex> lock(dccl_mutex_);
116 check_load(msg.GetDescriptor());
117 std::vector<char> bytes(codec().size(msg), 0);
118 codec().encode(bytes.data(), bytes.size(), msg);
119 return bytes;
120 }
121
125 static std::string type_name(const google::protobuf::Message& d)
126 {
127 return type_name(d.GetDescriptor());
128 }
129
133 static std::string type_name(const google::protobuf::Descriptor* desc)
134 {
135 return desc->full_name();
136 }
137
145 template <typename CharIterator>
146 static std::shared_ptr<google::protobuf::Message>
147 parse(CharIterator bytes_begin, CharIterator bytes_end, CharIterator& actual_end,
148 const std::string& type, bool user_pool_first = false)
149 {
150 std::lock_guard<std::mutex> lock(dccl_mutex_);
151
152 auto msg = dccl::DynamicProtobufManager::new_protobuf_message<
153 std::shared_ptr<google::protobuf::Message>>(type, user_pool_first);
154
155 check_load(msg->GetDescriptor());
156 actual_end = codec().decode(bytes_begin, bytes_end, msg.get());
157 return msg;
158 }
159
161 static unsigned id(const google::protobuf::Descriptor* desc)
162 {
163 std::lock_guard<std::mutex> lock(dccl_mutex_);
164 check_load(desc);
165 return codec().id(desc);
166 }
167
169 static unsigned id(const google::protobuf::Message& d) { return id(d.GetDescriptor()); }
170
171 private:
172};
173
174} // namespace middleware
175} // namespace goby
176
177#endif
const Descriptor * GetDescriptor() const
Definition message.h:357
The global namespace for the Goby project.
extern ::PROTOBUF_NAMESPACE_ID::internal::ExtensionIdentifier< ::PROTOBUF_NAMESPACE_ID::MessageOptions, ::PROTOBUF_NAMESPACE_ID::internal::MessageTypeTraits< ::goby::GobyMessageOptions >, 11, false > msg
Definition dccl.h:58
Enumeration and helper functions for marshalling scheme identification.
Definition interface.h:46
static unsigned id(const google::protobuf::Message &d)
Definition dccl.h:101
static std::shared_ptr< DataType > parse(CharIterator bytes_begin, CharIterator bytes_end, CharIterator &actual_end, const std::string &type=type_name())
Parse one DCCL message.
Definition dccl.h:74
static std::string type_name(const DataType &d=DataType())
Full protobuf Message name (identical to Protobuf specialization)
Definition dccl.h:65
static std::vector< char > serialize(const DataType &msg)
Serialize message using DCCL encoding.
Definition dccl.h:49
static unsigned id(const google::protobuf::Descriptor *desc)
Returns the DCCL ID given a Protobuf Descriptor.
Definition dccl.h:161
static std::string type_name(const google::protobuf::Descriptor *desc)
Full protobuf name from descriptor, including package (if one is defined).
Definition dccl.h:133
static unsigned id(const google::protobuf::Message &d)
Returns the DCCL ID given an instantiated message.
Definition dccl.h:169
static std::shared_ptr< google::protobuf::Message > parse(CharIterator bytes_begin, CharIterator bytes_end, CharIterator &actual_end, const std::string &type, bool user_pool_first=false)
Parse DCCL/Protobuf message (using DCCL decoding) given the Protobuf type name and assuming the messa...
Definition dccl.h:147
static std::vector< char > serialize(const google::protobuf::Message &msg)
Serialize DCCL/Protobuf message (using DCCL encoding)
Definition dccl.h:113
static std::string type_name(const google::protobuf::Message &d)
Full protobuf name from message instantiation, including package (if one is defined).
Definition dccl.h:125
Class for parsing and serializing a given marshalling scheme. Must be specialized for a particular sc...
Definition interface.h:98
static std::string type_name()
The marshalling scheme specific string name for this type.
Definition interface.h:107
Wraps a dccl::Codec in a thread-safe way to make it usable by SerializerParserHelper.