Arcane  4.1.12.0
User documentation
Loading...
Searching...
No Matches
SendReceiveInfo.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/* MPMessage.h (C) 2000-2020 */
9/* */
10/* Message. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_MESSAGEPASSING_SENDRECEIVCEINFO_H
13#define ARCCORE_MESSAGEPASSING_MESSAGE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19#include <cstddef>
20#include <iosfwd>
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31/*!
32 * \brief MessageId.
33 *
34 * These information is used to retrieve information after an call to
35 * mpMessageProbe(). With MPI, this class encapsulates the MPI_Message type.
36 */
37class ARCCORE_MESSAGEPASSING_EXPORT MessageId
38{
39 union _Message
40 {
41 int i;
42 long l;
43 std::size_t st;
44 void* v;
45 const void* cv;
46 };
47
48 enum Type
49 {
50 T_Int,
51 T_Long,
52 T_SizeT,
53 T_Ptr,
54 T_Null
55 };
56
57 public:
58
59 MessageId()
60 : m_return_value(0)
61 {
62 m_type = T_Null;
63 m_message = null_message;
64 }
65
66 MessageId(int return_value, void* amessage)
67 : m_return_value(return_value)
68 {
69 m_type = T_Ptr;
70 m_message.v = amessage;
71 }
72
73 MessageId(int return_value, const void* amessage)
74 : m_return_value(return_value)
75 {
76 m_type = T_Ptr;
77 m_message.cv = amessage;
78 }
79
80 MessageId(int return_value, int amessage)
81 : m_return_value(return_value)
82 {
83 m_type = T_Int;
84 m_message.i = amessage;
85 }
86
87 MessageId(int return_value, long amessage)
88 : m_return_value(return_value)
89 {
90 m_type = T_Long;
91 m_message.l = amessage;
92 }
93
94 MessageId(int return_value, std::size_t amessage)
95 : m_return_value(return_value)
96 {
97 m_type = T_SizeT;
98 m_message.st = amessage;
99 }
100
101 MessageId(const MessageId& rhs)
102 : m_return_value(rhs.m_return_value)
103 , m_type(rhs.m_type)
104 {
105 m_message.cv = rhs.m_message.cv;
106 }
107
108 const MessageId& operator=(const MessageId& rhs)
109 {
110 m_return_value = rhs.m_return_value;
111 m_type = rhs.m_type;
112 m_message.cv = rhs.m_message.cv;
113 return (*this);
114 }
115
116 public:
117
118 template <typename T>
119 explicit operator const T*() const { return (const T*)m_message.cv; }
120 template <typename T>
121 explicit operator T*() const { return (T*)m_message.v; }
122 explicit operator int() const { return m_message.i; }
123 explicit operator long() const { return m_message.l; }
124 explicit operator size_t() const { return m_message.st; }
125
126 public:
127
128 //int returnValue() const { return m_return_value; }
129 bool isValid() const
130 {
131 if (m_type == T_Null)
132 return false;
133 if (m_type == T_Int)
134 return m_message.i != null_message.i;
135 if (m_type == T_Long)
136 return m_message.l != null_message.l;
137 if (m_type == T_SizeT)
138 return m_message.st != null_message.st;
139 return m_message.cv != null_message.cv;
140 }
141 void* messageAsVoidPtr() const { return m_message.v; }
142
143 static void setNullMessage(MessageId r) { null_message = r.m_message; }
144
145 void reset()
146 {
147 m_message = null_message;
148 }
149
150 void print(std::ostream& o) const;
151
152 private:
153
154 int m_return_value;
155 int m_type;
156 _Message m_message;
157
158 static _Message null_message;
159};
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
164inline std::ostream&
165operator<<(std::ostream& o, const MessageId& pmessage)
166{
167 pmessage.print(o);
168 return o;
169}
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
173
174} // End namespace Arccore::MessagePassing
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
178
179#endif
General declarations for the 'message_passing' component.
Namespace containing the types and declarations that manage the message-passing parallelism mechanism...