Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
CheckedConvert.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/* CheckedConvert.h (C) 2000-2023 */
9/* */
10/* Fonctions pour convertir un type en un autre avec vérification. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_CHECKEDCONVERT_H
13#define ARCANE_UTILS_CHECKEDCONVERT_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18#include "arcane/utils/BadCastException.h"
19#include "arcane/utils/String.h"
20#include "arcane/utils/TraceInfo.h"
21#include "arcane/utils/Convert.h"
22
23#include <limits>
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
31{
32namespace impl
33{
34 inline Integer
35 toInteger(Int64 v)
36 {
37 if (v > std::numeric_limits<Integer>::max() || v < std::numeric_limits<Integer>::min())
38 ARCANE_THROW(BadCastException, "Invalid conversion from '{0}' to type Integer", v);
39 return static_cast<Integer>(v);
40 }
41} // namespace impl
42
43/*---------------------------------------------------------------------------*/
44/*---------------------------------------------------------------------------*/
46inline Integer
48{
49 double v = Convert::toDouble(r);
50 if (v > (double)std::numeric_limits<Integer>::max() || v < (double)std::numeric_limits<Integer>::min())
51 ARCANE_THROW(BadCastException, "Invalid conversion from '{0}' to type Integer", v);
52 return static_cast<Integer>(v);
53}
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
58inline Integer
59toInteger(long long v)
60{
61 return impl::toInteger(static_cast<Int64>(v));
62}
64inline Integer
65toInteger(long v)
66{
67 return impl::toInteger(static_cast<Int64>(v));
68}
70inline Integer
72{
73 return impl::toInteger(static_cast<Int64>(v));
74}
76inline Integer
77toInteger(unsigned long long v)
78{
79 return impl::toInteger(static_cast<Int64>(v));
80}
82inline Integer
83toInteger(unsigned long v)
84{
85 return impl::toInteger(static_cast<Int64>(v));
86}
88inline Integer
89toInteger(unsigned int v)
90{
91 return impl::toInteger(static_cast<Int64>(v));
92}
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
97
98inline Int32
99toInt32(Int64 v)
100{
101 if (v > std::numeric_limits<Int32>::max() || v < std::numeric_limits<Int32>::min())
102 throw BadCastException(A_FUNCINFO,
103 String::format("Invalid conversion from '{0}' to type Int32", v));
104 return (Int32)v;
105}
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
110
111inline Int16
112toInt16(Int64 v)
113{
114 if (v > std::numeric_limits<Int16>::max() || v < std::numeric_limits<Int16>::min())
115 throw BadCastException(A_FUNCINFO,
116 String::format("Invalid conversion from '{0}' to type Int16", v));
117 return (Int16)v;
118}
119
120/*---------------------------------------------------------------------------*/
121/*---------------------------------------------------------------------------*/
126inline Integer
127multiply(Integer x, Integer y, Integer z)
128{
129 Int64 x2 = static_cast<Int64>(x);
130 Int64 y2 = static_cast<Int64>(y);
131 Int64 z2 = static_cast<Int64>(z);
132 Int64 xyz = x2 * y2 * z2;
133 return impl::toInteger(xyz);
134}
135
136/*---------------------------------------------------------------------------*/
137/*---------------------------------------------------------------------------*/
142inline Integer
143multiply(Integer x, Integer y)
144{
145 Int64 x2 = static_cast<Int64>(x);
146 Int64 y2 = static_cast<Int64>(y);
147 Int64 xy = x2 * y2;
148 return impl::toInteger(xy);
149}
150
151/*---------------------------------------------------------------------------*/
152/*---------------------------------------------------------------------------*/
153
154} // namespace Arcane::CheckedConvert
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158
159#endif
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
Déclarations des types utilisés dans Arcane.
Exception lorsqu'une conversion d'un type vers un autre est invalide.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Fonctions pour convertir un type en un autre avec vérification.
Integer toInteger(Real r)
Converti un Int64 en un Integer.
Integer multiply(Integer x, Integer y, Integer z)
Multiplie trois 'Integer' et vérifie que le résultat peut être contenu dans un 'Integer'.
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
Int16 toInt16(Int64 v)
Converti un Int64 en un Int16.
double toDouble(Real r)
Converti un Real en double.
Definition Convert.h:40