iceoryx2
C++ Language Bindings
Loading...
Searching...
No Matches
response_mut_uninit.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_MUT_UNINIT_HPP
14#define IOX2_RESPONSE_MUT_UNINIT_HPP
15
16#include "iox2/bb/slice.hpp"
18#include "iox2/payload_info.hpp"
19#include "iox2/response_mut.hpp"
20#include "iox2/service_type.hpp"
21
22namespace iox2 {
23
32template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
34 using ValueType = typename PayloadInfo<ResponsePayload>::ValueType;
35
36 public:
37 ResponseMutUninit(ResponseMutUninit&& rhs) noexcept = default;
38 auto operator=(ResponseMutUninit&& rhs) noexcept -> ResponseMutUninit& = default;
39 ~ResponseMutUninit() noexcept = default;
40
42 auto operator=(const ResponseMutUninit&) -> ResponseMutUninit& = 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 = ResponseUserHeader,
54 typename = std::enable_if_t<!std::is_same<void, ResponseUserHeader>::value, T>>
55 auto user_header_mut() -> T&;
56
58 template <typename T = ResponsePayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE, void>>
59 auto payload() const -> const T&;
60
62 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, void>>
63 auto payload() const -> bb::ImmutableSlice<ValueType>;
64
66 template <typename T = ResponsePayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE, void>>
67 auto payload_mut() -> T&;
68
70 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, void>>
71 auto payload_mut() -> bb::MutableSlice<ValueType>;
72
75 template <typename T = ResponsePayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE, T>>
76 auto write_payload(ResponsePayload&& payload) -> ResponseMut<Service, T, ResponseUserHeader>;
77
80 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, T>>
81 auto write_from_slice(bb::ImmutableSlice<ValueType>& value) -> ResponseMut<Service, T, ResponseUserHeader>;
82
85 template <typename T = ResponsePayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, T>>
86 auto write_from_fn(const iox2::bb::StaticFunction<typename T::ValueType(uint64_t)>& initializer)
87 -> ResponseMut<Service, T, ResponseUserHeader>;
88
89 private:
90 template <ServiceType, typename, typename, typename, typename>
91 friend class ActiveRequest;
92
93 template <ServiceType S, typename ResponsePayloadT, typename ResponseUserHeaderT>
94 friend auto assume_init(ResponseMutUninit<S, ResponsePayloadT, ResponseUserHeaderT>&& self)
95 -> ResponseMut<S, ResponsePayloadT, ResponseUserHeaderT>;
96
97 explicit ResponseMutUninit() = default;
98
99 ResponseMut<Service, ResponsePayload, ResponseUserHeader> m_response;
100};
101
102template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
103inline auto ResponseMutUninit<Service, ResponsePayload, ResponseUserHeader>::header() const -> ResponseHeader {
104 return m_response.header();
105}
106
107template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
108template <typename T, typename>
110 return m_response.template user_header<T>();
111}
112
113template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
114template <typename T, typename>
116 return m_response.template user_header_mut<T>();
117}
118
119template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
120template <typename T, typename>
122 return m_response.payload();
123}
124
125template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
126template <typename T, typename>
128 -> bb::ImmutableSlice<ValueType> {
129 return m_response.payload();
130}
131
132template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
133template <typename T, typename>
135 return m_response.payload_mut();
136}
137
138template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
139template <typename T, typename>
142 return m_response.payload_mut();
143}
144
145template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
146template <typename T, typename>
149 new (&payload_mut()) ResponsePayload(std::forward<T>(payload));
150 return std::move(m_response);
151}
152
153template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
154template <typename T, typename>
155inline auto
158 auto dest = payload_mut();
159 IOX2_ASSERT(dest.number_of_bytes() >= value.number_of_bytes(),
160 "Destination payload size is smaller than source slice size");
161 std::memcpy(dest.begin(), value.begin(), value.number_of_bytes());
162 return std::move(m_response);
163}
164
165template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
166template <typename T, typename>
168 const iox2::bb::StaticFunction<typename T::ValueType(uint64_t)>& initializer)
170 auto slice = payload_mut();
171 for (uint64_t i = 0; i < slice.number_of_elements(); ++i) {
172 new (&slice[i]) typename T::ValueType(initializer(i));
173 }
174 return std::move(m_response);
175}
176
177template <ServiceType Service, typename ResponsePayload, typename ResponseUserHeader>
182
183} // namespace iox2
184
185#endif
#define IOX2_ASSERT(condition, message)
only for debug builds: report fatal assert violation if expression evaluates to false
Response header used by [MessagingPattern::RequestResponse].
auto payload() const -> const T &
Returns a reference to the payload of the response.
auto payload_mut() -> T &
Returns a mutable reference to the payload of the response.
~ResponseMutUninit() noexcept=default
auto write_from_fn(const iox2::bb::StaticFunction< typename T::ValueType(uint64_t)> &initializer) -> ResponseMut< Service, T, ResponseUserHeader >
auto user_header() const -> const T &
Returns a reference to the user header of the response.
auto write_from_slice(bb::ImmutableSlice< ValueType > &value) -> ResponseMut< Service, T, ResponseUserHeader >
auto header() const -> ResponseHeader
Returns a reference to the [ResponseHeader].
ResponseMutUninit(ResponseMutUninit &&rhs) noexcept=default
auto write_payload(ResponsePayload &&payload) -> ResponseMut< Service, T, ResponseUserHeader >
auto user_header_mut() -> T &
Returns a mutable reference to the user header of the response.
friend auto assume_init(ResponseMutUninit< S, ResponsePayloadT, ResponseUserHeaderT > &&self) -> ResponseMut< S, ResponsePayloadT, ResponseUserHeaderT >
auto operator=(ResponseMutUninit &&rhs) noexcept -> ResponseMutUninit &=default
A class representing a slice of contiguous elements of type T.
Definition slice.hpp:31