Arcane  v3.15.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ArccoreGlobal.h
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/* ArccoreGlobal.h (C) 2000-2024 */
9/* */
10/* Déclarations générales de Arccore. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_BASE_ARCCOREGLOBAL_H
13#define ARCCORE_BASE_ARCCOREGLOBAL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include <cstdint>
18
19#include "arccore/arccore_config.h"
20
21#ifdef ARCCORE_VALID_TARGET
22# undef ARCCORE_VALID_TARGET
23#endif
24
25// Determine le type de l'os.
26#if defined(__linux)
27# define ARCCORE_OS_LINUX
28#elif defined(__APPLE__) && defined(__MACH__)
29# define ARCCORE_OS_MACOS
30#elif defined(_AIX)
31# define ARCCORE_OS_AIX
32#elif defined(__WIN32__) || defined(__NT__) || defined(WIN32) || defined(_WIN32) || defined(WIN32) || defined(_WINDOWS)
33# define ARCCORE_OS_WIN32
34#elif defined(__CYGWIN__)
35# define ARCCORE_OS_CYGWIN
36#endif
37
38#ifdef ARCCORE_OS_WIN32
39# define ARCCORE_VALID_TARGET
40# define ARCCORE_EXPORT __declspec(dllexport)
41# define ARCCORE_IMPORT __declspec(dllimport)
42
43/* Supprime certains avertissements du compilateur Microsoft */
44# ifdef _MSC_VER
45# pragma warning(disable: 4251) // class 'A' needs to have dll interface for to be used by clients of class 'B'.
46# pragma warning(disable: 4275) // non - DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier'
47# pragma warning(disable: 4800) // 'type' : forcing value to bool 'true' or 'false' (performance warning)
48# pragma warning(disable: 4355) // 'this' : used in base member initializer list
49# endif
50
51#endif
52
53// Sous Unix, indique que par défaut les symboles de chaque .so sont cachés.
54// Il faut alors explicitement marquer les
55// symboles qu'on souhaite exporter, comme sous windows.
56// La seule différence est que pour gcc avec les instantiations explicites
57// de template, il faut spécifier l'export lors de l'instantiation
58// explicite alors que sous windows c'est dans la classe.
59#ifndef ARCCORE_OS_WIN32
60# define ARCCORE_EXPORT __attribute__ ((visibility("default")))
61# define ARCCORE_IMPORT __attribute__ ((visibility("default")))
62# define ARCCORE_TEMPLATE_EXPORT ARCCORE_EXPORT
63#endif
64
65#ifdef ARCCORE_OS_CYGWIN
66# define ARCCORE_VALID_TARGET
67#endif
68
69#ifdef ARCCORE_OS_LINUX
70# define ARCCORE_VALID_TARGET
71#endif
72
73#ifdef ARCCORE_OS_MACOS
74# define ARCCORE_VALID_TARGET
75#endif
76
77#ifndef ARCCORE_VALID_TARGET
78#error "This target is not supported"
79#endif
80
81#ifndef ARCCORE_EXPORT
82#define ARCCORE_EXPORT
83#endif
84
85#ifndef ARCCORE_IMPORT
86#define ARCCORE_IMPORT
87#endif
88
89#ifndef ARCCORE_TEMPLATE_EXPORT
90#define ARCCORE_TEMPLATE_EXPORT
91#endif
92
93#ifndef ARCCORE_RESTRICT
94#define ARCCORE_RESTRICT
95#endif
96
97#define ARCCORE_STD std
98
99//Tag var as a voluntary unused variable.
100//Works with any compiler but might be improved by using attribute.
101#define ARCCORE_UNUSED(var) do { (void)(var) ; } while(false)
102
103/*---------------------------------------------------------------------------*/
104/*---------------------------------------------------------------------------*/
105
106#ifdef DOXYGEN_DOC
107typedef ARCCORE_TYPE_INT16 Int16;
108typedef ARCCORE_TYPE_INT32 Int32;
109typedef ARCCORE_TYPE_INT64 Int64;
110#endif
111
112/*---------------------------------------------------------------------------*/
113/*---------------------------------------------------------------------------*/
114/*
115 * Macros pour le support de la programmation hétérogène (CPU/GPU)
116 - ARCCORE_DEVICE_CODE: indique une partie de code compilée uniquement sur le device
117 - ARCCORE_HOST_DEVICE: indique que la méthode/variable est accessible à la fois
118 sur le device et l'hôte
119 - ARCCORE_DEVICE: indique que la méthode/variable est accessible uniquement sur
120 le device.
121*/
122
123#if defined(__SYCL_DEVICE_ONLY__)
124# define ARCCORE_DEVICE_CODE
125# define ARCCORE_DEVICE_TARGET_SYCL
126#elif defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__)
127# define ARCCORE_DEVICE_CODE
128# if defined(__HIP_DEVICE_COMPILE__)
129# define ARCCORE_DEVICE_TARGET_HIP
130# endif
131# if defined(__CUDA_ARCH__)
132# define ARCCORE_DEVICE_TARGET_CUDA
133// Nécessaire pour assert() par exemple dans arccoreCheckAt()
134// TODO: regarder si cela est aussi nécessaire pour AMD HIP.
135#include <cassert>
136# endif
137#endif
138
139#if defined(__CUDACC__) || defined(__HIP__)
140#define ARCCORE_HOST_DEVICE __host__ __device__
141#define ARCCORE_DEVICE __device__
142#endif
143
144
145#ifndef ARCCORE_HOST_DEVICE
146#define ARCCORE_HOST_DEVICE
147#endif
148
149#ifndef ARCCORE_DEVICE
150#define ARCCORE_DEVICE
151#endif
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
156#if defined(ARCCORE_COMPONENT_arccore_base)
157#define ARCCORE_BASE_EXPORT ARCCORE_EXPORT
158#define ARCCORE_BASE_EXTERN_TPL
159#else
160#define ARCCORE_BASE_EXPORT ARCCORE_IMPORT
161#define ARCCORE_BASE_EXTERN_TPL extern
162#endif
163
164#ifdef ARCCORE_REAL_USE_APFLOAT
165# include <apfloat.h>
166#endif
167
168/*---------------------------------------------------------------------------*/
169/*---------------------------------------------------------------------------*/
170
171namespace Arccore
172{
173
174/*---------------------------------------------------------------------------*/
175/*---------------------------------------------------------------------------*/
176/*
177 * Définition des types Arccore Int16, Int32 et Int64.
178 */
179//! Type entier signé sur 8 bits
180using Int8 = std::int8_t;
181//! Type entier signé sur 16 bits
182using Int16 = std::int16_t;
183//! Type entier signé sur 32 bits
184using Int32 = std::int32_t;
185//! Type entier signé sur 64 bits
186using Int64 = std::int64_t;
187//! Type entier non signé sur 32 bits
188using UInt32 = std::uint32_t;
189//! Type entier non signé sur 64 bits
190using UInt64 = std::uint64_t;
191
192/*---------------------------------------------------------------------------*/
193/*---------------------------------------------------------------------------*/
194/*!
195 * \brief Type représentant un pointeur.
196 *
197 * Il doit être utilisé partout ou un objet de type pointeur quelconque est attendu.
198 */
199using Pointer = void*;
200
201#ifdef ARCCORE_REAL_USE_APFLOAT
202# define ARCCORE_REAL(val) (Real(#val,1000))
203# define ARCCORE_REAL_NOT_BUILTIN
204using Real = apfloat;
205using APReal = apfloat;
206#else
207# ifdef ARCCORE_REAL_LONG
208# define ARCCORE_REAL(val) val##L
209/*!
210 * \brief Type représentant un réel.
211 *
212 * Il doit être utilisé partout ou un objet de type réel est attendu.
213 */
214using long double Real;
215# else
216# define ARCCORE_REAL(val) val
217# define ARCCORE_REAL_IS_DOUBLE
218/*!
219 * \brief Type représentant un réel.
220 *
221 * Il doit être utilisé partout ou un objet de type réel est attendu.
222 */
223using Real = double;
224# endif
225//! Emulation de réel en précision arbitraire.
227{
228 public:
229 Real v[4];
230};
231#endif
232
233#ifdef ARCCORE_64BIT
234# define ARCCORE_INTEGER_MAX ARCCORE_INT64_MAX
235using Short = Int32;
236using Integer = Int64;
237#else
238# define ARCCORE_INTEGER_MAX ARCCORE_INT32_MAX
239using Short = Int32;
241#endif
242
243/*!
244 * \def ARCCORE_INTEGER_MAX
245 * \brief Macro indiquant la valeur maximal que peut prendre le type #Integer
246 */
247
248
249/*!
250 * \typedef Int64
251 * \brief Type entier signé sur 64 bits.
252 */
253/*!
254 * \typedef Int32
255 * \brief Type entier signé sur 32 bits.
256 */
257/*!
258 * \typedef Int16
259 * \brief Type entier signé sur 16 bits.
260 */
261/*!
262 * \typedef Integer
263 * \brief Type représentant un entier
264 *
265 * Si la macro ARCCORE_64BIT est définie, le type Integer correspond à un
266 * entier Int64, sinon à un entier Int32.
267 */
268
269/*---------------------------------------------------------------------------*/
270/*---------------------------------------------------------------------------*/
271
272//! Brain Float16
273class BFloat16;
274
275//! Float 16 bit
276class Float16;
277
278//! Type flottant IEEE-753 simple précision
279using Float32 = float;
280
281//! Float 128 bit
282class Float128;
283
284//! Integer 128 bit
285class Int128;
286
287/*---------------------------------------------------------------------------*/
288/*---------------------------------------------------------------------------*/
289
290/*!
291 * \internal
292 * \brief Structure équivalente à la valeur booléenne \a vrai
293 */
294struct TrueType {};
295/*!
296 \internal
297 \brief Structure équivalente à la valeur booléenne \a vrai
298*/
299struct FalseType {};
300
301/*---------------------------------------------------------------------------*/
302/*---------------------------------------------------------------------------*/
303
304#ifdef __GNUG__
305# define ARCCORE_DEPRECATED __attribute__ ((deprecated))
306#endif
307
308#ifdef _MSC_VER
309# if _MSC_VER >= 1300
310# define ARCCORE_DEPRECATED __declspec(deprecated)
311# endif
312#endif
313
314#define ARCCORE_DEPRECATED_2017 ARCCORE_DEPRECATED
315#define ARCCORE_DEPRECATED_2018 ARCCORE_DEPRECATED
316#define ARCCORE_DEPRECATED_2019(reason) [[deprecated(reason)]]
317#define ARCCORE_DEPRECATED_2020(reason) [[deprecated(reason)]]
318#define ARCCORE_DEPRECATED_REASON(reason) [[deprecated(reason)]]
319
320// Définir cette macro si on souhaite supprimer de la compilation les
321// méthodes et types obsolètes.
322#define ARCCORE_NO_DEPRECATED
323
324#ifndef ARCCORE_DEPRECATED
325# define ARCCORE_DEPRECATED
326#endif
327
328/*---------------------------------------------------------------------------*/
329/*---------------------------------------------------------------------------*/
330
331/*---------------------------------------------------------------------------*/
332/*---------------------------------------------------------------------------*/
333// Macros de compatibilités avec les différents standards du C++.
334// Maintenant (en 2021) tous les compilateurs avec lesquels Arccore compile
335// ont le support du C++17 donc la plupart de ces macros ne sont plus utiles.
336// On les garde uniquement pour compatibilité avec le code existant.
337
338// La macro ARCCORE_NORETURN utilise l'attribut [[noreturn]] du C++11 pour
339// indiquer qu'une fonction ne retourne pas.
340#define ARCCORE_NORETURN [[noreturn]]
341
342//! Macro permettant de spécifier le mot-clé 'constexpr' du C++11
343#define ARCCORE_CONSTEXPR constexpr
344
345// Macro pour indiquer qu'on ne lance pas d'exceptions.
346#define ARCCORE_NOEXCEPT noexcept
347
348// Macros pour indiquer qu'on lance pas d'exceptions.
349#define ARCCORE_NOEXCEPT_FALSE noexcept(false)
350
351// Support pour operator[](a,b,...)
352#ifdef __cpp_multidimensional_subscript
353#define ARCCORE_HAS_MULTI_SUBSCRIPT
354#endif
355
356/*---------------------------------------------------------------------------*/
357/*---------------------------------------------------------------------------*/
358
359// Support pour l'alignement.
360// le C++11 utilise le mot clé alignas pour spécifier l'alignement.
361// Cela fonctionne avec GCC 4.9+ et Visual Studio 2015. Cela ne fonctionne
362// pas avec Visual Studio 2013. Donc pour Visual Studio on utilise dans tous
363// les cas __declspec qui fonctionne toujours. Sous Linux, __attribute__ fonctionne
364// aussi toujours donc on utilise cela. A noter que les structures Simd ont besoin
365// de l'attribut 'packed' qui n'existe que avec GCC et Intel. Il ne semble pas y avoir
366// d'équivalent avec MSVC.
367#ifdef _MSC_VER
368//! Macro pour garantir le compactage et l'alignement d'une classe sur \a value octets
369# define ARCCORE_ALIGNAS(value) __declspec(align(value))
370//! Macro pour garantir l'alignement d'une classe sur \a value octets
371# define ARCCORE_ALIGNAS_PACKED(value) __declspec(align(value))
372#else
373//! Macro pour garantir le compactage et l'alignement d'une classe sur \a value octets
374# define ARCCORE_ALIGNAS_PACKED(value) __attribute__ ((aligned (value),packed))
375//! Macro pour garantir l'alignement d'une classe sur \a value octets
376# define ARCCORE_ALIGNAS(value) __attribute__ ((aligned (value)))
377#endif
378
379/*---------------------------------------------------------------------------*/
380/*---------------------------------------------------------------------------*/
381
382#if defined(ARCCORE_CHECK) || defined(ARCCORE_DEBUG)
383# ifndef ARCCORE_DEBUG_ASSERT
384# define ARCCORE_DEBUG_ASSERT
385# endif
386#endif
387
388/*---------------------------------------------------------------------------*/
389/*---------------------------------------------------------------------------*/
390/*!
391 * \brief Vrai si on est en mode vérification.
392 *
393 * Ce mode est actif si la macro ARCCORE_CHECK est définie
394 * ou si la méthode arccoreSetCheck() a été positionnée a vrai.
395 */
396extern "C++" ARCCORE_BASE_EXPORT
397bool arccoreIsCheck();
398
399/*!
400 * \brief Active ou désactive le mode vérification.
401 *
402 * Le mode vérification est toujours actif si la macro ARCCORE_CHECK est définie.
403 * Sinon, il est possible de l'activer avec cette méthode. Cela permet
404 * d'activer certains tests même en mode optimisé.
405 */
406extern "C++" ARCCORE_BASE_EXPORT
407void arccoreSetCheck(bool v);
408
409/*!
410 * \brief Vrai si la macro ARCCORE_DEBUG est définie
411 */
412extern "C++" ARCCORE_BASE_EXPORT
414
415/*---------------------------------------------------------------------------*/
416/*---------------------------------------------------------------------------*/
417
418//! Encapsulation de la fonction C printf
419extern "C++" ARCCORE_BASE_EXPORT void
420arccorePrintf(const char*,...);
421
422/*---------------------------------------------------------------------------*/
423/*---------------------------------------------------------------------------*/
424/*!
425 * \brief Passe en mode pause ou lance une erreur fatale.
426 *
427 * Si arccoreSetPauseOnError() est appelé avec l'argument \a true,
428 * met le programme en pause
429 * pour éventuellement connecter un débugger dessus.
430 *
431 * Sinon, lance une exception FatalErrorException avec le message
432 * \a msg comme argument.
433 */
434extern "C++" ARCCORE_BASE_EXPORT void
435arccoreDebugPause(const char* msg);
436
437/*---------------------------------------------------------------------------*/
438/*---------------------------------------------------------------------------*/
439/*!
440 * \brief Indique si on l'appel à arccoreDebugPause() effectue une pause.
441 *
442 * \sa arccoreDebugPause()
443 */
444extern "C++" ARCCORE_BASE_EXPORT void
446
447/*---------------------------------------------------------------------------*/
448/*---------------------------------------------------------------------------*/
449/*!
450 * \brief Macro pour envoyer une exception avec formattage.
451 *
452 * \a exception_class est le type de l'exception. Les arguments suivants de
453 * la macro sont utilisés formatter un message d'erreur via la
454 * méthode String::format().
455 */
456#define ARCCORE_THROW(exception_class,...) \
457 throw exception_class (A_FUNCINFO,Arccore::String::format(__VA_ARGS__))
458
459/*---------------------------------------------------------------------------*/
460/*---------------------------------------------------------------------------*/
461/*!
462 * \brief Macro envoyant une exception FatalErrorException.
463 *
464 * Les arguments de la macro sont utilisés formatter un message
465 * d'erreur via la méthode String::format().
466 */
467#define ARCCORE_FATAL(...)\
468 throw Arccore::FatalErrorException(A_FUNCINFO,Arccore::String::format(__VA_ARGS__))
469
470/*---------------------------------------------------------------------------*/
471/*---------------------------------------------------------------------------*/
472/*!
473 * \brief Signalue l'utilisation d'un pointeur nul.
474 *
475 * Signale une tentative d'utilisation d'un pointeur nul.
476 * Affiche un message, appelle arccoreDebugPause() et lance une exception
477 * de type FatalErrorException.
478 */
479extern "C++" ARCCORE_BASE_EXPORT void
480arccoreNullPointerError ARCCORE_NORETURN ();
481
482/*---------------------------------------------------------------------------*/
483/*---------------------------------------------------------------------------*/
484/*!
485 * \brief Signale qu'une valeur n'est pas dans l'intervalle souhaité.
486 *
487 * Indique que l'assertion `min_value_inclusive <= i < max_value_exclusive`
488 * est fausse.
489 * Appelle arccoreDebugPause() puis lève une exception de type
490 * IndexOutOfRangeException.
491 *
492 * \param i valeur invalide.
493 * \param min_value_inclusive valeur minimale inclusive autorisée.
494 * \param max_value_exclusive valeur maximale exclusive autorisée.
495 */
496extern "C++" ARCCORE_BASE_EXPORT void
497arccoreRangeError ARCCORE_NORETURN (Int64 i,Int64 min_value_inclusive,
498 Int64 max_value_exclusive);
499
500/*---------------------------------------------------------------------------*/
501/*---------------------------------------------------------------------------*/
502/*!
503 * \brief Signale qu'une valeur n'est pas dans l'intervalle souhaité.
504 *
505 * Indique que l'assertion `0 <= i < max_value est fausse`.
506 * Lance une execption IndexOutOfRangeException.
507 *
508 * \param i indice invalide
509 * \param max_size nombre d'éléments du tableau
510 */
511extern "C++" ARCCORE_BASE_EXPORT void
512arccoreRangeError ARCCORE_NORETURN (Int64 i,Int64 max_size);
513
514/*---------------------------------------------------------------------------*/
515/*---------------------------------------------------------------------------*/
516/*!
517 * \brief Vérifie que `min_value_inclusive <= i < max_value_exclusive`.
518 *
519 * Si ce n'est pas le cas, appelle arccoreRangeError() pour lancer une
520 * exception.
521 */
522inline ARCCORE_HOST_DEVICE void
523arccoreCheckRange(Int64 i,Int64 min_value_inclusive,Int64 max_value_exclusive)
524{
525 if (i>=min_value_inclusive && i<max_value_exclusive)
526 return;
527#ifndef ARCCORE_DEVICE_CODE
528 arccoreRangeError(i,min_value_inclusive,max_value_exclusive);
529#elif defined(ARCCORE_DEVICE_TARGET_CUDA)
530 // Code pour le device.
531 // assert() est disponible pour CUDA.
532 // TODO: regarder si une fonction similaire existe pour HIP
533 assert(false);
534#endif
535}
536
537/*---------------------------------------------------------------------------*/
538/*---------------------------------------------------------------------------*/
539/*!
540 * \brief Vérifie un éventuel débordement de tableau.
541 *
542 * Appelle arccoreCheckRange(i,0,max_size).
543 */
544inline ARCCORE_HOST_DEVICE void
546{
547 arccoreCheckRange(i,0,max_size);
548}
549
550#if defined(ARCCORE_CHECK) || defined(ARCCORE_DEBUG)
551#define ARCCORE_CHECK_AT(a,b) ::Arccore::arccoreCheckAt((a),(b))
552#define ARCCORE_CHECK_RANGE(a,b,c) ::Arccore::arccoreCheckRange((a),(b),(c))
553#else
554#define ARCCORE_CHECK_AT(a,b)
555#define ARCCORE_CHECK_RANGE(a,b,c)
556#endif
557
558#define ARCCORE_CHECK_AT2(a0,a1,b0,b1) \
559 ARCCORE_CHECK_AT(a0,b0); ARCCORE_CHECK_AT(a1,b1)
560#define ARCCORE_CHECK_AT3(a0,a1,a2,b0,b1,b2) \
561 ARCCORE_CHECK_AT(a0,b0); ARCCORE_CHECK_AT(a1,b1); ARCCORE_CHECK_AT(a2,b2)
562#define ARCCORE_CHECK_AT4(a0,a1,a2,a3,b0,b1,b2,b3) \
563 ARCCORE_CHECK_AT(a0,b0); ARCCORE_CHECK_AT(a1,b1); ARCCORE_CHECK_AT(a2,b2); ARCCORE_CHECK_AT(a3,b3)
564
565/*---------------------------------------------------------------------------*/
566/*---------------------------------------------------------------------------*/
567
568#define ARCCORE_CAST_SMALL_SIZE(a) ((Integer)(a))
569
570/*---------------------------------------------------------------------------*/
571/*---------------------------------------------------------------------------*/
572
573/*
574 * Macros utilisées pour le débug.
575 */
576#ifdef ARCCORE_DEBUG_ASSERT
577extern "C++" ARCCORE_BASE_EXPORT void _doAssert(const char*,const char*,const char*,int);
578template<typename T> inline T*
579_checkPointer(T* t,const char* file,const char* func,int line)
580{
581 if (!t){
582 _doAssert("ARCCORE_ASSERT",file,func,line);
583 arccorePrintf("Bad Pointer");
584 }
585 return t;
586}
587# ifdef __GNUG__
588# define ARCCORE_D_WHERE(a) Arccore::_doAssert(a,__FILE__,__PRETTY_FUNCTION__,__LINE__)
589# define ARCCORE_DCHECK_POINTER(a) Arccore::_checkPointer((a),__FILE__,__PRETTY_FUNCTION__,__LINE__);
590# else
591# define ARCCORE_D_WHERE(a) Arccore::_doAssert(a,__FILE__,"(NoInfo)",__LINE__)
592# define ARCCORE_DCHECK_POINTER(a) Arccore::_checkPointer((a),__FILE__,"(NoInfo"),__LINE__);
593# endif
594# define ARCCORE_CHECK_PTR(a) \
595 {if (!(a)){Arccore::arccorePrintf("Null value");ARCCORE_D_WHERE("ARCCORE_ASSERT");}}
596
597# define ARCCORE_ASSERT(a,b) \
598 {if (!(a)){ Arccore::arccorePrintf("Assertion '%s' fails:",#a); Arccore::arccorePrintf b; ARCCORE_D_WHERE("ARCCORE_ASSERT");}}
599# define ARCCORE_WARNING(a) \
600 { Arccore::arccorePrintf a; ARCCORE_D_WHERE("ARCCORE_WARNING"); }
601#else
602# define ARCCORE_CHECK_PTR(a)
603# define ARCCORE_ASSERT(a,b)
604# define ARCCORE_WARNING(a)
605# define ARCCORE_DCHECK_POINTER(a) (a);
606#endif
607
608/*---------------------------------------------------------------------------*/
609/*---------------------------------------------------------------------------*/
610/*!
611 * \brief Signalee l'utilisation d'un pointeur nul en envoyant une exception
612 *
613 * Signale une tentative d'utilisation d'un pointeur nul.
614 * Lance une exception de type FatalErrorException.
615 *
616 * Dans l'exception, affiche \a text si non nul, sinon affiche \a ptr_name.
617 *
618 * Normalement cette méthode ne doit pas être appelée directement mais
619 * via la macro ARCCORE_CHECK_POINTER.
620 */
621extern "C++" ARCCORE_BASE_EXPORT void
622arccoreThrowNullPointerError [[noreturn]] (const char* ptr_name,const char* text);
623
624/*---------------------------------------------------------------------------*/
625/*---------------------------------------------------------------------------*/
626/*!
627 * \brief Vérifie qu'un pointeur n'est pas nul.
628 *
629 * Si le pointeur est nul, appelle arccoreThrowNullPointerError().
630 * Sinon, retourne le pointeur.
631 */
632inline void*
633arccoreThrowIfNull(void* ptr,const char* ptr_name,const char* text)
634{
635 if (!ptr)
636 arccoreThrowNullPointerError(ptr_name,text);
637 return ptr;
638}
639
640/*---------------------------------------------------------------------------*/
641/*---------------------------------------------------------------------------*/
642/*!
643 * \brief Macro retournant le pointeur \a ptr s'il est non nul
644 * ou lancant une exception s'il est nul.
645 *
646 * \sa arccoreThrowIfNull().
647 */
648#define ARCCORE_CHECK_POINTER(ptr) \
649 arccoreThrowIfNull(ptr,#ptr,nullptr)
650
651/*!
652 * \brief Macro retournant le pointeur \a ptr s'il est non nul
653 * ou lancant une exception s'il est nul.
654 *
655 * \sa arccoreThrowIfNull().
656 */
657#define ARCCORE_CHECK_POINTER2(ptr,text)\
658 arccoreThrowIfNull(ptr,#ptr,text)
659
660/*---------------------------------------------------------------------------*/
661/*---------------------------------------------------------------------------*/
662
663// Défitions des types de base.
664class String;
665class StringView;
666class StringFormatterArg;
667class StringBuilder;
668
669/*---------------------------------------------------------------------------*/
670/*---------------------------------------------------------------------------*/
671
672} // End namespace Arccore
673
674/*---------------------------------------------------------------------------*/
675/*---------------------------------------------------------------------------*/
676
677#endif
Emulation de réel en précision arbitraire.
Type flottant demi-précision.
Espace de nom de Arccore.
Definition ArcaneTypes.h:24
ARCCORE_BASE_EXPORT void arccoreThrowNullPointerError(const char *ptr_name, const char *text)
Signalee l'utilisation d'un pointeur nul en envoyant une exception.
double Real
Type représentant un réel.
Int32 Integer
Type représentant un entier.
ARCCORE_BASE_EXPORT void _doAssert(const char *text, const char *file, const char *func, int line)
std::uint32_t UInt32
Type entier non signé sur 32 bits.
__host__ __device__ void arccoreCheckAt(Int64 i, Int64 max_size)
Vérifie un éventuel débordement de tableau.
ARCCORE_BASE_EXPORT void arccoreSetCheck(bool v)
Active ou désactive le mode vérification.
float Float32
Type flottant IEEE-753 simple précision.
ARCCORE_BASE_EXPORT void arccoreRangeError(Int64 i, Int64 min_value_inclusive, Int64 max_value_exclusive)
Signale qu'une valeur n'est pas dans l'intervalle souhaité.
void * Pointer
Type représentant un pointeur.
ARCCORE_BASE_EXPORT void arccoreNullPointerError()
Signalue l'utilisation d'un pointeur nul.
ARCCORE_BASE_EXPORT void arccorePrintf(const char *format,...)
Encapsulation de la fonction C printf.
ARCCORE_BASE_EXPORT void arccoreDebugPause(const char *msg)
Passe en mode pause ou lance une erreur fatale.
std::int64_t Int64
Type entier signé sur 64 bits.
ARCCORE_BASE_EXPORT bool arccoreIsCheck()
Vrai si on est en mode vérification.
std::uint64_t UInt64
Type entier non signé sur 64 bits.
__host__ __device__ void arccoreCheckRange(Int64 i, Int64 min_value_inclusive, Int64 max_value_exclusive)
Vérifie que min_value_inclusive <= i < max_value_exclusive.
ARCCORE_BASE_EXPORT void arccoreSetPauseOnError(bool v)
Indique si on l'appel à arccoreDebugPause() effectue une pause.
std::int32_t Int32
Type entier signé sur 32 bits.
std::int8_t Int8
Type entier signé sur 8 bits.
void * arccoreThrowIfNull(void *ptr, const char *ptr_name, const char *text)
Vérifie qu'un pointeur n'est pas nul.
std::int16_t Int16
Type entier signé sur 16 bits.
ARCCORE_BASE_EXPORT bool arccoreIsDebug()
Vrai si la macro ARCCORE_DEBUG est définie.