|
Boost : |
From: Boris Gubenko (Boris.Gubenko_at_[hidden])
Date: 2006-10-24 12:36:57
John Maddock wrote:
> Will do [...]
Thanks!
> [...] but shouldn't the #include of <fenv.h> be outside the namespace
> declarations?
I asked myself the same question. I modeled ia64_rounding_control.hpp
after alpha_rounding_control.hpp (for the obvious reason :-) which
#include's <float.h> inside the namespace declarations.
Since alpha_rounding_control.hpp handles both gcc and cxx and <float.h>
is included only in cxx path, perhaps, it made sense in this case to
structure the header the way it is structured. However, there is no
reason for ia64_rounding_control.hpp to #include <fenv.h> inside the
namespace declarations.
To double check, I moved '#include of <fenv.h>' outside the namespace
declarations, right after '#if defined(__HP_aCC)', ran numeric_interval
library tests and they all passed. So, please, make this change before
committing the header. Thanks for reviewing it!
Boris
----- Original Message -----
From: "John Maddock" <john_at_[hidden]>
To: <boost_at_[hidden]>
Sent: Tuesday, October 24, 2006 12:07 PM
Subject: Re: [boost] [numeric_interval] patch for HP-UX/ia64
> Boris Gubenko wrote:
>> boost does not have rounding control header file for HP-UX/ia64 and,
>> as a result, numeric_interval library tests fail on this platform
>> with the following #error directive:
>>
>> "../boost/numeric/interval/hw_rounding.hpp", line 36: error #2035:
>> #error directive: Boost.Numeric.Interval: Please specify rounding
>> control mechanism.
>> # error Boost.Numeric.Interval: Please specify rounding control
>> mechanism. ^
>>
>> I've created rounding control file and amended hw_rounding.hpp to
>> include it when appropriate -- see below. With these changes, all
>> numeric_interval library tests pass and the change does not cause
>> any regression in boost build and tests.
>>
>> Can the patch for hw_rounding.hpp below and the new header file be
>> committed to both the HEAD and the RC branch? (I don't have
>> developer privileges in cvs)
>>
>> Thanks,
>> Boris
>
> Will do but shouldn't the #include of <fenv.h> be outside the namespace
> declarations?
>
> John.
>
>
>> Index: hw_rounding.hpp
>> ===================================================================
>> RCS file:
>> /cvsroot/boost/boost/boost/numeric/interval/hw_rounding.hpp,v
>> retrieving revision 1.8
>> diff -r1.8 hw_rounding.hpp
>> 27a28,29
>>> #elif defined(ia64) || defined(__ia64) || defined(__ia64__)
>>> # include <boost/numeric/interval/detail/ia64_rounding_control.hpp>
>>
>> boost/numeric/interval/detail/ia64_rounding_control.hpp
>> =======================================================
>> /* Boost interval/detail/ia64_rounding_control.hpp file
>> *
>> * Copyright 2006 Boris Gubenko
>> *
>> * Distributed under the Boost Software License, Version 1.0.
>> * (See accompanying file LICENSE_1_0.txt or
>> * copy at http://www.boost.org/LICENSE_1_0.txt)
>> */
>>
>> #ifndef BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP
>> #define BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP
>>
>> #if !defined(ia64) && !defined(__ia64) && !defined(__ia64__)
>> #error This header only works on ia64 CPUs.
>> #endif
>>
>> #if defined(__HP_aCC)
>>
>> namespace boost {
>> namespace numeric {
>> namespace interval_lib {
>> namespace detail {
>>
>> # include <fenv.h>
>>
>> struct ia64_rounding_control
>> {
>> typedef unsigned int rounding_mode;
>>
>> static void set_rounding_mode(const rounding_mode& mode) {
>> fesetround(mode); }
>> static void get_rounding_mode(rounding_mode& mode) { mode =
>> fegetround(); }
>>
>> static void downward() { set_rounding_mode(FE_DOWNWARD); }
>> static void upward() { set_rounding_mode(FE_UPWARD); }
>> static void to_nearest() { set_rounding_mode(FE_TONEAREST); }
>> static void toward_zero() { set_rounding_mode(FE_TOWARDZERO); }
>> };
>>
>> } // namespace detail
>>
>> extern "C" {
>> float rintf(float);
>> double rint(double);
>> long double rintl(long double);
>> }
>>
>> template<>
>> struct rounding_control<float>:
>> detail::ia64_rounding_control
>> {
>> static float force_rounding(const float r)
>> { volatile float _r = r; return _r; }
>> static float to_int(const float& x) { return rintf(x); }
>> };
>>
>> template<>
>> struct rounding_control<double>:
>> detail::ia64_rounding_control
>> {
>> static const double & force_rounding(const double& r) { return r; }
>> static double to_int(const double& r) { return rint(r); }
>> };
>>
>> template<>
>> struct rounding_control<long double>:
>> detail::ia64_rounding_control
>> {
>> static const long double & force_rounding(const long double& r) {
>> return r; } static long double to_int(const long double& r) { return
>> rintl(r); } };
>>
>> } // namespace interval_lib
>> } // namespace numeric
>> } // namespace boost
>>
>> #undef BOOST_NUMERIC_INTERVAL_NO_HARDWARE
>>
>> #endif /* __HP_aCC */
>>
>> #endif /* BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP */
>>
>>
>> _______________________________________________
>> Unsubscribe & other changes:
>> http://lists.boost.org/mailman/listinfo.cgi/boost
>
> _______________________________________________
> Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
>
>
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk