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
18namespace 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
55namespace 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
61typedef boost::atomic<int> atomic_counter_type;
62typedef boost::atomic<unsigned> atomic_unsigned_type;
63typedef int atomic_integer_type;
64typedef unsigned atomic_unsigned_integer_type;
65#elif BOOST_ATOMIC_SHORT_LOCK_FREE == 2
66typedef boost::atomic<short> atomic_counter_type;
67typedef boost::atomic<unsigned short> atomic_unsigned_type;
68typedef short atomic_integer_type;
69typedef unsigned short atomic_unsigned_integer_type;
70#elif BOOST_ATOMIC_LONG_LOCK_FREE == 2
71typedef boost::atomic<long> atomic_counter_type;
72typedef boost::atomic<unsigned long> atomic_unsigned_type;
73typedef long atomic_integer_type;
74typedef unsigned long atomic_unsigned_integer_type;
75#elif BOOST_ATOMIC_LLONG_LOCK_FREE == 2
76typedef boost::atomic<long long> atomic_counter_type;
77typedef boost::atomic<unsigned long long> atomic_unsigned_type;
78typedef long long atomic_integer_type;
79typedef 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

source code of include/boost/math/tools/atomic.hpp