1#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
2#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
3
4// MS compatible compilers support #pragma once
5
6#if defined(_MSC_VER) && (_MSC_VER >= 1020)
7# pragma once
8#endif
9
10//
11// boost/detail/atomic_count.hpp - thread/SMP safe reference counter
12//
13// Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
14// Copyright (c) 2013 Peter Dimov
15//
16// Distributed under the Boost Software License, Version 1.0.
17// See accompanying file LICENSE_1_0.txt or copy at
18// http://www.boost.org/LICENSE_1_0.txt
19//
20// typedef <implementation-defined> boost::detail::atomic_count;
21//
22// atomic_count a(n);
23//
24// (n is convertible to long)
25//
26// Effects: Constructs an atomic_count with an initial value of n
27//
28// a;
29//
30// Returns: (long) the current value of a
31// Memory Ordering: acquire
32//
33// ++a;
34//
35// Effects: Atomically increments the value of a
36// Returns: (long) the new value of a
37// Memory Ordering: acquire/release
38//
39// --a;
40//
41// Effects: Atomically decrements the value of a
42// Returns: (long) the new value of a
43// Memory Ordering: acquire/release
44//
45
46#include <boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp>
47#include <boost/smart_ptr/detail/sp_has_sync_intrinsics.hpp>
48#include <boost/config.hpp>
49
50#if defined( BOOST_AC_DISABLE_THREADS )
51# include <boost/smart_ptr/detail/atomic_count_nt.hpp>
52
53#elif defined( BOOST_AC_USE_STD_ATOMIC )
54# include <boost/smart_ptr/detail/atomic_count_std_atomic.hpp>
55
56#elif defined( BOOST_AC_USE_SPINLOCK )
57# include <boost/smart_ptr/detail/atomic_count_spin.hpp>
58
59#elif defined( BOOST_AC_USE_PTHREADS )
60# include <boost/smart_ptr/detail/atomic_count_pt.hpp>
61
62#elif defined( BOOST_SP_DISABLE_THREADS )
63# include <boost/smart_ptr/detail/atomic_count_nt.hpp>
64
65#elif defined( BOOST_SP_USE_STD_ATOMIC )
66# include <boost/smart_ptr/detail/atomic_count_std_atomic.hpp>
67
68#elif defined( BOOST_SP_USE_SPINLOCK )
69# include <boost/smart_ptr/detail/atomic_count_spin.hpp>
70
71#elif defined( BOOST_SP_USE_PTHREADS )
72# include <boost/smart_ptr/detail/atomic_count_pt.hpp>
73
74#elif defined( BOOST_DISABLE_THREADS ) && !defined( BOOST_SP_ENABLE_THREADS ) && !defined( BOOST_DISABLE_WIN32 )
75# include <boost/smart_ptr/detail/atomic_count_nt.hpp>
76
77#elif defined( BOOST_SP_HAS_GCC_INTRINSICS )
78# include <boost/smart_ptr/detail/atomic_count_gcc_atomic.hpp>
79
80#elif !defined( BOOST_NO_CXX11_HDR_ATOMIC )
81# include <boost/smart_ptr/detail/atomic_count_std_atomic.hpp>
82
83#elif defined( BOOST_SP_HAS_SYNC_INTRINSICS )
84# include <boost/smart_ptr/detail/atomic_count_sync.hpp>
85
86#elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) ) && !defined( __PATHSCALE__ )
87# include <boost/smart_ptr/detail/atomic_count_gcc_x86.hpp>
88
89#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
90# include <boost/smart_ptr/detail/atomic_count_win32.hpp>
91
92#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
93# include <boost/smart_ptr/detail/atomic_count_gcc.hpp>
94
95#elif !defined( BOOST_HAS_THREADS )
96# include <boost/smart_ptr/detail/atomic_count_nt.hpp>
97
98#else
99# include <boost/smart_ptr/detail/atomic_count_spin.hpp>
100
101#endif
102
103#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
104