diff DEPENDENCIES/generic/include/boost/spirit/home/support/detail/sign.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/support/detail/sign.hpp	Tue Aug 05 11:11:38 2014 +0100
@@ -0,0 +1,71 @@
+/*=============================================================================
+    Copyright (c) 2001-2011 Joel de Guzman
+    Copyright (c) 2001-2011 Hartmut Kaiser
+    http://spirit.sourceforge.net/
+
+    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(SPIRIT_SIGN_MAR_11_2009_0734PM)
+#define SPIRIT_SIGN_MAR_11_2009_0734PM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/version.hpp>
+#if BOOST_VERSION < 104000 
+#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
+#include <boost/spirit/home/support/detail/math/signbit.hpp>
+#else
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/special_functions/sign.hpp>
+#endif
+
+namespace boost { namespace spirit { namespace detail
+{
+#if BOOST_VERSION < 104000
+    // signbit(-NAN) is broken for versions of Boost earlier than 1.40.0
+    // This routine has been taken and adapted from Johan Rade's fp_traits 
+    // library
+    template<typename T> 
+    inline bool (signbit)(T x)
+    {
+        return (boost::spirit::math::signbit)(x);
+    }
+
+    template<typename T> 
+    inline T (changesign)(T x)
+    {
+        return (boost::spirit::math::changesign)(x);
+    }
+#else
+    template<typename T> 
+    inline bool (signbit)(T x)
+    {
+        return (boost::math::signbit)(x) ? true : false;
+    }
+
+    // This routine has been taken and adapted from Johan Rade's fp_traits 
+    // library
+    template<typename T> 
+    inline T (changesign)(T x)
+    {
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && !defined(BOOST_MATH_DISABLE_STD_FPCLASSIFY)
+        return -x;
+#else
+        typedef typename math::detail::fp_traits<T>::type traits_type;
+
+        typename traits_type::bits a;
+        traits_type::get_bits(x, a);
+        a ^= traits_type::sign;
+        traits_type::set_bits(x, a);
+        return x;
+#endif
+    }
+#endif
+
+}}}
+
+#endif