#ifndef UNITYSCOPE_SMARTPTR_HELPER_H #define UNITYSCOPE_SMARTPTR_HELPER_H #include #include "shim.h" namespace gounityscopes { namespace internal { template inline void init_const_ptr(SharedPtrData data, std::shared_ptr v) { typedef std::shared_ptr Ptr; static_assert(sizeof(SharedPtrData) >= sizeof(Ptr), "std::shared_ptr is larger than expected"); Ptr *ptr = new(reinterpret_cast(data)) Ptr(); *ptr = v; } template inline void init_ptr(SharedPtrData data, std::shared_ptr v) { typedef std::shared_ptr Ptr; static_assert(sizeof(SharedPtrData) >= sizeof(Ptr), "std::shared_ptr is larger than expected"); Ptr *ptr = new(reinterpret_cast(data)) Ptr(); *ptr = v; } template inline std::shared_ptr get_ptr(SharedPtrData data) { typedef std::shared_ptr Ptr; Ptr *ptr = reinterpret_cast(data); return *ptr; } template inline void destroy_ptr(SharedPtrData data) { typedef std::shared_ptr Ptr; if (!(data[0] == 0 && data[1] == 0)) { Ptr *ptr = reinterpret_cast(data); ptr->~Ptr(); } data[0] = data[1] = 0; } template inline void copy_ptr(SharedPtrData dest_data, SharedPtrData src_data) { typedef std::shared_ptr Ptr; Ptr *dest = reinterpret_cast(dest_data); Ptr *src = reinterpret_cast(src_data); *dest = *src; } } } #endif