namespace stingray_plugin_foundation { #if defined(WINDOWSPC) || defined(XBOXONE) template ComPtr::ComPtr(T* ptr = 0) : _owned(true), _ptr(ptr) { } template ComPtr::ComPtr(const ComPtr& rhs) : _owned(rhs._owned), _ptr(rhs.abandon()) { } template ComPtr::~ComPtr() { if(_owned && _ptr) { _ptr->Release(); } } template ComPtr& ComPtr::operator=(const ComPtr& rhs) { if( this != &rhs ) { if( _ptr != rhs.get() && _owned && _ptr) _ptr->Release(); _owned = rhs._owned; _ptr = rhs.abandon(); } return *this; } template T& ComPtr::operator*() const { return *get(); } template T* ComPtr::operator->() const { return get(); } template T* ComPtr::get() const { return _ptr; } template T* ComPtr::abandon() const { _owned=false; return _ptr; } template T** ComPtr::init_ptr() { if(_owned && _ptr) _ptr->Release(); _ptr=0; _owned=true; return &_ptr; } #endif }