Arcane  4.2.1.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ArcaneGlobal.h
Aller à la documentation de ce fichier.
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/* ArcaneGlobal.h (C) 2000-2025 */
9/* */
10/* Déclarations générales de Arcane. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_ARCANEGLOBAL_H
13#define ARCANE_UTILS_ARCANEGLOBAL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19// Infos globales sur les options de compilation comme
20// les threads, le mode debug, ...
21#include "arcane_core_config.h"
22
23#ifdef ARCCORE_OS_LINUX
24#define ARCANE_OS_LINUX
25#include <cstddef>
26#endif
27
28#ifdef ARCCORE_OS_WIN32
29#define ARCANE_OS_WIN32
30#endif
31
32#ifdef ARCCORE_OS_MACOS
33#define ARCANE_OS_MACOS
34#endif
35
36#define ARCANE_EXPORT ARCCORE_EXPORT
37#define ARCANE_IMPORT ARCCORE_IMPORT
38#define ARCANE_TEMPLATE_EXPORT ARCCORE_TEMPLATE_EXPORT
39#define ARCANE_RESTRICT ARCCORE_RESTRICT
40
41#define ARCANE_STD std
42
43// Marque la variable comme une variable inutilisée volontairement.
44// Fonctionne avec n'importe quel compilateur, mais pourrait être amélioré en utilisant un attribut.
45#define ARCANE_UNUSED(var) ARCCORE_UNUSED(var)
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
50// TODO: supprimer l'inclusion de <iosfwd> et les déclarations using.
51// Pour l'instant (2022), ces inclusions sont supprimées uniquement pour Arcane.
52
53#ifndef ARCANE_NO_USING_FOR_STREAM
54#include <iosfwd>
55using std::ifstream;
56using std::ios;
57using std::istream;
58using std::istringstream;
59using std::ofstream;
60using std::ostream;
61using std::ostringstream;
62#endif
63
64/*---------------------------------------------------------------------------*/
65/*---------------------------------------------------------------------------*/
66
67#ifdef DOXYGEN_DOC
68typedef ARCANE_TYPE_INT16 Int16;
69typedef ARCANE_TYPE_INT32 Int32;
70typedef ARCANE_TYPE_INT64 Int64;
71#endif
72
73#define ARCANE_BEGIN_NAMESPACE \
74 namespace Arcane \
75 {
76#define ARCANE_END_NAMESPACE }
77#define NUMERICS_BEGIN_NAMESPACE \
78 namespace Numerics \
79 {
80#define NUMERICS_END_NAMESPACE }
81
82/*---------------------------------------------------------------------------*/
83/*---------------------------------------------------------------------------*/
84
85#ifdef ARCANE_COMPONENT_FULL
86#define ARCANE_COMPONENT_arcane_utils
87#define ARCANE_COMPONENT_arcane
88#define ARCANE_COMPONENT_arcane_mesh
89#define ARCANE_COMPONENT_arcane_std
90#define ARCANE_COMPONENT_arcane_impl
91#define ARCANE_COMPONENT_arcane_script
92#endif
93
94#if defined(ARCANE_COMPONENT_arcane) || defined(ARCANE_COMPONENT_arcane_core)
95#define ARCANE_CORE_EXPORT ARCANE_EXPORT
96#define ARCANE_EXPR_EXPORT ARCANE_EXPORT
97#define ARCANE_DATATYPE_EXPORT ARCANE_EXPORT
98#define ARCANE_CORE_EXTERN_TPL
99#else
100#define ARCANE_CORE_EXPORT ARCANE_IMPORT
101#define ARCANE_EXPR_EXPORT ARCANE_IMPORT
102#define ARCANE_DATATYPE_EXPORT ARCANE_IMPORT
103#define ARCANE_CORE_EXTERN_TPL extern
104#endif
105
106#ifdef ARCANE_COMPONENT_arcane_utils
107#define ARCANE_UTILS_EXPORT ARCANE_EXPORT
108#define ARCANE_UTILS_EXTERN_TPL
109#else
110#define ARCANE_UTILS_EXPORT ARCANE_IMPORT
111#define ARCANE_UTILS_EXTERN_TPL extern
112#endif
113
114#ifdef ARCANE_COMPONENT_arcane_impl
115#define ARCANE_IMPL_EXPORT ARCANE_EXPORT
116#else
117#define ARCANE_IMPL_EXPORT ARCANE_IMPORT
118#endif
119
120#ifdef ARCANE_COMPONENT_arcane_mesh
121#define ARCANE_MESH_EXPORT ARCANE_EXPORT
122#else
123#define ARCANE_MESH_EXPORT ARCANE_IMPORT
124#endif
125
126#ifdef ARCANE_COMPONENT_arcane_std
127#define ARCANE_STD_EXPORT ARCANE_EXPORT
128#else
129#define ARCANE_STD_EXPORT ARCANE_IMPORT
130#endif
131
132#ifdef ARCANE_COMPONENT_arcane_script
133#define ARCANE_SCRIPT_EXPORT ARCANE_EXPORT
134#else
135#define ARCANE_SCRIPT_EXPORT ARCANE_IMPORT
136#endif
137
138#ifdef ARCANE_COMPONENT_arcane_solvers
139#define ARCANE_SOLVERS_EXPORT ARCANE_EXPORT
140#else
141#define ARCANE_SOLVERS_EXPORT ARCANE_IMPORT
142#endif
143
144#ifdef ARCANE_COMPONENT_arcane_geometry
145#define ARCANE_GEOMETRY_EXPORT ARCANE_EXPORT
146#else
147#define ARCANE_GEOMETRY_EXPORT ARCANE_IMPORT
148#endif
149
150#ifdef ARCANE_COMPONENT_arcane_thread
151#define ARCANE_THREAD_EXPORT ARCANE_EXPORT
152#else
153#define ARCANE_THREAD_EXPORT ARCANE_IMPORT
154#endif
155
156#ifdef ARCANE_COMPONENT_arcane_mpi
157#define ARCANE_MPI_EXPORT ARCANE_EXPORT
158#else
159#define ARCANE_MPI_EXPORT ARCANE_IMPORT
160#endif
161
162#ifdef ARCANE_COMPONENT_arcane_hyoda
163#define ARCANE_HYODA_EXPORT ARCANE_EXPORT
164#else
165#define ARCANE_HYODA_EXPORT ARCANE_IMPORT
166#endif
167
168#ifdef ARCANE_REAL_USE_APFLOAT
169#include <apfloat.h>
170#endif
171
172/*---------------------------------------------------------------------------*/
173/*---------------------------------------------------------------------------*/
174
175namespace Arcane
176{
177
178/*---------------------------------------------------------------------------*/
179/*---------------------------------------------------------------------------*/
180
181#define ARCANE_HAS_LONG_LONG
182
183/*---------------------------------------------------------------------------*/
184/*---------------------------------------------------------------------------*/
185
186const double cgrEPSILON_DELTA = 1.0e-2;
187const double cgrPI = 3.14159265358979323846;
188
189/*---------------------------------------------------------------------------*/
190/*---------------------------------------------------------------------------*/
191
192#define ARCANE_REAL(val) ARCCORE_REAL(val)
193
194#ifdef ARCCORE_REAL_NOT_BUILTIN
195#define ARCANE_REAL_NOT_BUILTIN
196#endif
197
198#ifdef ARCCORE_REAL_LONG
199#define ARCANE_REAL_LONG
200#endif
201
202#ifdef ARCCORE_REAL_IS_DOUBLE
203#define ARCANE_REAL_IS_DOUBLE
204#endif
205
206/*!
207 * \brief Type des entiers utilisés pour stocker les identifiants locaux
208 * des entités.
209 *
210 * Les valeurs que peut prendre ce type indique combien d'entités
211 * pourront être présentes sur un sous-domaine.
212 */
214
215/*!
216 * \brief Type des entiers utilisés pour stocker les identifiants uniques
217 * (globaux) des entités.
218 *
219 * Les valeurs que peut prendre ce type indique combien d'entités
220 * pourront être présentes sur le domaine initial.
221 */
223
224/*!
225 * \def ARCANE_INTEGER_MAX
226 * \brief Macro indiquant la valeur maximal que peut prendre le type #Integer
227 */
228
229/*!
230 * \typedef Int64
231 * \brief Type entier signé sur 64 bits.
232 */
233/*!
234 * \typedef Int32
235 * \brief Type entier signé sur 32 bits.
236 */
237/*!
238 * \typedef Int16
239 * \brief Type entier signé sur 16 bits.
240 */
241/*!
242 * \typedef Integer
243 * \brief Type représentant un entier
244 *
245 * Si la macro ARCANE_64BIT est définie, le type Integer correspond à un
246 * entier Int64, sinon à un entier Int32.
247 */
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
251
252//! Encapsulation de la fonction C printf
253extern "C++" ARCANE_UTILS_EXPORT void
254arcanePrintf(const char*, ...);
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
258
259/*!
260 * \brief Passe en mode pause ou lance une erreur fatale.
261 *
262 * Si le code est compilé en mode \a debug (ARCANE_DEBUG est définie) ou
263 * en mode \a check (ARCANE_CHECK est définie), met le programme en pause
264 * pour éventuellement connecter un débugger dessus.
265 *
266 * En mode normal, lance une exception FatalErrorException avec le message
267 * \a msg comme argument.
268 */
269extern "C++" ARCANE_UTILS_EXPORT void
270arcaneDebugPause(const char* msg);
271
272/*---------------------------------------------------------------------------*/
273/*---------------------------------------------------------------------------*/
274
275extern "C++" ARCANE_UTILS_EXPORT void
276_internalArcaneMathError(long double arg_value, const char* func_name);
277
278extern "C++" ARCANE_UTILS_EXPORT void
279_internalArcaneMathError(long double arg_value1, long double arg_value2, const char* func_name);
280
281/*---------------------------------------------------------------------------*/
282/*---------------------------------------------------------------------------*/
283/*!
284 * \brief Signale un argument invalide d'une fonction mathématique.
285 *
286 * Une fois le message affiché, appelle arcaneDebugPause()
287 *
288 * \param arg_value valeur de l'argument invalide.
289 * \param func_name nom de la fonction mathématique.
290 */
291ARCCORE_HOST_DEVICE inline void
292arcaneMathError(long double arg_value, const char* func_name)
293{
294#ifndef ARCCORE_DEVICE_CODE
295 _internalArcaneMathError(arg_value, func_name);
296#else
297 ARCANE_UNUSED(arg_value);
298 ARCANE_UNUSED(func_name);
299#endif
300}
301
302/*!
303 * \brief Signale un argument invalide d'une fonction mathématique.
304 *
305 * Une fois le message affiché, appelle arcaneDebugPause()
306 *
307 * \param arg_value1 valeur du premier argument invalide.
308 * \param arg_value2 valeur du second argument invalide.
309 * \param func_name nom de la fonction mathématique.
310 */
311ARCCORE_HOST_DEVICE inline void
312arcaneMathError(long double arg_value1, long double arg_value2, const char* func_name)
313{
314#ifndef ARCCORE_DEVICE_CODE
315 _internalArcaneMathError(arg_value1, arg_value2, func_name);
316#else
317 ARCANE_UNUSED(arg_value1);
318 ARCANE_UNUSED(arg_value2);
319 ARCANE_UNUSED(func_name);
320#endif
321}
322
323/*---------------------------------------------------------------------------*/
324/*---------------------------------------------------------------------------*/
325
326/*!
327 * \brief Signale une fonction non implémentée.
328 *
329 * Une fois le message affiché, appelle arcaneDebugPause()
330 *
331 * \param file nom du fichier contenant la fonction
332 * \param func nom de la fonction
333 * \param numéro de ligne
334 * \param msg message éventuel à afficher (0 si aucun)
335 */
336extern "C++" ARCANE_UTILS_EXPORT void
337arcaneNotYetImplemented(const char* file, const char* func, unsigned long line, const char* msg);
338
339/*---------------------------------------------------------------------------*/
340/*---------------------------------------------------------------------------*/
341
342//! Signale l'utilisation d'une fonction obsolète
343extern "C++" ARCANE_UTILS_EXPORT void
344arcaneDeprecated(const char* file, const char* func, unsigned long line, const char* text);
345
346/*---------------------------------------------------------------------------*/
347/*---------------------------------------------------------------------------*/
348
349/*!
350 * \brief Utilisation d'un objet non référencé.
351 *
352 * Signale une tentative d'utilisation d'un objet qui ne devrait plus être
353 * référencé. Affiche un message et appelle arcaneDebugPause() si demandé et
354 * ensuite lance une exception FatalErrorException.
355 *
356 * \param ptr adresse de l'objet
357 */
358extern "C++" ARCANE_UTILS_EXPORT void
359arcaneNoReferenceError(const void* ptr);
360
361/*!
362 * \brief Utilisation d'un objet non référencé.
363 *
364 * Signale une tentative d'utilisation d'un objet qui ne devrait plus être
365 * référencé. Affiche un message et appelle arcaneDebugPause() si demandé et
366 * ensuite appelle std::terminate().
367 *
368 * \param ptr adresse de l'objet
369 */
370extern "C++" ARCANE_UTILS_EXPORT void
372
373/*!
374 * \brief Vérifie que \a size peut être converti dans un 'Integer' pour servir
375 * de taille à un tableau.
376 * Si possible, retourne \a size convertie en un 'Integer'. Sinon, lance
377 * une exception de type ArgumentException.
378 */
379extern "C++" ARCANE_UTILS_EXPORT Integer
380arcaneCheckArraySize(unsigned long long size);
381
382/*!
383 * \brief Vérifie que \a size peut être converti dans un 'Integer' pour servir
384 * de taille à un tableau.
385 * Si possible, retourne \a size convertie en un 'Integer'. Sinon, lance
386 * une exception de type ArgumentException.
387 */
388extern "C++" ARCANE_UTILS_EXPORT Integer
389arcaneCheckArraySize(long long size);
390
391/*!
392 * \brief Vérifie que \a size peut être converti dans un 'Integer' pour servir
393 * de taille à un tableau.
394 * Si possible, retourne \a size convertie en un 'Integer'. Sinon, lance
395 * une exception de type ArgumentException.
396 */
397extern "C++" ARCANE_UTILS_EXPORT Integer
398arcaneCheckArraySize(unsigned long size);
399
400/*!
401 * \brief Vérifie que \a size peut être converti dans un 'Integer' pour servir
402 * de taille à un tableau.
403 * Si possible, retourne \a size convertie en un 'Integer'. Sinon, lance
404 * une exception de type ArgumentException.
405 */
406extern "C++" ARCANE_UTILS_EXPORT Integer
407arcaneCheckArraySize(long size);
408
409/*!
410 * \brief Vérifie que \a size peut être converti dans un 'Integer' pour servir
411 * de taille à un tableau.
412 * Si possible, retourne \a size convertie en un 'Integer'. Sinon, lance
413 * une exception de type ArgumentException.
414 */
415extern "C++" ARCANE_UTILS_EXPORT Integer
416arcaneCheckArraySize(unsigned int size);
417
418/*!
419 * \brief Vérifie que \a size peut être converti dans un 'Integer' pour servir
420 * de taille à un tableau.
421 * Si possible, retourne \a size convertie en un 'Integer'. Sinon, lance
422 * une exception de type ArgumentException.
423 */
424extern "C++" ARCANE_UTILS_EXPORT Integer
425arcaneCheckArraySize(int size);
426
427/*!
428 * \brief Vérifie que \a ptr est aligné sur \a alignment octets.
429 * Si ce n'est pas le cas, Sinon, lance une exception de type BadAlignmentException.
430 */
431extern "C++" ARCANE_UTILS_EXPORT void
432arcaneCheckAlignment(const void* ptr, Integer alignment);
433
434/*!
435 * \brief Vrai si on est en mode vérification.
436 *
437 * Ce mode est actif si la macro ARCANE_CHECK est définie
438 * ou si la méthode arcaneSetCheck() a été positionnée a vrai.
439 */
440extern "C++" ARCANE_UTILS_EXPORT bool arcaneIsCheck();
441/*!
442 * \brief Active ou désactive le mode vérification.
443 *
444 * Le mode vérification est toujours actif si la macro ARCANE_CHECK est définie.
445 * Sinon, il est possible de l'activer avec cette méthode. Cela permet
446 * d'activer certains tests même en mode optimisé.
447 */
448extern "C++" ARCANE_UTILS_EXPORT void arcaneSetCheck(bool v);
449
450/*!
451 * \brief Vrai si la macro ARCANE_DEBUG est définie
452 */
453extern "C++" ARCANE_UTILS_EXPORT bool arcaneIsDebug();
454
455/*!
456 * \brief Vrai si arcane est compilé avec le support des threads ET qu'ils sont actifs
457 */
458extern "C++" ARCANE_UTILS_EXPORT bool arcaneHasThread();
459
460/*!
461 * \brief Active ou désactive le support des threads.
462 *
463 * Cette fonction ne doit être appelée que lors de l'initialisation
464 * de l'application (ou avant) et ne pas être modifiée par la suite.
465 * L'activation des threads n'est possible que si une implémentation
466 * des threads existe sur la plate-forme et que Arcane a été compilé
467 * avec ce support.
468 */
469extern "C++" ARCANE_UTILS_EXPORT void arcaneSetHasThread(bool v);
470
471/*!
472 * \brief Retourne l'identifiant du thread courant.
473 *
474 * Retourne toujours 0 si arcaneHasThread() est faux.
475 */
476extern "C++" ARCANE_UTILS_EXPORT
477Int64
479
480/*---------------------------------------------------------------------------*/
481/*---------------------------------------------------------------------------*/
482
483#ifdef ARCANE_DEBUG
484extern "C++" ARCANE_UTILS_EXPORT bool _checkDebug(size_t);
485#define ARCANE_DEBUGP(a, b) \
486 if (_checkDebug(a)) { \
487 arcanePrintf b; \
488 }
489#else
490#define ARCANE_DEBUGP(a, b)
491#endif
492
493/*---------------------------------------------------------------------------*/
494/*---------------------------------------------------------------------------*/
495
496#ifdef __GNUG__
497#define ARCANE_NOT_YET_IMPLEMENTED(a) \
498 { \
499 arcaneNotYetImplemented(__FILE__, __PRETTY_FUNCTION__, __LINE__, (a)); \
500 }
501#else
502#define ARCANE_NOT_YET_IMPLEMENTED(a) \
503 { \
504 arcaneNotYetImplemented(__FILE__, "(NoInfo)", __LINE__, (a)); \
505 }
506#endif
507
508#define ARCANE_DEPRECATED ARCCORE_DEPRECATED
509
510#define ARCANE_DEPRECATED_112 ARCANE_DEPRECATED
511#define ARCANE_DEPRECATED_114 ARCANE_DEPRECATED
512#define ARCANE_DEPRECATED_116 ARCANE_DEPRECATED
513#define ARCANE_DEPRECATED_118 ARCANE_DEPRECATED
514#define ARCANE_DEPRECATED_120 ARCANE_DEPRECATED
515#define ARCANE_DEPRECATED_122 ARCANE_DEPRECATED
516#define ARCANE_DEPRECATED_200 ARCANE_DEPRECATED
517#define ARCANE_DEPRECATED_220 ARCANE_DEPRECATED
518#define ARCANE_DEPRECATED_240 ARCANE_DEPRECATED
519#define ARCANE_DEPRECATED_260 ARCANE_DEPRECATED
520#define ARCANE_DEPRECATED_280 ARCANE_DEPRECATED
521#define ARCANE_DEPRECATED_2018 ARCANE_DEPRECATED
522#define ARCANE_DEPRECATED_2018_R(reason) [[deprecated(reason)]]
523
524#define ARCANE_DEPRECATED_REASON(reason) [[deprecated(reason)]]
525
526#ifdef ARCANE_NO_DEPRECATED_LONG_TERM
527#define ARCANE_DEPRECATED_LONG_TERM(reason)
528#else
529/*!
530 * \brief Macro pour l'attribut 'deprecated' à long terme.
531 *
532 * Cette macro est pour indiquer les types ou fonctions
533 * obsolète et donc qu'il est préférable de ne pas utiliser mais qui
534 * ne seront pas supprimés avant plusieurs versions.
535 */
536#define ARCANE_DEPRECATED_LONG_TERM(reason) [[deprecated(reason)]]
537#endif
538
539// Définir cette macro si on souhaite supprimer de la compilation les
540// méthodes et types obsolètes.
541#define ARCANE_NO_DEPRECATED
542
543// Si la macro est définie, ne notifie pas des méthodes obsolètes des anciennes
544// classes tableaux.
545#ifdef ARCANE_NO_NOTIFY_DEPRECATED_ARRAY
546#define ARCANE_DEPRECATED_ARRAY
547#else
548#define ARCANE_DEPRECATED_ARRAY ARCANE_DEPRECATED
549#endif
550
551/*---------------------------------------------------------------------------*/
552/*---------------------------------------------------------------------------*/
553
554// Les macros suivantes permettent de de créer un identifiant en suffixant
555// le numéro de ligne du fichier. Cela permet d'avoir un identifiant unique
556// pour un fichier et est utilisé par exemple pour générer des noms
557// de variable globale pour l'enregistrement des services.
558// La macro a utiliser est ARCANE_JOIN_WITH_LINE(name).
559#define ARCANE_JOIN_HELPER2(a, b) a##b
560#define ARCANE_JOIN_HELPER(a, b) ARCANE_JOIN_HELPER2(a, b)
561#define ARCANE_JOIN_WITH_LINE(a) ARCANE_JOIN_HELPER(a, __LINE__)
562
563/*---------------------------------------------------------------------------*/
564/*---------------------------------------------------------------------------*/
565// La macro ARCANE_NORETURN utilise l'attribut [[noreturn]] du C++11 pour
566// indiquer qu'une fonction ne retourne pas.
567#define ARCANE_NORETURN ARCCORE_NORETURN
568
569//! Macro permettant de spécifier le mot-clé 'constexpr' du C++11
570#define ARCANE_CONSTEXPR ARCCORE_CONSTEXPR
571
572// Le C++11 définit un mot clé 'noexcept' pour indiquer qu'une méthode ne
573// renvoie pas d'exceptions. Malheureusement, comme le support du C++11
574// est fait de manière partielle par les compilateurs, cela ne marche pas
575// pour tous. En particulier, icc 13, 14 et 15 ne supportent pas cela, ni
576// Visual Studio 2013 et antérieurs.
577#define ARCANE_NOEXCEPT ARCCORE_NOEXCEPT
578#define ARCANE_NOEXCEPT_FALSE ARCCORE_NOEXCEPT_FALSE
579
580/*---------------------------------------------------------------------------*/
581/*---------------------------------------------------------------------------*/
582
583// Support pour l'alignement.
584// le C++11 utilise le mot clé alignas pour spécifier l'alignement.
585// Cela fonctionne avec GCC 4.9+ et Visual Studio 2015. Cela ne fonctionne
586// pas avec Visual Studio 2013. Donc pour Visual Studio on utilise dans tous
587// les cas __declspec qui fonctionne toujours. Sous Linux, __attribute__ fonctionne
588// aussi toujours donc on utilise cela. A noter que les structures Simd ont besoin
589// de l'attribut 'packed' qui n'existe que avec GCC et Intel. Il ne semble pas y avoir
590// d'équivalent avec MSVC.
591#ifdef _MSC_VER
592//! Macro pour garantir le compactage et l'alignement d'une classe sur \a value octets
593#define ARCANE_ALIGNAS(value) __declspec(align(value))
594//! Macro pour garantir l'alignement d'une classe sur \a value octets
595#define ARCANE_ALIGNAS_PACKED(value) __declspec(align(value))
596#else
597//! Macro pour garantir le compactage et l'alignement d'une classe sur \a value octets
598#define ARCANE_ALIGNAS_PACKED(value) __attribute__((aligned(value), packed))
599//! Macro pour garantir l'alignement d'une classe sur \a value octets
600#define ARCANE_ALIGNAS(value) __attribute__((aligned(value)))
601#endif
602
603/*---------------------------------------------------------------------------*/
604/*---------------------------------------------------------------------------*/
605
606#ifdef ARCANE_SWIG
607#ifdef ARCANE_DEPRECATED
608#undef ARCANE_DEPRECATED
609#endif
610#endif
611
612/*---------------------------------------------------------------------------*/
613/*---------------------------------------------------------------------------*/
614
615#if defined(ARCANE_CHECK) || defined(ARCANE_DEBUG)
616#ifndef ARCANE_DEBUG_ASSERT
617#define ARCANE_DEBUG_ASSERT
618#endif
619#endif
620
621/*---------------------------------------------------------------------------*/
622/*---------------------------------------------------------------------------*/
623/*!
624 * \brief Signalue l'utilisation d'un pointeur nul.
625 *
626 * Signale une tentative d'utilisation d'un pointeur nul.
627 * Affiche un message, appelle arcaneDebugPause() et lance une exception
628 * de type FatalErrorException.
629 */
630extern "C++" ARCANE_UTILS_EXPORT void
631arcaneNullPointerError [[noreturn]] ();
632
633/*---------------------------------------------------------------------------*/
634/*---------------------------------------------------------------------------*/
635/*!
636 * \brief Signalee l'utilisation d'un pointeur nul en envoyant une exception
637 *
638 * Signale une tentative d'utilisation d'un pointeur nul.
639 * Lance une exception de type FatalErrorException.
640 *
641 * Dans l'exception, affiche \a text si non nul, sinon affiche \a ptr_name.
642 *
643 * Normalement cette méthode ne doit pas être appelée directement mais
644 * via la macro ARCANE_CHECK_POINTER.
645 */
646extern "C++" ARCANE_UTILS_EXPORT void
647arcaneThrowNullPointerError [[noreturn]] (const char* ptr_name, const char* text);
648
649/*---------------------------------------------------------------------------*/
650/*---------------------------------------------------------------------------*/
651/*!
652 * \brief Vérifie qu'un pointeur n'est pas nul.
653 */
654static inline void
655arcaneCheckNull(const void* ptr)
656{
657 if (!ptr)
659}
660
661/*---------------------------------------------------------------------------*/
662/*---------------------------------------------------------------------------*/
663/*!
664 * \brief Retourne la taille avec padding pour une taille \a size.
665 *
666 * La valeurs retournée est un multiple de SIMD_PADDING_SIZE et vaut:
667 * - 0 si \a size est inférieur ou égal à 0.
668 * - \a size si \a size est un multiple de SIMD_PADDING_SIZE.
669 * - le multiple de SIMD_PADDING_SIZE immédiatement supérieur à \a size sinon.
670 */
671extern "C++" ARCANE_UTILS_EXPORT Integer
673
674/*---------------------------------------------------------------------------*/
675/*---------------------------------------------------------------------------*/
676
677/*
678 * Macros utilisées pour le débug.
679 */
680#ifdef ARCANE_DEBUG_ASSERT
681extern "C++" ARCANE_UTILS_EXPORT void _doAssert(const char*, const char*, const char*, size_t);
682template <typename T> inline T*
683_checkPointer(T* t, const char* file, const char* func, size_t line)
684{
685 if (!t) {
686 _doAssert("ARCANE_ASSERT", file, func, line);
687 arcanePrintf("Bad Pointer");
688 }
689 return t;
690}
691#ifdef __GNUG__
692#define ARCANE_D_WHERE(a) Arcane::_doAssert(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
693#define ARCANE_DCHECK_POINTER(a) Arcane::_checkPointer((a), __FILE__, __PRETTY_FUNCTION__, __LINE__);
694#else
695#define ARCANE_D_WHERE(a) Arcane::_doAssert(a, __FILE__, "(NoInfo)", __LINE__)
696#define ARCANE_DCHECK_POINTER(a) Arcane::_checkPointer((a),__FILE__,"(NoInfo"),__LINE__);
697#endif
698#define ARCANE_CHECK_PTR(a) \
699 { \
700 if (!(a)) { \
701 Arcane::arcanePrintf("Null value"); \
702 ARCANE_D_WHERE("ARCANE_ASSERT"); \
703 } \
704 }
705
706#define ARCANE_ASSERT(a, b) \
707 { \
708 if (!(a)) { \
709 Arcane::arcanePrintf("Assertion '%s' fails:", #a); \
710 Arcane::arcanePrintf b; \
711 ARCANE_D_WHERE("ARCANE_ASSERT"); \
712 } \
713 }
714#define ARCANE_WARNING(a) \
715 { \
716 Arcane::arcanePrintf a; \
717 ARCANE_D_WHERE("ARCANE_WARNING"); \
718 }
719#else
720#define ARCANE_CHECK_PTR(a)
721#define ARCANE_ASSERT(a, b)
722#define ARCANE_WARNING(a)
723#define ARCANE_DCHECK_POINTER(a) (a);
724#endif
725
726/*---------------------------------------------------------------------------*/
727/*---------------------------------------------------------------------------*/
728/*!
729 * \brief Macro pour envoyer une exception avec formattage.
730 *
731 * \a exception_class est le type de l'exception. Les arguments suivants de
732 * la macro sont utilisés pour formatter un message d'erreur via la
733 * méthode String::format().
734 */
735#define ARCANE_THROW(exception_class, ...) \
736 ARCCORE_THROW(exception_class, __VA_ARGS__)
737
738/*!
739 * \brief Macro pour envoyer une exception avec formattage si \a cond est vrai.
740 *
741 * \a exception_class est le type de l'exception. Les arguments suivants de
742 * la macro sont utilisés pour formatter un message d'erreur via la
743 * méthode String::format().
744 *
745 * \sa ARCANE_THROW
746 */
747#define ARCANE_THROW_IF(const, exception_class, ...) \
748 ARCCORE_THROW_IF(const, exception_class, __VA_ARGS__)
749
750/*---------------------------------------------------------------------------*/
751/*---------------------------------------------------------------------------*/
752/*!
753 * \brief Macro envoyant une exception FatalErrorException.
754 *
755 * Les arguments de la macro sont utilisés pour formatter un message
756 * d'erreur via la méthode String::format().
757 */
758#define ARCANE_FATAL(...) \
759 ARCCORE_FATAL(__VA_ARGS__)
760
761/*!
762 * \brief Macro envoyant une exception FatalErrorException si \a cond est vrai
763 *
764 * Les arguments de la macro sont utilisés pour formatter un message
765 * d'erreur via la méthode String::format().
766 *
767 * \sa ARCANE_FATAL
768 */
769#define ARCANE_FATAL_IF(const, ...) \
770 ARCCORE_FATAL_IF(const, __VA_ARGS__)
771
772/*---------------------------------------------------------------------------*/
773/*---------------------------------------------------------------------------*/
774/*!
775 * \brief Vérifie qu'un pointeur n'est pas nul.
776 *
777 * Si le pointeur est nul, appelle arcaneThrowNullPointerError().
778 * Sinon, retourne le pointeur.
779 */
780static inline void*
781arcaneThrowIfNull(void* ptr, const char* ptr_name, const char* text)
782{
783 if (!ptr)
784 arcaneThrowNullPointerError(ptr_name, text);
785 return ptr;
786}
787
788/*---------------------------------------------------------------------------*/
789/*---------------------------------------------------------------------------*/
790/*!
791 * \brief Vérifie qu'un pointeur n'est pas nul.
792 *
793 * Si le pointeur est nul, appelle à arcaneThrowNullPointerError().
794 * Sinon, retourne le pointeur.
795 */
796static inline const void*
797arcaneThrowIfNull(const void* ptr, const char* ptr_name, const char* text)
798{
799 if (!ptr)
800 arcaneThrowNullPointerError(ptr_name, text);
801 return ptr;
802}
803
804/*---------------------------------------------------------------------------*/
805/*---------------------------------------------------------------------------*/
806/*!
807 * \brief Vérifie qu'un pointeur n'est pas nul.
808 *
809 * Si le pointeur est nul, appelle à arcaneThrowNullPointerError().
810 * Sinon, retourne le pointeur.
811 */
812template <typename T> inline T*
813arcaneThrowIfNull(T* ptr, const char* ptr_name, const char* text)
814{
815 if (!ptr)
816 arcaneThrowNullPointerError(ptr_name, text);
817 return ptr;
818}
819
820/*---------------------------------------------------------------------------*/
821/*---------------------------------------------------------------------------*/
822/*!
823 * \brief Macro retournant le pointeur \a ptr s'il est non nul
824 * ou lancant une exception s'il est nul.
825 *
826 * \sa arcaneThrowIfNull().
827 */
828#define ARCANE_CHECK_POINTER(ptr) \
829 arcaneThrowIfNull(ptr, #ptr, nullptr)
830
831/*!
832 * \brief Macro retournant le pointeur \a ptr s'il est non nul
833 * ou lancant une exception s'il est nul.
834 *
835 * \sa arcaneThrowIfNull().
836 */
837#define ARCANE_CHECK_POINTER2(ptr, text) \
838 arcaneThrowIfNull(ptr, #ptr, text)
839
840/*---------------------------------------------------------------------------*/
841/*---------------------------------------------------------------------------*/
842/*!
843 * \brief Signale une erreur de débordement.
844 *
845 * Signale un débordement de tableau. Affiche un message et appelle
846 * arcaneDebugPause().
847 *
848 * \param i indice invalide
849 * \param max_size nombre d'éléments du tableau
850 */
851extern "C++" ARCANE_UTILS_EXPORT void
852arcaneRangeError [[noreturn]] (Int64 i, Int64 max_size);
853
854/*!
855 * \brief Vérifie un éventuel débordement de tableau.
856 */
857static inline constexpr ARCCORE_HOST_DEVICE void
858arcaneCheckAt(Int64 i, Int64 max_size)
859{
860#ifndef ARCCORE_DEVICE_CODE
861 if (i < 0 || i >= max_size)
862 arcaneRangeError(i, max_size);
863#else
864 ARCANE_UNUSED(i);
865 ARCANE_UNUSED(max_size);
866#endif
867}
868
869#if defined(ARCANE_CHECK) || defined(ARCANE_DEBUG)
870#define ARCANE_CHECK_AT(a, b) ::Arcane::arcaneCheckAt((a), (b))
871#else
872#define ARCANE_CHECK_AT(a, b)
873#endif
874
875/*---------------------------------------------------------------------------*/
876/*---------------------------------------------------------------------------*/
877
878} // End namespace Arcane
879
880/*---------------------------------------------------------------------------*/
881/*---------------------------------------------------------------------------*/
882
883#endif
Définitions et globaux de Arccore.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
void arcaneNoReferenceErrorCallTerminate(const void *ptr)
Utilisation d'un objet non référencé.
Definition Misc.cc:172
Int64 arcaneCurrentThread()
Retourne l'identifiant du thread courant.
Definition Misc.cc:109
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:68
bool arcaneHasThread()
Vrai si arcane est compilé avec le support des threads ET qu'ils sont actifs.
Definition Misc.cc:93
Int64 UniqueIdType
Type des entiers utilisés pour stocker les identifiants uniques (globaux) des entités.
std::int64_t Int64
Type entier signé sur 64 bits.
void arcaneSetHasThread(bool v)
Active ou désactive le support des threads.
Definition Misc.cc:99
void arcaneNullPointerError()
Signalue l'utilisation d'un pointeur nul.
Int32 Integer
Type représentant un entier.
void arcanePrintf(const char *,...)
Encapsulation de la fonction C printf.
Definition Misc.cc:182
void arcaneNotYetImplemented(const char *file, const char *func, unsigned long line, const char *text)
Signale une fonction non implémentée.
Integer arcaneSizeWithPadding(Integer size)
Retourne la taille avec padding pour une taille size.
void arcaneDeprecated(const char *file, const char *func, unsigned long line, const char *text)
Signale l'utilisation d'une fonction obsolète.
bool arcaneIsDebug()
Vrai si la macro ARCANE_DEBUG est définie.
Definition Misc.cc:80
void arcaneSetCheck(bool v)
Active ou désactive le mode vérification.
Definition Misc.cc:74
void arcaneNoReferenceError(const void *ptr)
Utilisation d'un objet non référencé.
Definition Misc.cc:162
bool _checkDebug(unsigned int val)
Definition Misc.cc:242
__host__ __device__ void arcaneMathError(long double arg_value, const char *func_name)
Signale un argument invalide d'une fonction mathématique.
void _doAssert(const char *text, const char *file, const char *func, size_t line)
Definition Misc.cc:225
void arcaneDebugPause(const char *msg)
Passe en mode pause ou lance une erreur fatale.
Definition Misc.cc:127
void arcaneCheckAlignment(const void *ptr, Integer alignment)
Vérifie que ptr est aligné sur alignment octets. Si ce n'est pas le cas, Sinon, lance une exception d...
std::int32_t Int32
Type entier signé sur 32 bits.
void arcaneThrowNullPointerError(const char *ptr_name, const char *text)
Signalee l'utilisation d'un pointeur nul en envoyant une exception.