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