#include <darwintest.h> #include <darwintest_utils.h> #include <stdio.h> #include <assert.h> #include <typeinfo> #if 0 # define OSPTR_LOG T_LOG #elif 0 # define OSPTR_LOG printf #else # define OSPTR_LOG(x...) do { } while(0) #endif T_GLOBAL_META( T_META_NAMESPACE("osptr"), T_META_CHECK_LEAKS(false), T_META_RUN_CONCURRENTLY(true) ); class OSMetaClassBase { public: virtual void retain() const { } virtual void release() const { } virtual void taggedRetain(void *tag) const { } virtual void taggedRelease(void *tag) const { } static void *type_id; }; void *OSMetaClassBase::type_id; #define OSTypeAlloc(T) new T #define OSTypeID(T) T::type_id #include <libkern/c++/OSPtr.h> class Base : public OSMetaClassBase { public: Base() : OSMetaClassBase() { } }; class Derived : public Base { public: Derived() : Base() { } }; typedef OSPtr<Base> BasePtr; typedef OSPtr<Derived> DerivedPtr; T_DECL(dumb_osptr, "Dumb OSPtrs work") { BasePtr x = nullptr; T_ASSERT_EQ_PTR(x, nullptr, NULL); T_ASSERT_TRUE(typeid(BasePtr) == typeid(Base *), NULL); T_ASSERT_TRUE(typeid(DerivedPtr) == typeid(Derived *), NULL); OSTaggedPtr<Base, Base> y = nullptr; OSTaggedPtr<Derived, Base> z = nullptr; T_ASSERT_EQ_PTR(y, nullptr, NULL); T_ASSERT_TRUE(typeid(y) == typeid(Base *), NULL); T_ASSERT_TRUE(typeid(z) == typeid(Derived *), NULL); }