diff --git a/include/rcp.h b/include/rcp.h index 68334f7..2231da8 100644 --- a/include/rcp.h +++ b/include/rcp.h @@ -119,6 +119,11 @@ public: other.ptr = nullptr; } + int use_count() const + { + return ptr ? ptr->rcp_count() : 0; + } + void swap(rcp & other) noexcept { T * tmp = ptr; @@ -232,6 +237,10 @@ rcp rcp_dynamic_cast(rcp && other) delete this; \ } \ } \ + int rcp_count() const \ + { \ + return ref_count.load(std::memory_order_relaxed); \ + } \ private: \ mutable std::atomic ref_count{0}; \ rcp_managed(classname) diff --git a/tests.cpp b/tests.cpp index 6395536..9024c84 100644 --- a/tests.cpp +++ b/tests.cpp @@ -314,6 +314,20 @@ protected: ~Counter() { external_destruct++; } }; +void test_use_count() +{ + MyB a = MyB::create(1, 2); + assert(a.use_count() == 1); + { + MyB b = a; + assert(a.use_count() == 2); + assert(b.use_count() == 2); + } + assert(a.use_count() == 1); + MyB empty; + assert(empty.use_count() == 0); +} + void test_swap() { MyB a = MyB::create(1, 2); @@ -368,6 +382,7 @@ int main(int argc, char * argv[]) test_dynamic_cast_failure(); test_dynamic_cast_move_success(); test_dynamic_cast_move_failure(); + test_use_count(); test_swap(); test_hash(); test_external_class();