Blaze  3.6
NumericCast.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_UTIL_NUMERICCAST_H_
36 #define _BLAZE_UTIL_NUMERICCAST_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <limits>
44 #include <blaze/util/Assert.h>
46 #include <blaze/util/EnableIf.h>
47 #include <blaze/util/Exception.h>
54 
55 
56 namespace blaze {
57 
58 //=================================================================================================
59 //
60 // AUXILIARY VARIABLE TEMPLATE DEFINITIONS
61 //
62 //=================================================================================================
63 
64 //*************************************************************************************************
69 template< typename To, typename From >
70 constexpr bool IsCriticalIntIntConversion_v =
71  ( IsIntegral_v<To> && IsIntegral_v<From> && !IsSame_v<To,From> );
73 //*************************************************************************************************
74 
75 
76 //*************************************************************************************************
81 template< typename To, typename From >
82 constexpr bool IsCriticalFloatIntConversion_v =
83  ( IsIntegral_v<To> && IsFloatingPoint_v<From> );
85 //*************************************************************************************************
86 
87 
88 //*************************************************************************************************
93 template< typename To, typename From >
94 constexpr bool IsCriticalFloatFloatConversion_v =
95  ( IsFloatingPoint_v<To> && IsFloatingPoint_v<From> && ( sizeof(To) < sizeof(From) ) );
97 //*************************************************************************************************
98 
99 
100 //*************************************************************************************************
105 template< typename To, typename From >
106 constexpr bool IsUncriticalConversion_v =
107  ( !IsCriticalIntIntConversion_v<To,From> &&
108  !IsCriticalFloatIntConversion_v<To,From> &&
109  !IsCriticalFloatFloatConversion_v<To,From> );
111 //*************************************************************************************************
112 
113 
114 
115 
116 //=================================================================================================
117 //
118 // NUMERIC CAST OPERATORS
119 //
120 //=================================================================================================
121 
122 //*************************************************************************************************
125 template< typename To, typename From > inline To numeric_cast( From from );
127 //*************************************************************************************************
128 
129 
130 //*************************************************************************************************
138 template< typename To, typename From >
139 inline EnableIf_t< IsUncriticalConversion_v<To,From>, To >
140  numeric_cast_backend( From from ) noexcept
141 {
142  return from;
143 }
145 //*************************************************************************************************
146 
147 
148 //*************************************************************************************************
158 template< typename To, typename From >
159 inline EnableIf_t< IsCriticalIntIntConversion_v<To,From>, To >
160  numeric_cast_backend( From from )
161 {
162  if( ( sizeof(To) < sizeof(From) || ( IsSigned_v<To> && IsUnsigned_v<From> ) ) &&
163  ( from > From( std::numeric_limits<To>::max() ) ) )
164  BLAZE_THROW_OVERFLOW_ERROR( "Invalid numeric cast (overflow)" );
165 
166  if( IsSigned_v<From> &&
167  ( from < From( std::numeric_limits<To>::min() ) ) )
168  BLAZE_THROW_UNDERFLOW_ERROR( "Invalid numeric cast (underflow)" );
169 
170  BLAZE_INTERNAL_ASSERT( from == From( To( from ) ), "Numeric cast failed" );
171 
172  return from;
173 }
175 //*************************************************************************************************
176 
177 
178 //*************************************************************************************************
188 template< typename To, typename From >
189 inline EnableIf_t< IsCriticalFloatIntConversion_v<To,From>, To >
190  numeric_cast_backend( From from )
191 {
192  using std::trunc;
193 
194  if( from > From( std::numeric_limits<To>::max() ) )
195  BLAZE_THROW_OVERFLOW_ERROR( "Invalid numeric cast (overflow)" );
196 
197  if( from < From( std::numeric_limits<To>::min() ) )
198  BLAZE_THROW_UNDERFLOW_ERROR( "Invalid numeric cast (underflow)" );
199 
200  BLAZE_INTERNAL_ASSERT( trunc( from ) == From( To( from ) ), "Numeric cast failed" );
201 
202  return from;
203 }
205 //*************************************************************************************************
206 
207 
208 //*************************************************************************************************
218 template< typename To, typename From >
219 inline EnableIf_t< IsCriticalFloatFloatConversion_v<To,From>, To >
220  numeric_cast_backend( From from )
221 {
222  if( from > From( std::numeric_limits<To>::max() ) )
223  BLAZE_THROW_OVERFLOW_ERROR( "Invalid numeric cast (overflow)" );
224 
225  if( from < From( std::numeric_limits<To>::min() ) )
226  BLAZE_THROW_UNDERFLOW_ERROR( "Invalid numeric cast (underflow)" );
227 
228  BLAZE_INTERNAL_ASSERT( from == From( To( from ) ), "Numeric cast failed" );
229 
230  return from;
231 }
233 //*************************************************************************************************
234 
235 
236 //*************************************************************************************************
267 template< typename To // The target type
268  , typename From > // The source type
269 inline To numeric_cast( From from )
270 {
273 
274  return numeric_cast_backend<To>( from );
275 }
276 //*************************************************************************************************
277 
278 } // namespace blaze
279 
280 #endif
Constraint on the data type.
Header file for the IsSame and IsStrictlySame type traits.
Header file for exception macros.
Header file for the IsIntegral type trait.
To numeric_cast(From from)
Checked conversion of values of numeric type.
Definition: NumericCast.h:269
#define BLAZE_THROW_OVERFLOW_ERROR(MESSAGE)
Macro for the emission of a std::overflow_error exception.This macro encapsulates the default way of ...
Definition: Exception.h:427
Namespace of the Blaze C++ math library.
Definition: Blaze.h:58
Header file for the IsFloatingPoint type trait.
#define BLAZE_THROW_UNDERFLOW_ERROR(MESSAGE)
Macro for the emission of a std::underflow_error exception.This macro encapsulates the default way of...
Definition: Exception.h:475
decltype(auto) min(const DenseMatrix< MT1, SO1 > &lhs, const DenseMatrix< MT2, SO2 > &rhs)
Computes the componentwise minimum of the dense matrices lhs and rhs.
Definition: DMatDMatMapExpr.h:1162
decltype(auto) trunc(const DenseMatrix< MT, SO > &dm)
Applies the trunc() function to each single element of the dense matrix dm.
Definition: DMatMapExpr.h:1268
decltype(auto) max(const DenseMatrix< MT1, SO1 > &lhs, const DenseMatrix< MT2, SO2 > &rhs)
Computes the componentwise maximum of the dense matrices lhs and rhs.
Definition: DMatDMatMapExpr.h:1198
Header file for the EnableIf class template.
Header file for run time assertion macros.
#define BLAZE_CONSTRAINT_MUST_BE_NUMERIC_TYPE(T)
Constraint on the data type.In case the given data type T is not a numeric (integral or floating poin...
Definition: Numeric.h:61
Header file for the IsSigned type trait.
Header file for the IsUnsigned type trait.
Header file for the IntegralConstant class template.
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression,...
Definition: Assert.h:101