FCT
载入中...
搜索中...
未找到
RefCount.h
浏览该文件的文档.
1#pragma once
2#include<atomic>
4namespace FCT {
5 class RefCount {
6 public:
8 RefCount(size_t refCount) : m_refCount(refCount) {}
9 virtual ~RefCount() {};
10 void addRef() {
11 ++m_refCount;
12 }
13 void release() {
14 --m_refCount;
15 if (m_refCount)
16 return;
17 deleteThis();
18 }
19 size_t count() {
20 return m_refCount;
21 }
22 operator bool() const
23 {
24 return m_refCount > 0;
25 }
26 protected:
27 virtual void deleteThis() {
28 FCT_DELETE(this);
29 }
30 std::atomic<size_t> m_refCount;
31 };
32
49 template<typename T>
51 public:
52 using DeleterType = std::function<void(T*)>;
53
54 void setDeleter(DeleterType deleter) {
55 m_deleter = std::move(deleter);
56 }
57
58 template<typename Func>
59 void setDeleterFunc(Func&& func) {
60 m_deleter = [f = std::forward<Func>(func)](T* ptr) { f(ptr); };
61 }
62
63 protected:
64 bool applyDeleter(T* ptr) {
65 if (m_deleter) {
66 m_deleter(ptr);
67 return true;
68 }
69 return false;
70 }
71
72 private:
74 };
75
82 template<typename T, typename U = T>
83 struct IsDeletableTrait : std::is_base_of<DeletableTrait<U>, T> {};
84 inline void safeAddRef(RefCount* obj) {
85 if (obj) obj->addRef();
86 }
87 inline void safeRelease(RefCount*& obj) {
88 if (obj) obj->release();
89 obj = nullptr;
90 }
91#define FCT_SAFE_RELEASE(obj) if (obj) obj->release(); obj = nullptr;
92#define FCT_SAFE_ADDREF(p) if (p) { p->addRef(); }
93}
#define FCT_DELETE(args)
用于自定义对象销毁行为
std::function< void(T *)> DeleterType
void setDeleter(DeleterType deleter)
bool applyDeleter(T *ptr)
void setDeleterFunc(Func &&func)
virtual void deleteThis()
std::atomic< size_t > m_refCount
RefCount(size_t refCount)
virtual ~RefCount()
void safeRelease(RefCount *&obj)
void safeAddRef(RefCount *obj)