Boost logo

Boost :

From: Fernando Cacciola (fcacciola_at_[hidden])
Date: 2001-09-21 12:15:51

----- Original Message -----
From: Eric Ford <eford_at_[hidden]>
To: <boost_at_[hidden]>
Sent: Thursday, September 20, 2001 4:04 PM
Subject: [boost] optimization for numeric_cast

> Is there a reason numeric cast performs runtime checks when casting to
> the same type? I was thinking of adding something like:
> typedef typename ::boost::remove_cv<Source>::type Source_no_cv;
> typedef typename ::boost::remove_cv<Target>::type Target_no_cv;
> if(::boost::is_same<Source_no_cv,Target_no_cv>::value) return arg;
> E
This and other sort of optimizations are possible.
I particular, you might want to look at the file 'cvt_n.h" that I attached
in message:

that file contains a numeric conversion template class that I wrote some
years ago when boost::numeric_cast<> was merely a static_cast<>.

cvt_n<> offers optimized conversions, automatic and optimized range checking
and rounding, and supports user defined number types.
You might get the files that I attached in that message and set up a test
bed to see the impact in the optimizations and optimized checks and

I'll transcript here a part of cvt_n<> documentation.

// T t = cvt_n<T>(s)
// Converts from numeric S to numeric T.
// The following optimizations are performed:
// 1) Conversion between equal types are effectively bypassed.
// S v ; S u = cvt_n<S>(v) ; // Expands EXACTLY to: S u = v ;
// 2) Runtime Range checking -when applicable- is applied, but is
controlled by a traits class.
// For built-in types, range checking is bypassed if conversion goes to
// a bigger range type:
// int u = cvt_n<int>( (short) 1 ) ; // No range checking.
// Mixing signed/unsigned types forces range checking:
// int u = cvt_n<int> ( (unsigned int) 1) ; // range checking.
// 3) Rounding is applied when converting from a non-integer type to an
// integer type (in other cases rounding is not applied).
// The rounding is performed by a free template function round() which
// be specialized.
// Range checking is combined to ensure proper conversion after
// int u = cvt_n<int>(2.5) ; // rounding and range checking.
// float v = cvt_n<float>(2.5) ; // no explicit rounding.
// 4) Supports user defined types if they specialize numeric_limits<> and
// provides applicable constructors and conversion operators.

If there is group consensus I can rewrite numeric_cast<> so that it behaves
like cvt_n<>.


Fernando Cacciola
Sierra s.r.l.

Boost list run by bdawes at, gregod at, cpdaniel at, john at