iceoryx2
C++ Bindings
Loading...
Searching...
No Matches
response.hpp
Go to the documentation of this file.
1// Copyright (c) 2025 Contributors to the Eclipse Foundation
2//
3// See the NOTICE file(s) distributed with this work for additional
4// information regarding copyright ownership.
5//
6// This program and the accompanying materials are made available under the
7// terms of the Apache Software License 2.0 which is available at
8// https://www.apache.org/licenses/LICENSE-2.0, or the MIT license
9// which is available at https://opensource.org/licenses/MIT.
10//
11// SPDX-License-Identifier: Apache-2.0 OR MIT
12
13#ifndef IOX2_RESPONSE_HPP
14#define IOX2_RESPONSE_HPP
15
17#include "iox2/bb/slice.hpp"
18#include "iox2/deployment/iceoryx2_cxx_feature_flags.hpp"
19#include "iox2/marker.hpp"
20#include "iox2/payload_info.hpp"
21#include "iox2/service_type.hpp"
22
23#if IOX2_FEATURE_FLATBUFFERS
24#include <flatbuffers/flatbuffers.h>
25#endif // IOX2_FEATURE_FLATBUFFERS
26
27#include <type_traits>
28
29namespace iox2 {
32template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
33class Response {
34 using ValueType = typename PayloadInfo<ResponsePayload>::ValueType;
35
36 public:
37 Response(Response&& rhs) noexcept;
38 auto operator=(Response&& rhs) noexcept -> Response&;
39 ~Response() noexcept;
40
41 Response(const Response&) noexcept = delete;
42 auto operator=(const Response&) noexcept -> Response& = delete;
43
45 auto header() const -> ResponseHeader;
46
48 template <typename T = ResponseUserHeader,
49 typename = std::enable_if_t<!std::is_same<void, ResponseUserHeader>::value, T>>
50 auto user_header() const -> const T&;
51
53 template <typename T = ResponsePayload,
54 typename = std::enable_if_t<!bb::IsSlice<T>::VALUE && !has_flatbuffer_marker<T>(), void>>
55 auto payload() const -> const T&;
56
58 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, void>>
59 auto payload() const -> bb::ImmutableSlice<ValueType>;
60
63 auto origin() const -> UniqueServerId;
64
65#if IOX2_FEATURE_FLATBUFFERS
67 template <typename T = ResponsePayload, typename = std::enable_if_t<has_flatbuffer_marker<T>(), void>>
68 auto payload_bytes() const -> bb::ImmutableSlice<uint8_t>;
69
71 template <typename T = ResponsePayload, typename = std::enable_if_t<has_flatbuffer_marker<T>(), void>>
72 auto payload_root() const -> const typename T::ValueType*;
73#endif // IOX2_FEATURE_FLATBUFFERS
74
75 private:
76 template <ServiceType, typename, typename, typename, typename>
77 friend class PendingResponse;
78
79 explicit Response(iox2_response_h handle) noexcept;
80
81 void drop();
82
83 iox2_response_h m_handle = nullptr;
84};
85
86template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
88 *this = std::move(rhs);
89}
90
91template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
93 if (this != &rhs) {
94 drop();
95 m_handle = rhs.m_handle;
96 rhs.m_handle = nullptr;
97 }
98
99 return *this;
100}
101
102template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
106
107#if IOX2_FEATURE_FLATBUFFERS
108template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
109template <typename T, typename>
111 -> bb::ImmutableSlice<uint8_t> {
112 const void* ptr = nullptr;
113 size_t number_of_elements = 0;
114
115 iox2_response_payload(&m_handle, &ptr, &number_of_elements);
116 auto payload_offset = header().payload_offset();
117 auto payload_len = header().number_of_elements();
118
119 return bb::ImmutableSlice<uint8_t>(static_cast<const uint8_t*>(ptr) + payload_offset, payload_len - payload_offset);
120}
121
122template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
123template <typename T, typename>
125 typename T::ValueType* {
126 return flatbuffers::GetRoot<typename T::ValueType>(payload_bytes().data());
127}
128#endif // IOX2_FEATURE_FLATBUFFERS
129
130template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
132 iox2_response_header_h header_handle = nullptr;
133 iox2_response_header(&m_handle, nullptr, &header_handle);
134 return ResponseHeader { header_handle };
135}
136
137template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
138template <typename T, typename>
140 const void* ptr = nullptr;
141 iox2_response_user_header(&m_handle, &ptr);
142 return *static_cast<const T*>(ptr);
143}
144
145template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
146template <typename T, typename>
148 const void* ptr = nullptr;
149 iox2_response_payload(&m_handle, &ptr, nullptr);
150 return *static_cast<const T*>(ptr);
151}
152
153template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
154template <typename T, typename>
155inline auto Response<Service, ResponsePayload, ResponseUserHeader>::payload() const -> bb::ImmutableSlice<ValueType> {
156 const void* ptr = nullptr;
157 size_t number_of_elements = 0;
158 iox2_response_payload(&m_handle, &ptr, &number_of_elements);
159
160 // for the custom payload marker, the slice length is the
161 // runtime payload byte size
162 auto length = number_of_elements;
163 if (std::is_same<ValueType, CustomPayloadMarker>::value) {
164 length = iox2_response_payload_number_of_bytes(&m_handle);
165 }
166
167 return bb::ImmutableSlice<ValueType>(static_cast<const ValueType*>(ptr), length);
168}
169
170template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
172 return header().server_port_id();
173}
174
175template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
176inline Response<Service, ResponsePayload, ResponseUserHeader>::Response(iox2_response_h handle) noexcept
177 : m_handle(handle) {
178}
179
180template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
181inline void Response<Service, ResponsePayload, ResponseUserHeader>::drop() {
182 if (m_handle != nullptr) {
183 iox2_response_drop(m_handle);
184 m_handle = nullptr;
185 }
186}
187} // namespace iox2
188
189#endif
Response header used by [MessagingPattern::RequestResponse].
auto payload() const -> const T &
Returns a reference to the payload of the response.
Definition response.hpp:147
auto operator=(Response &&rhs) noexcept -> Response &
Definition response.hpp:92
auto operator=(const Response &) noexcept -> Response &=delete
auto header() const -> ResponseHeader
Returns a reference to the [ResponseHeader].
Definition response.hpp:131
Response(Response &&rhs) noexcept
Definition response.hpp:87
~Response() noexcept
Definition response.hpp:103
auto payload_root() const -> const typename T::ValueType *
Returns the root of the flatbuffer.
Definition response.hpp:124
auto user_header() const -> const T &
Returns a reference to the user header of the response.
Definition response.hpp:139
auto origin() const -> UniqueServerId
Definition response.hpp:171
auto payload_bytes() const -> bb::ImmutableSlice< uint8_t >
Returns the serialized flatbuffer data as bytes.
Definition response.hpp:110
Response(const Response &) noexcept=delete
The system-wide unique id of a [Server].
A class representing a slice of contiguous elements of type T.
Definition slice.hpp:31
constexpr auto has_flatbuffer_marker() -> bool
Definition marker.hpp:53