1#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_ATOMIC_HPP_INCLUDED
2#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_ATOMIC_HPP_INCLUDED
3
4// boost/detail/atomic_count_gcc_atomic.hpp
5//
6// atomic_count for g++ 4.7+
7//
8// Copyright 2007, 2020 Peter Dimov
9//
10// Distributed under the Boost Software License, Version 1.0.
11// https://www.boost.org/LICENSE_1_0.txt
12
13#include <boost/cstdint.hpp>
14
15#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
16
17#include <boost/config/pragma_message.hpp>
18BOOST_PRAGMA_MESSAGE("Using __atomic atomic_count")
19
20#endif
21
22namespace boost
23{
24
25namespace detail
26{
27
28class atomic_count
29{
30public:
31
32 explicit atomic_count( long v ): value_( static_cast< boost::int_least32_t >( v ) )
33 {
34 }
35
36 long operator++()
37 {
38 return __atomic_add_fetch( &value_, +1, __ATOMIC_ACQ_REL );
39 }
40
41 long operator--()
42 {
43 return __atomic_add_fetch( &value_, -1, __ATOMIC_ACQ_REL );
44 }
45
46 operator long() const
47 {
48 return __atomic_load_n( &value_, __ATOMIC_ACQUIRE );
49 }
50
51private:
52
53 atomic_count(atomic_count const &);
54 atomic_count & operator=(atomic_count const &);
55
56 boost::int_least32_t value_;
57};
58
59} // namespace detail
60
61} // namespace boost
62
63#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_ATOMIC_HPP_INCLUDED
64