Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
VariableDataTypeTraits.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* VariableDataTypeTraits.h (C) 2000-2023 */
9/* */
10/* Classes spécialisées pour caractériser les types de données. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_VARIABLEDATATYPETRAITS_H
13#define ARCANE_VARIABLEDATATYPETRAITS_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/ValueConvert.h"
19
21
22#include <cmath>
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
35template <typename DataType> inline void
36builtInDumpValue(String& s, const DataType& v)
37{
38 std::ostringstream sbuf;
39 sbuf << v << '\0';
40 s = sbuf.str();
41}
42
43/*---------------------------------------------------------------------------*/
44/*---------------------------------------------------------------------------*/
51template <typename DataType>
53{
54 public:
55
56 static eDataType type() { return DT_Unknown; }
57};
58
59/*---------------------------------------------------------------------------*/
60/*---------------------------------------------------------------------------*/
61
62/*---------------------------------------------------------------------------*/
63/*---------------------------------------------------------------------------*/
68template <>
69class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Byte>
70{
71 public:
72
74 typedef Byte Type;
75
78
81
84
87
88 typedef Byte BasicType;
89
90 static constexpr Integer nbBasicType() { return 1; }
91
92 public:
93
95 static constexpr const char* typeName() { return "Byte"; }
97 static constexpr eDataType type() { return DT_Byte; }
99 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
105 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
106
107 static bool verifDifferent(Byte v1, Byte v2, Byte& diff,
108 [[maybe_unused]] bool is_nan_equal = false)
109 {
110 if (v1 != v2) {
111 if (math::isZero(v1))
112 diff = (Byte)(v1 - v2);
113 else
114 diff = (Byte)((v1 - v2) / v1);
115 return true;
116 }
117 return false;
118 }
119
120 static Byte normeMax(Byte v)
121 {
122 return (Byte)math::abs(v);
123 }
124};
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
132template <>
133class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Real>
134{
135 public:
136
138 typedef Real Type;
139
142
145
148
151
152 typedef Real BasicType;
153
154 static constexpr Integer nbBasicType() { return 1; }
155
156 public:
157
159 static constexpr const char* typeName() { return "Real"; }
161 static constexpr eDataType type() { return DT_Real; }
163 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
169 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
170
171 static bool verifDifferent(Real v1, Real v2, Real& diff, bool is_nan_equal = false)
172 {
173 if (is_nan_equal) {
174 if (std::isnan(v1) && std::isnan(v2))
175 return false;
176 }
177 // Vérifie avant de les comparer que les deux nombres sont valides
178 // pour éviter une exception flottante sur certaines plates-formes
179 if (platform::isDenormalized(v1) || platform::isDenormalized(v2)) {
180 diff = 1.0;
181 return true;
182 }
183 if (v1 != v2) {
184 if (math::abs(v1) < 1.e-100) // TH: plantait pour v1 tres petit(math::isZero(v1))
185 diff = v1 - v2;
186 else
187 diff = (v1 - v2) / v1;
188 return true;
189 }
190 return false;
191 }
192
193 static Real normeMax(Real v)
194 {
195 return math::abs(v);
196 }
197};
198
199/*---------------------------------------------------------------------------*/
200/*---------------------------------------------------------------------------*/
205template <>
206class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Int16>
207{
208 public:
209
211 typedef Int16 Type;
212
215
218
221
224
225 typedef Int16 BasicType;
226
227 static constexpr Integer nbBasicType() { return 1; }
228
229 public:
230
232 static constexpr const char* typeName() { return "Int16"; }
234 static constexpr eDataType type() { return DT_Int16; }
236 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
242 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
243 static bool verifDifferent(Int16 v1, Int16 v2, Int16& diff,
244 [[maybe_unused]] bool is_nan_equal = false)
245 {
246 if (v1 != v2) {
247 if (math::isZero(v1))
248 diff = (Int16)(v1 - v2);
249 else
250 diff = (Int16)((v1 - v2) / v1);
251 return true;
252 }
253 return false;
254 }
255 static Int16 normeMax(Int16 v)
256 {
257 return math::abs(v);
258 }
259};
260
261/*---------------------------------------------------------------------------*/
262/*---------------------------------------------------------------------------*/
267template <>
268class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Int32>
269{
270 public:
271
273 typedef Int32 Type;
274
277
280
283
286
287 typedef Int32 BasicType;
288
289 static constexpr Integer nbBasicType() { return 1; }
290
291 public:
292
294 static constexpr const char* typeName() { return "Int32"; }
296 static constexpr eDataType type() { return DT_Int32; }
298 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
304 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
305 static bool verifDifferent(Int32 v1, Int32 v2, Int32& diff,
306 [[maybe_unused]] bool is_nan_equal = false)
307 {
308 if (v1 != v2) {
309 if (math::isZero(v1))
310 diff = v1 - v2;
311 else
312 diff = (v1 - v2) / v1;
313 return true;
314 }
315 return false;
316 }
317 static Int32 normeMax(Int32 v)
318 {
319 return math::abs(v);
320 }
321};
322
323/*---------------------------------------------------------------------------*/
324/*---------------------------------------------------------------------------*/
329template <>
330class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Int64>
331{
332 public:
333
335 typedef Int64 Type;
336
339
342
345
348
349 typedef Int64 BasicType;
350
351 static constexpr Integer nbBasicType() { return 1; }
352
353 public:
354
356 static constexpr const char* typeName() { return "Int64"; }
358 static constexpr eDataType type() { return DT_Int64; }
360 static void dumpValue(String& s, const Type& v) { builtInDumpValue(s, v); }
366 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
367
368 static bool verifDifferent(Type v1, Type v2, Type& diff,
369 [[maybe_unused]] bool is_nan_equal = false)
370 {
371 if (v1 != v2) {
372 if (math::isZero(v1))
373 diff = v1 - v2;
374 else
375 diff = (v1 - v2) / v1;
376 return true;
377 }
378 return false;
379 }
380 static Int64 normeMax(Int64 v)
381 {
382 return v;
383 }
384};
385
386/*---------------------------------------------------------------------------*/
387/*---------------------------------------------------------------------------*/
392template <>
393class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<String>
394{
395 public:
396
398 typedef String Type;
399
402
405
408
411
412 typedef String BasicType;
413
414 static constexpr Integer nbBasicType() { return 1; }
415
416 public:
417
419 static constexpr const char* typeName() { return "String"; }
421 static constexpr eDataType type() { return DT_String; }
423 static void dumpValue(String& s, const Type& v) { s = v; }
429 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
430
431 static bool verifDifferent(const Type v1, const Type& v2, Type&,
432 [[maybe_unused]] bool is_nan_equal = false)
433 {
434 return (v1 != v2);
435 }
436 static const char* normeMax(const char* v)
437 {
438 return v;
439 }
440};
441
442/*---------------------------------------------------------------------------*/
443/*---------------------------------------------------------------------------*/
448template <>
449class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Real2>
450{
451 public:
452
454 typedef Real2 Type;
455
458
461
464
467
468 typedef Real BasicType;
469
470 static constexpr Integer nbBasicType() { return 2; }
471
472 private:
473
474 using SubTraits = VariableDataTypeTraitsT<Real>;
475
476 public:
477
479 static constexpr const char* typeName() { return "Real2"; }
481 static constexpr eDataType type() { return DT_Real2; }
483 static void dumpValue(String& s, const Type&) { s = "N/A"; }
489 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
490
491 static bool verifDifferent(Real2 v1, Real2 v2, Real2& diff, bool is_nan_equal = false)
492 {
493 bool is_different = false;
494 is_different |= SubTraits::verifDifferent(v1.x, v2.x, diff.x, is_nan_equal);
495 is_different |= SubTraits::verifDifferent(v1.y, v2.y, diff.y, is_nan_equal);
496 return is_different;
497 }
498
499 static Real normeMax(const Real2& v)
500 {
501 Real vx = SubTraits::normeMax(v.x);
502 Real vy = SubTraits::normeMax(v.y);
503 return math::max(vx, vy);
504 }
505};
506
507/*---------------------------------------------------------------------------*/
508/*---------------------------------------------------------------------------*/
513template <>
514class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Real3>
515{
516 public:
517
519 typedef Real3 Type;
520
523
526
529
532
533 typedef Real BasicType;
534
535 static constexpr Integer nbBasicType() { return 3; }
536
537 private:
538
539 using SubTraits = VariableDataTypeTraitsT<Real>;
540
541 public:
542
544 static constexpr const char* typeName() { return "Real3"; }
546 static constexpr eDataType type() { return DT_Real3; }
548 static void dumpValue(String& s, const Type&) { s = "N/A"; }
554 static bool getValue(Type& v, const String& s) { return builtInGetValue(v, s); }
555
556 static bool verifDifferent(Real3 v1, Real3 v2, Real3& diff, bool is_nan_equal = false)
557 {
558 bool is_different = false;
559 is_different |= SubTraits::verifDifferent(v1.x, v2.x, diff.x, is_nan_equal);
560 is_different |= SubTraits::verifDifferent(v1.y, v2.y, diff.y, is_nan_equal);
561 is_different |= SubTraits::verifDifferent(v1.z, v2.z, diff.z, is_nan_equal);
562 return is_different;
563 }
564
565 static Real normeMax(const Real3& v)
566 {
567 Real vx = SubTraits::normeMax(v.x);
568 Real vy = SubTraits::normeMax(v.y);
569 Real vz = SubTraits::normeMax(v.z);
570 return math::max(vx, math::max(vy, vz));
571 }
572};
573
574/*---------------------------------------------------------------------------*/
575/*---------------------------------------------------------------------------*/
580template <>
581class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Real2x2>
582{
583 public:
584
586 typedef Real2x2 Type;
587
590
593
596
599
600 typedef Real BasicType;
601
602 static constexpr Integer nbBasicType() { return 4; }
603
604 private:
605
606 using SubTraits = VariableDataTypeTraitsT<Real2>;
607
608 public:
609
611 static constexpr const char* typeName() { return "Real2x2"; }
613 static constexpr eDataType type() { return DT_Real2x2; }
615 static void dumpValue(String& s, const Type&) { s = "N/A"; }
621 static bool getValue(Type&, const String&) { return true; }
622
623 static bool verifDifferent(Real2x2 v1, Real2x2 v2, Real2x2& diff, bool is_nan_equal = false)
624 {
625 bool is_different = false;
626 is_different |= SubTraits::verifDifferent(v1.x, v2.x, diff.x, is_nan_equal);
627 is_different |= SubTraits::verifDifferent(v1.y, v2.y, diff.y, is_nan_equal);
628 return is_different;
629 }
630
631 static Real normeMax(const Real2x2& v)
632 {
633 Real vx = SubTraits::normeMax(v.x);
634 Real vy = SubTraits::normeMax(v.y);
635 return SubTraits::normeMax(Real2(vx, vy));
636 }
637};
638
639/*---------------------------------------------------------------------------*/
640/*---------------------------------------------------------------------------*/
645template <>
646class ARCANE_CORE_EXPORT VariableDataTypeTraitsT<Real3x3>
647{
648 public:
649
651 typedef Real3x3 Type;
652
655
658
661
664
665 typedef Real BasicType;
666
667 static constexpr Integer nbBasicType() { return 9; }
668
669 private:
670
671 using SubTraits = VariableDataTypeTraitsT<Real3>;
672
673 public:
674
676 static constexpr const char* typeName() { return "Real3x3"; }
678 static constexpr eDataType type() { return DT_Real3x3; }
680 static void dumpValue(String& s, const Type&) { s = "N/A"; }
686 static bool getValue(Type&, const String&) { return true; }
687
688 static bool verifDifferent(Real3x3 v1, Real3x3 v2, Real3x3& diff, bool is_nan_equal = false)
689 {
690 bool is_different = false;
691 is_different |= SubTraits::verifDifferent(v1.x, v2.x, diff.x, is_nan_equal);
692 is_different |= SubTraits::verifDifferent(v1.y, v2.y, diff.y, is_nan_equal);
693 is_different |= SubTraits::verifDifferent(v1.z, v2.z, diff.z, is_nan_equal);
694 return is_different;
695 }
696
697 static Real normeMax(const Real3x3& v)
698 {
699 Real vx = SubTraits::normeMax(v.x);
700 Real vy = SubTraits::normeMax(v.y);
701 Real vz = SubTraits::normeMax(v.z);
702 return VariableDataTypeTraitsT<Real3>::normeMax(Real3(vx, vy, vz));
703 }
704};
705
706/*---------------------------------------------------------------------------*/
707/*---------------------------------------------------------------------------*/
708
709} // namespace Arcane
710
711/*---------------------------------------------------------------------------*/
712/*---------------------------------------------------------------------------*/
713
714#endif
Fichier contenant les définitions des types de données gérés par Arcane.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Classe gérant un vecteur de réel de dimension 2.
Definition Real2.h:121
Classe gérant une matrice de réel de dimension 2x2.
Definition Real2x2.h:53
Real2 x
Première composante.
Definition Real2x2.h:98
Real2 y
Deuxième composante.
Definition Real2x2.h:99
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Classe gérant une matrice de réel de dimension 3x3.
Definition Real3x3.h:66
Real3 z
premier élément du triplet
Definition Real3x3.h:119
Real3 y
premier élément du triplet
Definition Real3x3.h:118
Real3 x
premier élément du triplet
Definition Real3x3.h:117
static constexpr eDataType type()
Retourne le type de la variable.
TrueType IsNumeric
Indique si le type est numérique.
TrueType HasDump
Indique si le type peut être sauvé et relu.
FalseType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
Byte Type
Type du paramètre template.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
TrueType HasReduce
Indique si le type peut être subir une réduction.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
TrueType IsNumeric
Indique si le type est numérique.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType HasReduce
Indique si le type peut être subir une réduction.
TrueType HasDump
Indique si le type peut être sauvé et relu.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
TrueType HasDump
Indique si le type peut être sauvé et relu.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType IsNumeric
Indique si le type est numérique.
TrueType HasReduce
Indique si le type peut être subir une réduction.
TrueType HasReduce
Indique si le type peut être subir une réduction.
static constexpr eDataType type()
Retourne le type de la variable.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
TrueType HasDump
Indique si le type peut être sauvé et relu.
TrueType IsNumeric
Indique si le type est numérique.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
TrueType HasReduce
Indique si le type peut être subir une réduction.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType HasDump
Indique si le type peut être sauvé et relu.
static void dumpValue(String &s, const Type &)
Ecrit dans la chaîne s la valeur de v.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
TrueType IsNumeric
Indique si le type est numérique.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType IsNumeric
Indique si le type est numérique.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
TrueType HasReduce
Indique si le type peut être subir une réduction.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
Real2x2 Type
Type du paramètre template.
static bool getValue(Type &, const String &)
Stocke la conversion de la chaîne s en le type Type dans v.
TrueType HasDump
Indique si le type peut être sauvé et relu.
static void dumpValue(String &s, const Type &)
Ecrit dans la chaîne s la valeur de v.
static void dumpValue(String &s, const Type &)
Ecrit dans la chaîne s la valeur de v.
TrueType IsNumeric
Indique si le type est numérique.
TrueType HasReduce
Indique si le type peut être subir une réduction.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType HasDump
Indique si le type peut être sauvé et relu.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
TrueType HasDump
Indique si le type peut être sauvé et relu.
static constexpr eDataType type()
Retourne le type de la variable.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
TrueType HasReduce
Indique si le type peut être subir une réduction.
Real3x3 Type
Type du paramètre template.
static bool getValue(Type &, const String &)
Stocke la conversion de la chaîne s en le type Type dans v.
static void dumpValue(String &s, const Type &)
Ecrit dans la chaîne s la valeur de v.
TrueType IsNumeric
Indique si le type est numérique.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
static constexpr eDataType type()
Retourne le type de la variable.
TrueType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
TrueType IsNumeric
Indique si le type est numérique.
TrueType HasDump
Indique si le type peut être sauvé et relu.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
TrueType HasReduce
Indique si le type peut être subir une réduction.
FalseType HasReduceMinMax
Indique si le type peut être subir une réduction Min/Max.
static constexpr eDataType type()
Retourne le type de la variable.
static constexpr const char * typeName()
Retourne le nom du type de la variable.
FalseType IsNumeric
Indique si le type est numérique.
TrueType HasDump
Indique si le type peut être sauvé et relu.
FalseType HasReduce
Indique si le type peut être subir une réduction.
static void dumpValue(String &s, const Type &v)
Ecrit dans la chaîne s la valeur de v.
static bool getValue(Type &v, const String &s)
Stocke la conversion de la chaîne s en le type Type dans v.
String Type
Type du paramètre template.
Classe template d'informations sur un type d'une variable.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
void builtInDumpValue(String &s, const DataType &v)
Ecriture dans la chaine s d'un type basique de valeur v.
unsigned char Byte
Type d'un octet.
Definition UtilsTypes.h:142
eDataType
Type d'une donnée.
Definition DataTypes.h:39
@ DT_Real2x2
Donnée de type tenseur 3x3.
Definition DataTypes.h:48
@ DT_Int16
Donnée de type entier 16 bits.
Definition DataTypes.h:42
@ DT_Real3x3
Donnée de type tenseur 3x3.
Definition DataTypes.h:49
@ DT_Int32
Donnée de type entier 32 bits.
Definition DataTypes.h:43
@ DT_Real3
Donnée de type vecteur 3.
Definition DataTypes.h:47
@ DT_Int64
Donnée de type entier 64 bits.
Definition DataTypes.h:44
@ DT_Unknown
Donnée de type inconnue ou non initialisée.
Definition DataTypes.h:54
@ DT_String
Donnée de type chaîne de caractère UTF-8.
Definition DataTypes.h:45
@ DT_Real2
Donnée de type vecteur 2.
Definition DataTypes.h:46
@ DT_Real
Donnée de type réel.
Definition DataTypes.h:41
@ DT_Byte
Donnée de type octet.
Definition DataTypes.h:40
Type
Type of JSON value.
Definition rapidjson.h:665
Structure équivalente à la valeur booléenne vrai.
Real y
deuxième composante du couple
Definition Real2.h:35
Real x
première composante du couple
Definition Real2.h:34
Real y
deuxième composante du triplet
Definition Real3.h:36
Real z
troisième composante du triplet
Definition Real3.h:37
Real x
première composante du triplet
Definition Real3.h:35
Structure équivalente à la valeur booléenne vrai.