aboutsummaryrefslogtreecommitdiff
path: root/cpp/src/sfntly/port/refcount.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/sfntly/port/refcount.h')
-rw-r--r--cpp/src/sfntly/port/refcount.h21
1 files changed, 9 insertions, 12 deletions
diff --git a/cpp/src/sfntly/port/refcount.h b/cpp/src/sfntly/port/refcount.h
index eed5162..6353b08 100644
--- a/cpp/src/sfntly/port/refcount.h
+++ b/cpp/src/sfntly/port/refcount.h
@@ -99,22 +99,18 @@
namespace sfntly {
+template <typename T>
+class Ptr;
+
class RefCount {
public:
// Make gcc -Wnon-virtual-dtor happy.
virtual ~RefCount() {}
- virtual size_t AddRef() const = 0;
- virtual size_t Release() const = 0;
-};
-
-template <typename T>
-class NoAddRefRelease : public T {
- public:
- NoAddRefRelease();
- ~NoAddRefRelease();
-
private:
+ template <typename T>
+ friend class Ptr;
+
virtual size_t AddRef() const = 0;
virtual size_t Release() const = 0;
};
@@ -142,6 +138,7 @@ class RefCounted : virtual public RefCount {
return *this;
}
+ private:
virtual size_t AddRef() const {
size_t new_count = AtomicIncrement(&ref_count_);
DEBUG_OUTPUT("A ");
@@ -224,8 +221,8 @@ class Ptr {
return *p_; // It can throw!
}
- NoAddRefRelease<T>* operator->() const {
- return (NoAddRefRelease<T>*)p_; // It can throw!
+ T* operator->() const {
+ return p_; // It can throw!
}
bool operator!() const {