• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 ///////////////////////////////////////////////////////////////////////////////
2 //  Copyright 2017 John Maddock
3 //  Distributed under the Boost
4 //  Software License, Version 1.0. (See accompanying file
5 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 
7 #ifndef BOOST_MATH_ATOMIC_DETAIL_HPP
8 #define BOOST_MATH_ATOMIC_DETAIL_HPP
9 
10 #include <boost/config.hpp>
11 #include <boost/math/tools/cxx03_warn.hpp>
12 
13 #ifdef BOOST_HAS_THREADS
14 
15 #ifndef BOOST_NO_CXX11_HDR_ATOMIC
16 #  include <atomic>
17 #  define BOOST_MATH_ATOMIC_NS std
18 namespace boost {
19    namespace math {
20       namespace detail {
21 #if ATOMIC_INT_LOCK_FREE == 2
22          typedef std::atomic<int> atomic_counter_type;
23          typedef std::atomic<unsigned> atomic_unsigned_type;
24          typedef int atomic_integer_type;
25          typedef unsigned atomic_unsigned_integer_type;
26 #elif ATOMIC_SHORT_LOCK_FREE == 2
27          typedef std::atomic<short> atomic_counter_type;
28          typedef std::atomic<unsigned short> atomic_unsigned_type;
29          typedef short atomic_integer_type;
30          typedef unsigned short atomic_unsigned_type;
31 #elif ATOMIC_LONG_LOCK_FREE == 2
32          typedef std::atomic<long> atomic_unsigned_integer_type;
33          typedef std::atomic<unsigned long> atomic_unsigned_type;
34          typedef unsigned long atomic_unsigned_type;
35          typedef long atomic_integer_type;
36 #elif ATOMIC_LLONG_LOCK_FREE == 2
37          typedef std::atomic<long long> atomic_unsigned_integer_type;
38          typedef std::atomic<unsigned long long> atomic_unsigned_type;
39          typedef long long atomic_integer_type;
40          typedef unsigned long long atomic_unsigned_integer_type;
41 #else
42 #  define BOOST_MATH_NO_ATOMIC_INT
43 #endif
44       }
45    }}
46 #else // BOOST_NO_CXX11_HDR_ATOMIC
47 //
48 // We need Boost.Atomic, but on any platform that supports auto-linking we do
49 // not need to link against a separate library:
50 //
51 #define BOOST_ATOMIC_NO_LIB
52 #include <boost/atomic.hpp>
53 #  define BOOST_MATH_ATOMIC_NS boost
54 
55 namespace boost{ namespace math{ namespace detail{
56 
57 //
58 // We need a type to use as an atomic counter:
59 //
60 #if BOOST_ATOMIC_INT_LOCK_FREE == 2
61 typedef boost::atomic<int> atomic_counter_type;
62 typedef boost::atomic<unsigned> atomic_unsigned_type;
63 typedef int atomic_integer_type;
64 typedef unsigned atomic_unsigned_integer_type;
65 #elif BOOST_ATOMIC_SHORT_LOCK_FREE == 2
66 typedef boost::atomic<short> atomic_counter_type;
67 typedef boost::atomic<unsigned short> atomic_unsigned_type;
68 typedef short atomic_integer_type;
69 typedef unsigned short atomic_unsigned_integer_type;
70 #elif BOOST_ATOMIC_LONG_LOCK_FREE == 2
71 typedef boost::atomic<long> atomic_counter_type;
72 typedef boost::atomic<unsigned long> atomic_unsigned_type;
73 typedef long atomic_integer_type;
74 typedef unsigned long atomic_unsigned_integer_type;
75 #elif BOOST_ATOMIC_LLONG_LOCK_FREE == 2
76 typedef boost::atomic<long long> atomic_counter_type;
77 typedef boost::atomic<unsigned long long> atomic_unsigned_type;
78 typedef long long atomic_integer_type;
79 typedef unsigned long long atomic_unsigned_integer_type;
80 #else
81 #  define BOOST_MATH_NO_ATOMIC_INT
82 #endif
83 
84 }}} // namespaces
85 
86 #endif  // BOOST_NO_CXX11_HDR_ATOMIC
87 
88 #else // BOOST_HAS_THREADS
89 
90 #  define BOOST_MATH_NO_ATOMIC_INT
91 
92 #endif // BOOST_HAS_THREADS
93 
94 #endif // BOOST_MATH_ATOMIC_DETAIL_HPP
95