13#ifndef IOX2_RESPONSE_HPP
14#define IOX2_RESPONSE_HPP
18#include "iox2/deployment/iceoryx2_cxx_feature_flags.hpp"
23#if IOX2_FEATURE_FLATBUFFERS
24#include <flatbuffers/flatbuffers.h>
32template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
48 template <typename T = ResponseUserHeader,
49 typename = std::enable_if_t<!std::is_same<
void, ResponseUserHeader>::value, T>>
53 template <typename T = ResponsePayload,
55 auto
payload() const -> const T&;
58 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
59 auto
payload() const -> bb::ImmutableSlice<ValueType>;
65#if IOX2_FEATURE_FLATBUFFERS
67 template <typename T = ResponsePayload, typename = std::enable_if_t<has_flatbuffer_marker<T>(),
void>>
71 template <typename T = ResponsePayload, typename = std::enable_if_t<
has_flatbuffer_marker<T>(),
void>>
72 auto
payload_root() const -> const typename T::ValueType*;
76 template <ServiceType,
typename,
typename,
typename,
typename>
79 explicit Response(iox2_response_h handle)
noexcept;
83 iox2_response_h m_handle =
nullptr;
86template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
88 *
this = std::move(rhs);
91template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
95 m_handle = rhs.m_handle;
96 rhs.m_handle =
nullptr;
102template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
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;
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();
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());
130template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
132 iox2_response_header_h header_handle =
nullptr;
133 iox2_response_header(&m_handle,
nullptr, &header_handle);
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);
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);
153template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
154template <
typename T,
typename>
156 const void* ptr =
nullptr;
157 size_t number_of_elements = 0;
158 iox2_response_payload(&m_handle, &ptr, &number_of_elements);
162 auto length = number_of_elements;
163 if (std::is_same<ValueType, CustomPayloadMarker>::value) {
164 length = iox2_response_payload_number_of_bytes(&m_handle);
167 return bb::ImmutableSlice<ValueType>(
static_cast<const ValueType*
>(ptr), length);
170template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
172 return header().server_port_id();
175template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
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);
auto payload() const -> const T &
Returns a reference to the payload of the response.
auto operator=(Response &&rhs) noexcept -> Response &
auto operator=(const Response &) noexcept -> Response &=delete
auto header() const -> ResponseHeader
Returns a reference to the [ResponseHeader].
Response(Response &&rhs) noexcept
auto payload_root() const -> const typename T::ValueType *
Returns the root of the flatbuffer.
auto user_header() const -> const T &
Returns a reference to the user header of the response.
auto origin() const -> UniqueServerId
auto payload_bytes() const -> bb::ImmutableSlice< uint8_t >
Returns the serialized flatbuffer data as bytes.
Response(const Response &) noexcept=delete
The system-wide unique id of a [Server].
A class representing a slice of contiguous elements of type T.
constexpr auto has_flatbuffer_marker() -> bool