Add rcp::use_count()

This commit is contained in:
Josh Holtrop 2026-02-24 23:42:56 -05:00
parent af0e0d0084
commit d9a9a88a24
2 changed files with 24 additions and 0 deletions

View File

@ -119,6 +119,11 @@ public:
other.ptr = nullptr; other.ptr = nullptr;
} }
int use_count() const
{
return ptr ? ptr->rcp_count() : 0;
}
void swap(rcp & other) noexcept void swap(rcp & other) noexcept
{ {
T * tmp = ptr; T * tmp = ptr;
@ -232,6 +237,10 @@ rcp<T> rcp_dynamic_cast(rcp<U> && other)
delete this; \ delete this; \
} \ } \
} \ } \
int rcp_count() const \
{ \
return ref_count.load(std::memory_order_relaxed); \
} \
private: \ private: \
mutable std::atomic<int> ref_count{0}; \ mutable std::atomic<int> ref_count{0}; \
rcp_managed(classname) rcp_managed(classname)

View File

@ -314,6 +314,20 @@ protected:
~Counter() { external_destruct++; } ~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() void test_swap()
{ {
MyB a = MyB::create(1, 2); MyB a = MyB::create(1, 2);
@ -368,6 +382,7 @@ int main(int argc, char * argv[])
test_dynamic_cast_failure(); test_dynamic_cast_failure();
test_dynamic_cast_move_success(); test_dynamic_cast_move_success();
test_dynamic_cast_move_failure(); test_dynamic_cast_move_failure();
test_use_count();
test_swap(); test_swap();
test_hash(); test_hash();
test_external_class(); test_external_class();