Arcane  v3.14.10.0
Documentation utilisateur
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/*---------------------------------------------------------------------------*/
27/*!
28 * \brief Fonctions pour convertir un type en un autre avec vérification
29 */
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/*---------------------------------------------------------------------------*/
45//! Converti un \c Int64 en un \c Integer
46inline Integer
47toInteger(Real r)
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/*---------------------------------------------------------------------------*/
57//! Converti \a v en le type \c Integer
58inline Integer
59toInteger(long long v)
60{
61 return impl::toInteger(static_cast<Int64>(v));
62}
63//! Converti \a v en le type \c Integer
64inline Integer
65toInteger(long v)
66{
67 return impl::toInteger(static_cast<Int64>(v));
68}
69//! Converti \a v en le type \c Integer
70inline Integer
72{
73 return impl::toInteger(static_cast<Int64>(v));
74}
75//! Converti \a v en le type \c Integer
76inline Integer
77toInteger(unsigned long long v)
78{
79 return impl::toInteger(static_cast<Int64>(v));
80}
81//! Converti \a v en le type \c Integer
82inline Integer
83toInteger(unsigned long v)
84{
85 return impl::toInteger(static_cast<Int64>(v));
86}
87//! Converti \a v en le type \c Integer
88inline Integer
89toInteger(unsigned int v)
90{
91 return impl::toInteger(static_cast<Int64>(v));
92}
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96//! Converti un \c Int64 en un \c Int32
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/*---------------------------------------------------------------------------*/
109//! Converti un \c Int64 en un \c Int16
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/*---------------------------------------------------------------------------*/
122/*!
123 * \brief Multiplie trois 'Integer' et vérifie que le résultat peut être contenu
124 * dans un 'Integer'.
125 */
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/*---------------------------------------------------------------------------*/
138/*!
139 * \brief Multiplie deux 'Integer' et vérifie que le résultat peut être contenu
140 * dans un 'Integer'.
141 */
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.
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