CARLA
Message.h
Go to the documentation of this file.
1 // Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2 // de Barcelona (UAB).
3 //
4 // This work is licensed under the terms of the MIT license.
5 // For a copy, see <https://opensource.org/licenses/MIT>.
6 
7 #pragma once
8 
9 #include "carla/ListView.h"
10 #include "carla/Buffer.h"
11 #include "carla/Debug.h"
12 #include "carla/NonCopyable.h"
14 
15 #include <boost/asio/buffer.hpp>
16 
17 #include <array>
18 #include <exception>
19 #include <limits>
20 #include <memory>
21 #include <string>
22 
23 namespace carla {
24 namespace streaming {
25 namespace detail {
26 namespace tcp {
27 
28  /// Serialization of a set of buffers to be sent over a TCP socket as a single
29  /// message. Template paramenter @a MaxNumberOfBuffers imposes a compile-time
30  /// limit on the maximum number of buffers that can be included in a single
31  /// message.
32  template <size_t MaxNumberOfBuffers>
34  : public std::enable_shared_from_this<MessageTmpl<MaxNumberOfBuffers>>,
35  private NonCopyable {
36  public:
37 
38  static constexpr size_t max_size() {
39  return MaxNumberOfBuffers;
40  }
41 
42  private:
43 
44  MessageTmpl(size_t) {}
45 
46  template <typename... Buffers>
47  MessageTmpl(size_t size, Buffer &&buffer, Buffers &&... buffers)
48  : MessageTmpl(size, std::move(buffers)...) {
50  _total_size += buffer.size();
51  _buffer_views[1u + size - _number_of_buffers] = buffer.cbuffer();
52  _buffers[size - _number_of_buffers] = std::move(buffer);
53  }
54 
55  public:
56 
57  template <typename... Buffers>
58  MessageTmpl(Buffer &&buf, Buffers &&... buffers)
59  : MessageTmpl(sizeof...(Buffers) + 1u, std::move(buf), std::move(buffers)...) {
60  static_assert(sizeof...(Buffers) < max_size(), "Too many buffers!");
61  _buffer_views[0u] = boost::asio::buffer(&_total_size, sizeof(_total_size));
62  }
63 
64  /// Size in bytes of the message excluding the header.
65  auto size() const noexcept {
66  return _total_size;
67  }
68 
69  bool empty() const noexcept {
70  return size() == 0u;
71  }
72 
73  auto GetBufferSequence() const {
74  auto begin = _buffer_views.begin();
75  return MakeListView(begin, begin + _number_of_buffers + 1u);
76  }
77 
78  private:
79 
81 
83 
84  std::array<Buffer, MaxNumberOfBuffers> _buffers;
85 
86  std::array<boost::asio::const_buffer, MaxNumberOfBuffers + 1u> _buffer_views;
87  };
88 
89  /// A TCP message containing a maximum of 2 buffers. This is optimized for a
90  /// header and body sort of messages.
92 
93 } // namespace tcp
94 } // namespace detail
95 } // namespace streaming
96 } // namespace carla
static constexpr size_t max_size()
Definition: Message.h:38
auto size() const noexcept
Size in bytes of the message excluding the header.
Definition: Message.h:65
std::array< Buffer, MaxNumberOfBuffers > _buffers
Definition: Message.h:84
std::array< boost::asio::const_buffer, MaxNumberOfBuffers+1u > _buffer_views
Definition: Message.h:86
This file contains definitions of common data structures used in traffic manager. ...
Definition: Carla.cpp:133
uint32_t message_size_type
Definition: Types.h:20
Serialization of a set of buffers to be sent over a TCP socket as a single message.
Definition: Message.h:33
MessageTmpl(Buffer &&buf, Buffers &&... buffers)
Definition: Message.h:58
A piece of raw data.
Definition: carla/Buffer.h:41
MessageTmpl(size_t size, Buffer &&buffer, Buffers &&... buffers)
Definition: Message.h:47
Inherit (privately) to suppress copy/move construction and assignment.
static auto MakeListView(Iterator begin, Iterator end)