LeviLamina
Loading...
Searching...
No Matches
SharedCounter.h
1#pragma once
2
3#include "mc/_HeaderOutputPredefine.h"
4
5template <typename T>
7public:
8 constexpr explicit SharedCounter(T* p = nullptr) : ptr(p), share_count(1), weak_count(0) {}
9
10 constexpr void addShareCount() { share_count++; }
11
12 constexpr void addWeakCount() { weak_count++; }
13
14 constexpr int getShareCount() const { return share_count.load(); }
15
16 constexpr int getWeakCount() const { return weak_count.load(); }
17
18 constexpr T* get() const { return ptr; }
19
20 constexpr void release() {
21 if (--share_count == 0) {
22 delete ptr;
23 ptr = nullptr;
24 if (weak_count == 0) {
25 delete this;
26 }
27 }
28 }
29
30 constexpr void releaseWeak() {
31 if (--weak_count == 0 && share_count == 0) {
32 delete this;
33 }
34 }
35
36private:
37 T* ptr;
38 std::atomic_int share_count;
39 std::atomic_int weak_count;
40};
Definition SharedCounter.h:6