Coverage Report

Created: 2023-12-20 07:15

/src/poco/Foundation/include/Poco/AtomicCounter.h
Line
Count
Source (jump to first uncovered line)
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
88
inline AtomicCounter::operator AtomicCounter::ValueType () const
89
0
{
90
0
  return _counter.load();
91
0
}
92
93
94
inline AtomicCounter::ValueType AtomicCounter::value() const
95
0
{
96
0
  return _counter.load();
97
0
}
98
99
100
inline AtomicCounter::ValueType AtomicCounter::operator ++ () // prefix
101
2.26M
{
102
2.26M
  return ++_counter;
103
2.26M
}
104
105
106
inline AtomicCounter::ValueType AtomicCounter::operator ++ (int) // postfix
107
0
{
108
0
  return _counter++;
109
0
}
110
111
112
inline AtomicCounter::ValueType AtomicCounter::operator -- () // prefix
113
2.34M
{
114
2.34M
  return --_counter;
115
2.34M
}
116
117
118
inline AtomicCounter::ValueType AtomicCounter::operator -- (int) // postfix
119
0
{
120
0
  return _counter--;
121
0
}
122
123
124
inline bool AtomicCounter::operator ! () const
125
0
{
126
0
  return _counter.load() == 0;
127
0
}
128
129
130
} // namespace Poco
131
132
133
#endif // Foundation_AtomicCounter_INCLUDED