13#ifndef IOX2_RESPONSE_MUT_HPP
14#define IOX2_RESPONSE_MUT_HPP
18#include "iox2/deployment/iceoryx2_cxx_feature_flags.hpp"
25#if IOX2_FEATURE_FLATBUFFERS
26#include <flatbuffers/flatbuffers.h>
41template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
58 template <typename T = ResponseUserHeader,
59 typename = std::enable_if_t<!std::is_same<
void, ResponseUserHeader>::value, T>>
63 template <typename T = ResponseUserHeader,
64 typename = std::enable_if_t<!std::is_same<
void, ResponseUserHeader>::value, T>>
68 template <typename T = ResponsePayload,
70 auto
payload() const -> const ResponsePayload&;
73 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
74 auto
payload() const -> bb::ImmutableSlice<ValueType>;
77 template <typename T = ResponsePayload,
82 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE,
void>>
85#if IOX2_FEATURE_FLATBUFFERS
87 template <typename T = ResponsePayload, typename = std::enable_if_t<has_flatbuffer_marker<T>(),
void>>
91 template <typename T = ResponsePayload, typename = std::enable_if_t<
has_flatbuffer_marker<T>(),
void>>
92 auto
payload_root() const -> const typename T::ValueType*;
96 template <ServiceType,
typename,
typename>
98 template <ServiceType,
typename,
typename,
typename,
typename>
103 template <ServiceType S,
typename ResponsePayloadT,
typename ResponseUserHeaderT>
109 iox2_response_mut_t m_response;
110 iox2_response_mut_h m_handle =
nullptr;
114template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
116 *
this = std::move(rhs);
121void iox2_response_mut_move(iox2_response_mut_t*, iox2_response_mut_t*, iox2_response_mut_h*);
125template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
131 internal::iox2_response_mut_move(&rhs.m_response, &m_response, &m_handle);
132 rhs.m_handle =
nullptr;
138template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
143#if IOX2_FEATURE_FLATBUFFERS
144template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
145template <
typename T,
typename>
147 -> bb::ImmutableSlice<uint8_t> {
148 const void* ptr =
nullptr;
149 size_t number_of_elements = 0;
151 iox2_response_mut_payload(&m_handle, &ptr, &number_of_elements);
152 auto payload_offset = header().payload_offset();
153 auto payload_len = header().number_of_elements();
158template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
159template <
typename T,
typename>
161 typename T::ValueType* {
162 return flatbuffers::GetRoot<typename T::ValueType>(payload_bytes().data());
166template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
168 iox2_response_header_h header_handle =
nullptr;
169 iox2_response_mut_header(&m_handle,
nullptr, &header_handle);
173template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
174template <
typename T,
typename>
176 const void* ptr =
nullptr;
177 iox2_response_mut_user_header(&m_handle, &ptr);
178 return *
static_cast<const T*
>(ptr);
181template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
182template <
typename T,
typename>
185 iox2_response_mut_user_header_mut(&m_handle, &ptr);
186 return *
static_cast<T*
>(ptr);
189template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
190template <
typename T,
typename>
192 const void* ptr =
nullptr;
193 iox2_response_mut_payload(&m_handle, &ptr,
nullptr);
194 return *
static_cast<const T*
>(ptr);
197template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
198template <
typename T,
typename>
200 -> bb::ImmutableSlice<ValueType> {
201 const void* ptr =
nullptr;
202 size_t number_of_elements = 0;
203 iox2_response_mut_payload(&m_handle, &ptr, &number_of_elements);
207 auto length = number_of_elements;
208 if (std::is_same<ValueType, CustomPayloadMarker>::value) {
209 length = iox2_response_mut_payload_number_of_bytes(&m_handle);
212 return bb::ImmutableSlice<ValueType>(
static_cast<const ValueType*
>(ptr), length);
215template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
216template <
typename T,
typename>
219 iox2_response_mut_payload_mut(&m_handle, &ptr,
nullptr);
220 return *
static_cast<ResponsePayload*
>(ptr);
223template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
224template <
typename T,
typename>
227 size_t number_of_elements = 0;
228 iox2_response_mut_payload_mut(&m_handle, &ptr, &number_of_elements);
232 auto length = number_of_elements;
233 if (std::is_same<ValueType, CustomPayloadMarker>::value) {
234 length = iox2_response_mut_payload_number_of_bytes(&m_handle);
237 return bb::MutableSlice<ValueType>(
static_cast<ValueType*
>(ptr), length);
241template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
244 auto result = iox2_response_mut_send(response.m_handle);
245 response.m_handle =
nullptr;
247 if (result == IOX2_OK) {
250 return bb::err(bb::into<SendError>(result));
253template <ServiceType Service,
typename ResponsePayload,
typename ResponseUserHeader>
254inline void ResponseMut<Service, ResponsePayload, ResponseUserHeader>::drop() {
255 if (m_handle !=
nullptr) {
256 iox2_response_mut_drop(m_handle);
auto payload_root() const -> const typename T::ValueType *
Returns the root of the flatbuffer.
friend auto send(ResponseMut< S, ResponsePayloadT, ResponseUserHeaderT > &&response) -> bb::Expected< void, SendError >
auto header() const -> ResponseHeader
Returns a reference to the [ResponseHeader].
auto payload_bytes() const -> bb::ImmutableSlice< uint8_t >
Returns the serialized flatbuffer data as bytes.
auto user_header() const -> const T &
Returns a reference to the user header of the response.
auto user_header_mut() -> T &
Returns a mutable reference to the user header of the response.
auto operator=(ResponseMut &&rhs) noexcept -> ResponseMut &
auto payload_mut() -> ResponsePayload &
Returns a mutable reference to the payload of the response.
ResponseMut(const ResponseMut &)=delete
auto operator=(const ResponseMut &) -> ResponseMut &=delete
auto payload() const -> const ResponsePayload &
Returns a reference to the payload of the response.
A class representing a slice of contiguous elements of type T.
constexpr auto err(const E &error) -> Unexpected< E >
iox2::bb::variation::Expected< T, E > Expected
constexpr auto has_flatbuffer_marker() -> bool
auto send(RequestMut< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader > &&request) -> bb::Expected< PendingResponse< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >, RequestSendError >