1 //
2 // AtomicCounter.h
3 //
4 // Library: Foundation
5 // Package: Core
6 // Module:  AtomicCounter
7 //
8 // Definition of the AtomicCounter class.
9 //
10 // Copyright (c) 2009, Applied Informatics Software Engineering GmbH.
11 // and Contributors.
12 //
13 // SPDX-License-Identifier:	BSL-1.0
14 //
15 
16 
17 #ifndef Foundation_AtomicCounter_INCLUDED
18 #define Foundation_AtomicCounter_INCLUDED
19 
20 
21 #include "Poco/Foundation.h"
22 #include <atomic>
23 
24 
25 namespace Poco {
26 
27 
28 class Foundation_API AtomicCounter
29 	/// This class implements a simple counter, which
30 	/// provides atomic operations that are safe to
31 	/// use in a multithreaded environment.
32 	///
33 	/// Typical usage of AtomicCounter is for implementing
34 	/// reference counting and similar functionality.
35 {
36 public:
37 	typedef int ValueType; /// The underlying integer type.
38 
39 	AtomicCounter();
40 		/// Creates a new AtomicCounter and initializes it to zero.
41 
42 	explicit AtomicCounter(ValueType initialValue);
43 		/// Creates a new AtomicCounter and initializes it with
44 		/// the given value.
45 
46 	AtomicCounter(const AtomicCounter& counter);
47 		/// Creates the counter by copying another one.
48 
49 	~AtomicCounter();
50 		/// Destroys the AtomicCounter.
51 
52 	AtomicCounter& operator = (const AtomicCounter& counter);
53 		/// Assigns the value of another AtomicCounter.
54 
55 	AtomicCounter& operator = (ValueType value);
56 		/// Assigns a value to the counter.
57 
58 	operator ValueType () const;
59 		/// Converts the AtomicCounter to ValueType.
60 
61 	ValueType value() const;
62 		/// Returns the value of the counter.
63 
64 	ValueType operator ++ (); // prefix
65 		/// Increments the counter and returns the result.
66 
67 	ValueType operator ++ (int); // postfix
68 		/// Increments the counter and returns the previous value.
69 
70 	ValueType operator -- (); // prefix
71 		/// Decrements the counter and returns the result.
72 
73 	ValueType operator -- (int); // postfix
74 		/// Decrements the counter and returns the previous value.
75 
76 	bool operator ! () const;
77 		/// Returns true if the counter is zero, false otherwise.
78 
79 private:
80 	std::atomic<int> _counter;
81 };
82 
83 
84 //
85 // inlines
86 //
87 
ValueType()88 inline AtomicCounter::operator AtomicCounter::ValueType () const
89 {
90 	return _counter.load();
91 }
92 
93 
value()94 inline AtomicCounter::ValueType AtomicCounter::value() const
95 {
96 	return _counter.load();
97 }
98 
99 
100 inline AtomicCounter::ValueType AtomicCounter::operator ++ () // prefix
101 {
102 	return ++_counter;
103 }
104 
105 
106 inline AtomicCounter::ValueType AtomicCounter::operator ++ (int) // postfix
107 {
108 	return _counter++;
109 }
110 
111 
112 inline AtomicCounter::ValueType AtomicCounter::operator -- () // prefix
113 {
114 	return --_counter;
115 }
116 
117 
118 inline AtomicCounter::ValueType AtomicCounter::operator -- (int) // postfix
119 {
120 	return _counter--;
121 }
122 
123 
124 inline bool AtomicCounter::operator ! () const
125 {
126 	return _counter.load() == 0;
127 }
128 
129 
130 } // namespace Poco
131 
132 
133 #endif // Foundation_AtomicCounter_INCLUDED
134