/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_GfxObject.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 22771 $ *---------------------------------------------------------------------------*/ #ifndef NW_GFX_GFXOBJECT_H_ #define NW_GFX_GFXOBJECT_H_ #include #include #include #include namespace nw { namespace gfx { class GfxObject; //--------------------------------------------------------------------------- //! @brief グラフィックス関連の各種オブジェクトの基底クラスです。 //! //! アロケータからメモリを確保、解放するしくみを提供します。 //! このクラスを継承したクラスを破棄するには、Destroy メソッドを用いて //! 破棄してください。 //--------------------------------------------------------------------------- class GfxObject { public: //---------------------------------------- //! @name 作成/破棄 //@{ //! オブジェクトを破棄します。 void Destroy() { this->~GfxObject(); m_Allocator.Free( this ); } //@} protected: //---------------------------------------- //! @name 作成/破棄 //@{ //! new 演算子のオーバーロードです。 //! //! :private static void* operator new( size_t, void* buf ) NW_NO_THROW { return buf; } //! delete 演算子のオーバーロードです。 //! //! :private static void operator delete( void* ) NW_NO_THROW {} #ifdef NW_COMPILER_MSVC //! delete 演算子のオーバーロードです。 //! //! :private static void operator delete( void*, void* ) NW_NO_THROW {} #endif //@} //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! コンストラクタです。 //! //! :private GfxObject( nw::os::IAllocator* allocator ) : m_Allocator( *allocator ) { NW_NULL_ASSERT( allocator ); } //! デストラクタです。 //! //! :private virtual ~GfxObject() {} //@} //---------------------------------------- //! @name アロケータ //@{ //! アロケータを取得します。 //! //! :private nw::os::IAllocator& GetAllocator() { return m_Allocator; } //@} private: nw::os::IAllocator& m_Allocator; }; using ut::SafeDestroy; using ut::SafeDestroyer; using ut::SafeDestroyAll; //! @name GfxObject関連 //@{ //--------------------------------------------------------------------------- //! @brief MovePtr の GfxObject 用デリータークラスです。 //--------------------------------------------------------------------------- class GfxDeleter { public: //! @brief コンストラクタです。 GfxDeleter() : m_HasOwnership(true) {} //! @brief コンストラクタです。 //! //! @param[in] hasOwnership false を指定するとこのデリーターは GfxObject を破棄しません。 GfxDeleter(bool hasOwnership) : m_HasOwnership(hasOwnership) {} //! GfxObject を破棄します。 void operator() (GfxObject* object) { if (m_HasOwnership) { object->Destroy(); } } private: bool m_HasOwnership; }; //@} //--------------------------------------------------------------------------- //! @brief GfxObject 用の MovePtr ラップクラスです。 //--------------------------------------------------------------------------- template class GfxPtr { public: typedef ut::MovePtr GfxMovePtr; typedef typename GfxMovePtr::element_type element_type; typedef typename GfxMovePtr::SafeBool SafeBool; //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! コンストラクタです。 GfxPtr() : m_MovePtr() {} //! コピーコンストラクタです。コピー元から要素を移動します。 GfxPtr(const GfxPtr& pointer) : m_MovePtr(const_cast(&pointer)->m_MovePtr) {} //! コンストラクタです。 template explicit GfxPtr(TTObject* pointer) : m_MovePtr(pointer) {} //! コンストラクタです。 //! //! hasOwnership に false を指定すると、この GfxPtr インスタンスを破棄するときに //! object の破棄を行いません。 //! //! @param[in] pointer 設定するオブジェクトです。 //! @param[in] hasOwnership 所有権を持つかを指定します。 template GfxPtr(TTObject* pointer, bool hasOwnership) : m_MovePtr(pointer, GfxDeleter(hasOwnership)) {} //! コンストラクタです。 template GfxPtr(ut::internal::MoveSource< ut::MovePtr > source) : m_MovePtr(source) {} //! @brief デストラクタです。 ~GfxPtr() {} GfxPtr& operator=(GfxPtr rhs) { m_MovePtr.operator=(rhs.m_MovePtr); return *this; } element_type* Get() const { return m_MovePtr.Get(); } element_type& operator*() const { return *m_MovePtr; } element_type* operator->() const { return m_MovePtr.operator->(); } element_type& operator[](std::size_t i) const { return m_MovePtr[i]; } element_type* Release() { return m_MovePtr.Release(); } void Reset() { m_MovePtr.Reset(); } template void Reset(TTObject* object) { GfxPtr(object).Swap(*this); } //! @brief オブジェクトを設定します。 //! //! hasOwnership に false を指定すると、この GfxPtr インスタンスを破棄するときに //! object の破棄を行いません。 //! //! @param[in] object 設定するオブジェクトです。 //! @param[in] hasOwnership 所有権を持つかを指定します。 template void Reset(TTObject* object, bool hasOwnership) { GfxPtr(object, hasOwnership).Swap(*this); } operator SafeBool() const { return m_MovePtr.operator SafeBool(); } void Swap(GfxPtr& pointer) { m_MovePtr.Swap(pointer.m_MovePtr); } typename GfxMovePtr::deleter_reference GetDeleter() { return m_MovePtr.GetDeleter(); } typename GfxMovePtr::deleter_const_reference GetDeleter() const { return m_MovePtr.GetDeleter(); } private: GfxMovePtr m_MovePtr; //@} }; } // namespace gfx } // namespace nw #endif // NW_GFX_GFXOBJECT_H_