iceoryx2
C++ Language Bindings
Loading...
Searching...
No Matches
request_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_REQUEST_MUT_UNINIT_HPP
14#define IOX2_REQUEST_MUT_UNINIT_HPP
15
18#include "iox2/request_mut.hpp"
19#include "iox2/service_type.hpp"
20
21namespace iox2 {
22
26template <ServiceType Service,
27 typename RequestPayload,
28 typename RequestUserHeader,
29 typename ResponsePayload,
30 typename ResponseUserHeader>
32 using ValueType = typename PayloadInfo<RequestPayload>::ValueType;
33
34 public:
35 RequestMutUninit(RequestMutUninit&& rhs) noexcept = default;
36 auto operator=(RequestMutUninit&& rhs) noexcept -> RequestMutUninit& = default;
37 ~RequestMutUninit() noexcept = default;
38
40 auto operator=(const RequestMutUninit&) -> RequestMutUninit& = delete;
41
43 auto header() const -> RequestHeader;
44
46 template <typename T = RequestUserHeader,
47 typename = std::enable_if_t<!std::is_same<void, RequestUserHeader>::value, T>>
48 auto user_header() const -> const T&;
49
51 template <typename T = RequestUserHeader,
52 typename = std::enable_if_t<!std::is_same<void, RequestUserHeader>::value, T>>
53 auto user_header_mut() -> T&;
54
56 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE, void>>
57 auto payload() const -> const RequestPayload&;
58
60 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, void>>
61 auto payload() const -> bb::ImmutableSlice<ValueType>;
62
64 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE, void>>
65 auto payload_mut() -> RequestPayload&;
66
68 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, void>>
69 auto payload_mut() -> bb::MutableSlice<ValueType>;
70
73 template <typename T = RequestPayload, typename = std::enable_if_t<!bb::IsSlice<T>::VALUE, T>>
74 auto write_payload(RequestPayload&& payload)
75 -> RequestMut<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader>;
76
79 template <typename T = RequestPayload, typename = std::enable_if_t<bb::IsSlice<T>::VALUE, T>>
80 auto write_from_slice(bb::ImmutableSlice<ValueType>& value)
81 -> RequestMut<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader>;
82
85 template <typename T = RequestPayload, 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 -> RequestMut<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader>;
88
89 private:
90 template <ServiceType, typename, typename, typename, typename>
91 friend class Client;
92
93 explicit RequestMutUninit() = default;
94
95 template <ServiceType S,
96 typename RequestPayloadT,
97 typename RequestUserHeaderT,
98 typename ResponsePayloadT,
99 typename ResponseUserHeaderT>
100 friend auto
101 assume_init(RequestMutUninit<S, RequestPayloadT, RequestUserHeaderT, ResponsePayloadT, ResponseUserHeaderT>&& self)
102 -> RequestMut<S, RequestPayloadT, RequestUserHeaderT, ResponsePayloadT, ResponseUserHeaderT>;
103
104 RequestMut<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader> m_request;
105};
106
107template <ServiceType Service,
108 typename RequestPayload,
109 typename RequestUserHeader,
110 typename ResponsePayload,
111 typename ResponseUserHeader>
112inline auto
113RequestMutUninit<Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader>::header() const
114 -> RequestHeader {
115 return m_request.header();
116}
117
118template <ServiceType Service,
119 typename RequestPayload,
120 typename RequestUserHeader,
121 typename ResponsePayload,
122 typename ResponseUserHeader>
123template <typename T, typename>
124inline auto
126 -> const T& {
127 return m_request.template user_header<T>();
128}
129
130template <ServiceType Service,
131 typename RequestPayload,
132 typename RequestUserHeader,
133 typename ResponsePayload,
134 typename ResponseUserHeader>
135template <typename T, typename>
136inline auto
141
142template <ServiceType Service,
143 typename RequestPayload,
144 typename RequestUserHeader,
145 typename ResponsePayload,
146 typename ResponseUserHeader>
147template <typename T, typename>
148inline auto
150 -> const RequestPayload& {
151 return m_request.payload();
152}
153
154template <ServiceType Service,
155 typename RequestPayload,
156 typename RequestUserHeader,
157 typename ResponsePayload,
158 typename ResponseUserHeader>
159template <typename T, typename>
160inline auto
162 -> bb::ImmutableSlice<ValueType> {
163 return m_request.payload();
164}
165
166template <ServiceType Service,
167 typename RequestPayload,
168 typename RequestUserHeader,
169 typename ResponsePayload,
170 typename ResponseUserHeader>
171template <typename T, typename>
172inline auto
177
178template <ServiceType Service,
179 typename RequestPayload,
180 typename RequestUserHeader,
181 typename ResponsePayload,
182 typename ResponseUserHeader>
183template <typename T, typename>
184inline auto
187 return m_request.payload_mut();
188}
189
190template <ServiceType Service,
191 typename RequestPayload,
192 typename RequestUserHeader,
193 typename ResponsePayload,
194 typename ResponseUserHeader>
195template <typename T, typename>
196inline auto
203
204template <ServiceType Service,
205 typename RequestPayload,
206 typename RequestUserHeader,
207 typename ResponsePayload,
208 typename ResponseUserHeader>
209template <typename T, typename>
210inline auto
214 auto dest = payload_mut();
215 IOX2_ASSERT(dest.number_of_bytes() >= value.number_of_bytes(),
216 "Destination payload size is smaller than source slice size");
217 std::memcpy(dest.begin(), value.begin(), value.number_of_bytes());
218 return std::move(m_request);
219}
220
221template <ServiceType Service,
222 typename RequestPayload,
223 typename RequestUserHeader,
224 typename ResponsePayload,
225 typename ResponseUserHeader>
226template <typename T, typename>
227inline auto
229 const iox2::bb::StaticFunction<typename T::ValueType(uint64_t)>& initializer)
231 auto slice = payload_mut();
232 for (uint64_t i = 0; i < slice.number_of_elements(); ++i) {
233 new (&slice[i]) typename T::ValueType(initializer(i));
234 }
235 return std::move(m_request);
236}
237
238template <ServiceType Service,
239 typename RequestPayload,
240 typename RequestUserHeader,
241 typename ResponsePayload,
242 typename ResponseUserHeader>
243inline auto
248
249} // namespace iox2
250
251#endif
#define IOX2_ASSERT(condition, message)
only for debug builds: report fatal assert violation if expression evaluates to false
Sends [RequestMut]s to a [Server] in a request-response based communication.
Definition client.hpp:31
Request header used by [MessagingPattern::RequestResponse].
~RequestMutUninit() noexcept=default
auto user_header_mut() -> T &
Returns a mutable reference to the user defined request header.
auto user_header() const -> const T &
Returns a reference to the user defined request header.
auto write_from_slice(bb::ImmutableSlice< ValueType > &value) -> RequestMut< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >
auto write_from_fn(const iox2::bb::StaticFunction< typename T::ValueType(uint64_t)> &initializer) -> RequestMut< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >
auto payload_mut() -> RequestPayload &
Returns a mutable reference to the user defined request payload.
RequestMutUninit(RequestMutUninit &&rhs) noexcept=default
auto write_payload(RequestPayload &&payload) -> RequestMut< Service, RequestPayload, RequestUserHeader, ResponsePayload, ResponseUserHeader >
auto payload() const -> const RequestPayload &
Returns a reference to the user defined request payload.
friend auto assume_init(RequestMutUninit< S, RequestPayloadT, RequestUserHeaderT, ResponsePayloadT, ResponseUserHeaderT > &&self) -> RequestMut< S, RequestPayloadT, RequestUserHeaderT, ResponsePayloadT, ResponseUserHeaderT >
auto header() const -> RequestHeader
Returns a reference to the iceoryx2 internal [RequestHeader].
auto operator=(RequestMutUninit &&rhs) noexcept -> RequestMutUninit &=default
A class representing a slice of contiguous elements of type T.
Definition slice.hpp:31