// signbit.hpp | |
#ifndef BOOST_SPIRIT_MATH_SIGNBIT_HPP | |
#define BOOST_SPIRIT_MATH_SIGNBIT_HPP | |
// Copyright (c) 2006 Johan Rade | |
// 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) | |
#if defined(_MSC_VER) | |
#pragma once | |
#endif | |
#include <boost/spirit/home/support/detail/math/detail/fp_traits.hpp> | |
namespace boost { | |
namespace spirit { | |
namespace math { | |
//------------------------------------------------------------------------------ | |
template<class T> bool (signbit)(T x) | |
{ | |
typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits; | |
traits::init(); | |
BOOST_DEDUCED_TYPENAME traits::bits a; | |
traits::get_bits(x,a); | |
a &= traits::sign; | |
return a != 0; | |
} | |
//------------------------------------------------------------------------------ | |
namespace detail { | |
template<class T> T copysign_impl(T x, T y) | |
{ | |
typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits; | |
traits::init(); | |
BOOST_DEDUCED_TYPENAME traits::bits a; | |
traits::get_bits(x,a); | |
a &= ~traits::sign; | |
BOOST_DEDUCED_TYPENAME traits::bits b; | |
traits::get_bits(y,b); | |
b &= traits::sign; | |
traits::set_bits(x,a|b); | |
return x; | |
} | |
} | |
inline float (copysign)(float x, float y) // magnitude of x and sign of y | |
{ | |
return detail::copysign_impl(x,y); | |
} | |
inline double (copysign)(double x, double y) | |
{ | |
return detail::copysign_impl(x,y); | |
} | |
inline long double (copysign)(long double x, long double y) | |
{ | |
return detail::copysign_impl(x,y); | |
} | |
//------------------------------------------------------------------------------ | |
template<class T> T (changesign)(T x) | |
{ | |
typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits; | |
traits::init(); | |
BOOST_DEDUCED_TYPENAME traits::bits a; | |
traits::get_bits(x,a); | |
a ^= traits::sign; | |
traits::set_bits(x,a); | |
return x; | |
} | |
//------------------------------------------------------------------------------ | |
} // namespace math | |
} // namespace spirit | |
} // namespace boost | |
#endif |