/////////////////////////////////////////////////////////////////////////////// // Copyright 2017 John Maddock // 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_MATH_ATOMIC_DETAIL_HPP #define BOOST_MATH_ATOMIC_DETAIL_HPP #include #include #ifdef BOOST_HAS_THREADS #ifndef BOOST_NO_CXX11_HDR_ATOMIC # include # define BOOST_MATH_ATOMIC_NS std namespace boost { namespace math { namespace detail { #if ATOMIC_INT_LOCK_FREE == 2 typedef std::atomic atomic_counter_type; typedef std::atomic atomic_unsigned_type; typedef int atomic_integer_type; typedef unsigned atomic_unsigned_integer_type; #elif ATOMIC_SHORT_LOCK_FREE == 2 typedef std::atomic atomic_counter_type; typedef std::atomic atomic_unsigned_type; typedef short atomic_integer_type; typedef unsigned short atomic_unsigned_type; #elif ATOMIC_LONG_LOCK_FREE == 2 typedef std::atomic atomic_unsigned_integer_type; typedef std::atomic atomic_unsigned_type; typedef unsigned long atomic_unsigned_type; typedef long atomic_integer_type; #elif ATOMIC_LLONG_LOCK_FREE == 2 typedef std::atomic atomic_unsigned_integer_type; typedef std::atomic atomic_unsigned_type; typedef long long atomic_integer_type; typedef unsigned long long atomic_unsigned_integer_type; #else # define BOOST_MATH_NO_ATOMIC_INT #endif } }} #else // BOOST_NO_CXX11_HDR_ATOMIC // // We need Boost.Atomic, but on any platform that supports auto-linking we do // not need to link against a separate library: // #define BOOST_ATOMIC_NO_LIB #include # define BOOST_MATH_ATOMIC_NS boost namespace boost{ namespace math{ namespace detail{ // // We need a type to use as an atomic counter: // #if BOOST_ATOMIC_INT_LOCK_FREE == 2 typedef boost::atomic atomic_counter_type; typedef boost::atomic atomic_unsigned_type; typedef int atomic_integer_type; typedef unsigned atomic_unsigned_integer_type; #elif BOOST_ATOMIC_SHORT_LOCK_FREE == 2 typedef boost::atomic atomic_counter_type; typedef boost::atomic atomic_unsigned_type; typedef short atomic_integer_type; typedef unsigned short atomic_unsigned_integer_type; #elif BOOST_ATOMIC_LONG_LOCK_FREE == 2 typedef boost::atomic atomic_counter_type; typedef boost::atomic atomic_unsigned_type; typedef long atomic_integer_type; typedef unsigned long atomic_unsigned_integer_type; #elif BOOST_ATOMIC_LLONG_LOCK_FREE == 2 typedef boost::atomic atomic_counter_type; typedef boost::atomic atomic_unsigned_type; typedef long long atomic_integer_type; typedef unsigned long long atomic_unsigned_integer_type; #else # define BOOST_MATH_NO_ATOMIC_INT #endif }}} // namespaces #endif // BOOST_NO_CXX11_HDR_ATOMIC #else // BOOST_HAS_THREADS # define BOOST_MATH_NO_ATOMIC_INT #endif // BOOST_HAS_THREADS #endif // BOOST_MATH_ATOMIC_DETAIL_HPP