Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MessageId.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* MessageId.h (C) 2000-2022 */
9/* */
10/* Identifiant d'un message point à point. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_MESSAGEPASSING_MESSAGEID_H
13#define ARCCORE_MESSAGEPASSING_MESSAGEID_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/message_passing/MessageTag.h"
18#include "arccore/message_passing/MessageRank.h"
19#include "arccore/message_passing/MessageSourceInfo.h"
20
21#include <cstddef>
22#include <iosfwd>
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
28{
29/*!
30 * \brief MessageId.
31 *
32 * Ces informations sont utilisées pour récupérer les informations d'un
33 * message suite à un appel à mpProbe(). L'instance retournée peut-être
34 * utilisée pour faire une réception via mpReceive().
35 *
36 * Une fois l'appel à mpProbe() effectué, il est possible de récupérer les
37 * informations sur la source du message via sourceInfo().
38 *
39 * Avec MPI, cette classe encapsule le type MPI_Message.
40 */
41class ARCCORE_MESSAGEPASSING_EXPORT MessageId
42{
43 union _Message
44 {
45 int i;
46 long l;
47 std::size_t st;
48 void* v;
49 const void* cv;
50 };
51
52 enum Type
53 {
54 T_Int,
55 T_Long,
56 T_SizeT,
57 T_Ptr,
58 T_Null
59 };
60
61 public:
62
64
65 MessageId() : m_message(null_message){}
66
67 MessageId(MessageSourceInfo source_info,void* amessage)
68 : m_source_info(source_info)
69 {
70 m_type = T_Ptr;
71 m_message.v = amessage;
72 }
73
74 MessageId(MessageSourceInfo source_info,const void* amessage)
75 : m_source_info(source_info)
76 {
77 m_type = T_Ptr;
78 m_message.cv = amessage;
79 }
80
81 MessageId(MessageSourceInfo source_info,int amessage)
82 : m_source_info(source_info)
83 {
84 m_type = T_Int;
85 m_message.i = amessage;
86 }
87
88 MessageId(MessageSourceInfo source_info,long amessage)
89 : m_source_info(source_info)
90 {
91 m_type = T_Long;
92 m_message.l = amessage;
93 }
94
95 MessageId(MessageSourceInfo source_info,std::size_t amessage)
96 : m_source_info(source_info)
97 {
98 m_type = T_SizeT;
99 m_message.st = amessage;
100 }
101
102 MessageId(const MessageId& rhs)
103 : m_source_info(rhs.m_source_info), 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_source_info = rhs.m_source_info;
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_source_info; }
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 //! Informations sur la source du message;
153 MessageSourceInfo sourceInfo() const { return m_source_info; }
154
155 //! Positionne les informations sur la source du message;
156 void setSourceInfo(MessageSourceInfo si) { m_source_info = si; }
157
158 private:
159
160 MessageSourceInfo m_source_info;
161 int m_type = T_Null;
162 _Message m_message;
163 static _Message null_message;
164};
165
166/*---------------------------------------------------------------------------*/
167/*---------------------------------------------------------------------------*/
168
169inline std::ostream&
170operator<<(std::ostream& o,const MessageId& pmessage)
171{
172 pmessage.print(o);
173 return o;
174}
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
178
179} // End namespace Arccore::MessagePassing
180
181/*---------------------------------------------------------------------------*/
182/*---------------------------------------------------------------------------*/
183
184#endif
185
MessageSourceInfo sourceInfo() const
Informations sur la source du message;.
Definition MessageId.h:153
void setSourceInfo(MessageSourceInfo si)
Positionne les informations sur la source du message;.
Definition MessageId.h:156
Informations sur la source d'un message.
Espace de nommage contenant les types et déclarations qui gèrent le mécanisme de parallélisme par éch...