Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
Request.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Request.h (C) 2000-2025 */
9/* */
10/* Message request. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_MESSAGEPASSING_REQUEST_H
13#define ARCCORE_MESSAGEPASSING_REQUEST_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18#include "arccore/message_passing/MessageRank.h"
19#include "arccore/message_passing/MessageTag.h"
20#include "arccore/base/Ref.h"
21
22#include <cstddef>
23#include <iosfwd>
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
38class ARCCORE_MESSAGEPASSING_EXPORT ISubRequest
39{
40 public:
41
42 virtual ~ISubRequest() = default;
43
44 public:
45
48};
49
50/*---------------------------------------------------------------------------*/
51/*---------------------------------------------------------------------------*/
52
56class ARCCORE_MESSAGEPASSING_EXPORT IRequestCreator
57{
58 public:
59
60 virtual ~IRequestCreator() = default;
61};
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65
83class ARCCORE_MESSAGEPASSING_EXPORT Request
84{
86 {
87 int i;
88 long l;
89 std::size_t st;
90 void* v;
91 const void* cv;
92 };
93
94 enum Type
95 {
96 T_Int,
97 T_Long,
98 T_SizeT,
99 T_Ptr,
100 T_Null
101 };
102
103 public:
104
105 Request()
106 {
107 m_type = T_Null;
108 m_request = null_request;
109 }
110
111 public:
112
113 ARCCORE_DEPRECATED_2020("Use overload with IRequestCreator pointer")
114 Request(int return_value, void* arequest)
115 : m_return_value(return_value)
116 {
117 m_type = T_Ptr;
118 m_request.v = arequest;
119 }
120
121 ARCCORE_DEPRECATED_2020("Use overload with IRequestCreator pointer")
122 Request(int return_value, const void* arequest)
123 : m_return_value(return_value)
124 {
125 m_type = T_Ptr;
126 m_request.cv = arequest;
127 }
128
129 ARCCORE_DEPRECATED_2020("Use overload with IRequestCreator pointer")
130 Request(int return_value, int arequest)
131 : m_return_value(return_value)
132 {
133 m_type = T_Int;
134 m_request.i = arequest;
135 }
136
137 ARCCORE_DEPRECATED_2020("Use overload with IRequestCreator pointer")
138 Request(int return_value, long arequest)
139 : m_return_value(return_value)
140 {
141 m_type = T_Long;
142 m_request.l = arequest;
143 }
144
145 ARCCORE_DEPRECATED_2020("Use overload with IRequestCreator pointer")
146 Request(int return_value, std::size_t arequest)
147 : m_return_value(return_value)
148 {
149 m_type = T_SizeT;
150 m_request.st = arequest;
151 }
152
153 public:
154
155 Request(int return_value, IRequestCreator* creator, void* arequest)
156 : m_return_value(return_value)
157 , m_creator(creator)
158 {
159 m_type = T_Ptr;
160 m_request.v = arequest;
161 }
162
163 Request(int return_value, IRequestCreator* creator, const void* arequest)
164 : m_return_value(return_value)
165 , m_creator(creator)
166 {
167 m_type = T_Ptr;
168 m_request.cv = arequest;
169 }
170
171 Request(int return_value, IRequestCreator* creator, int arequest)
172 : m_return_value(return_value)
173 , m_creator(creator)
174 {
175 m_type = T_Int;
176 m_request.i = arequest;
177 }
178
179 Request(int return_value, IRequestCreator* creator, long arequest)
180 : m_return_value(return_value)
181 , m_creator(creator)
182 {
183 m_type = T_Long;
184 m_request.l = arequest;
185 }
186
187 Request(int return_value, IRequestCreator* creator, std::size_t arequest)
188 : m_return_value(return_value)
189 , m_creator(creator)
190 {
191 m_type = T_SizeT;
192 m_request.st = arequest;
193 }
194
195 public:
196
197 template <typename T>
198 operator const T*() const { return (const T*)m_request.cv; }
199 template <typename T>
200 operator T*() const { return (T*)m_request.v; }
201 operator int() const { return m_request.i; }
202 operator long() const { return m_request.l; }
203 operator size_t() const { return m_request.st; }
204
205 public:
206
207 int returnValue() const { return m_return_value; }
208 bool isValid() const
209 {
210 if (m_type == T_Null)
211 return false;
212 // If the request type is different from the null request type,
213 // then the request is considered valid.
214 if (m_type != null_request_type)
215 return true;
216 if (m_type == T_Int)
217 return m_request.i != null_request.i;
218 if (m_type == T_Long)
219 return m_request.l != null_request.l;
220 if (m_type == T_SizeT)
221 return m_request.st != null_request.st;
222 if (m_type == T_Ptr)
223 return m_request.cv != null_request.cv;
224 return false;
225 }
226 void* requestAsVoidPtr() const { return m_request.v; }
227
228 static void setNullRequest(Request r)
229 {
230 null_request = r.m_request;
231 null_request_type = r.m_type;
232 }
233
234 void reset()
235 {
236 m_request = null_request;
237 m_sub_request.reset();
238 m_type = T_Null;
239 }
240 Ref<ISubRequest> subRequest() const { return m_sub_request; }
241 bool hasSubRequest() const { return !m_sub_request.isNull(); }
242 void setSubRequest(Ref<ISubRequest> s) { m_sub_request = s; }
243
245 IRequestCreator* creator() const { return m_creator; }
246
247 void print(std::ostream& o) const;
248
249 friend inline std::ostream& operator<<(std::ostream& o, const Request& prequest)
250 {
251 prequest.print(o);
252 return o;
253 }
254
256 Int32 _type() const { return m_type; }
257
258 private:
259
260 int m_return_value = 0;
261 int m_type = T_Null;
262 _Request m_request;
263 Ref<ISubRequest> m_sub_request;
264 IRequestCreator* m_creator = nullptr;
265 static _Request null_request;
266 static int null_request_type;
267};
268
269/*---------------------------------------------------------------------------*/
270/*---------------------------------------------------------------------------*/
271
272} // namespace Arcane::MessagePassing
273
274/*---------------------------------------------------------------------------*/
275/*---------------------------------------------------------------------------*/
276
277#endif
General declarations for the 'message_passing' component.
Management of references to a C++ class.
Interface for a request creator.
Definition Request.h:57
Sub-request of a request.
Definition Request.h:39
virtual Request executeOnCompletion(const SubRequestCompletionInfo &)=0
Callback called when the associated request is finished.
IRequestCreator * creator() const
Request creator.
Definition Request.h:245
Completion information for a sub-request.
Reference to an instance.
Declarations of types and methods used by message exchange mechanisms.
std::int32_t Int32
Signed integer type of 32 bits.