1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: gfx_GfxObject.h 4 5 Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Revision: 22771 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NW_GFX_GFXOBJECT_H_ 17 #define NW_GFX_GFXOBJECT_H_ 18 19 #include <nw/types.h> 20 #include <nw/os/os_Memory.h> 21 #include <nw/ut/ut_MovePtr.h> 22 #include <nw/ut/ut_Inlines.h> 23 24 namespace nw { 25 namespace gfx { 26 27 class GfxObject; 28 29 //--------------------------------------------------------------------------- 30 //! @brief グラフィックス関連の各種オブジェクトの基底クラスです。 31 //! 32 //! アロケータからメモリを確保、解放するしくみを提供します。 33 //! このクラスを継承したクラスを破棄するには、Destroy メソッドを用いて 34 //! 破棄してください。 35 //--------------------------------------------------------------------------- 36 class GfxObject 37 { 38 public: 39 //---------------------------------------- 40 //! @name 作成/破棄 41 //@{ 42 43 //! オブジェクトを破棄します。 Destroy()44 void Destroy() { this->~GfxObject(); m_Allocator.Free( this ); } 45 46 //@} 47 48 protected: 49 //---------------------------------------- 50 //! @name 作成/破棄 51 //@{ 52 53 //! new 演算子のオーバーロードです。 54 //! 55 //! :private new(size_t,void * buf)56 static void* operator new( size_t, void* buf ) NW_NO_THROW { return buf; } 57 58 //! delete 演算子のオーバーロードです。 59 //! 60 //! :private delete(void *)61 static void operator delete( void* ) NW_NO_THROW {} 62 63 #ifdef NW_COMPILER_MSVC 64 //! delete 演算子のオーバーロードです。 65 //! 66 //! :private delete(void *,void *)67 static void operator delete( void*, void* ) NW_NO_THROW {} 68 #endif 69 //@} 70 71 //---------------------------------------- 72 //! @name コンストラクタ/デストラクタ 73 //@{ 74 75 //! コンストラクタです。 76 //! 77 //! :private GfxObject(nw::os::IAllocator * allocator)78 GfxObject( nw::os::IAllocator* allocator ) 79 : m_Allocator( *allocator ) 80 { 81 NW_NULL_ASSERT( allocator ); 82 } 83 84 //! デストラクタです。 85 //! 86 //! :private ~GfxObject()87 virtual ~GfxObject() {} 88 89 //@} 90 91 //---------------------------------------- 92 //! @name アロケータ 93 //@{ 94 95 //! アロケータを取得します。 96 //! 97 //! :private GetAllocator()98 nw::os::IAllocator& GetAllocator() { return m_Allocator; } 99 100 //@} 101 102 private: 103 nw::os::IAllocator& m_Allocator; 104 }; 105 106 using ut::SafeDestroy; 107 using ut::SafeDestroyer; 108 using ut::SafeDestroyAll; 109 110 //! @name GfxObject関連 111 //@{ 112 113 //--------------------------------------------------------------------------- 114 //! @brief MovePtr の GfxObject 用デリータークラスです。 115 //--------------------------------------------------------------------------- 116 class GfxDeleter 117 { 118 public: 119 //! @brief コンストラクタです。 GfxDeleter()120 GfxDeleter() 121 : m_HasOwnership(true) 122 {} 123 124 //! @brief コンストラクタです。 125 //! 126 //! @param[in] hasOwnership false を指定するとこのデリーターは GfxObject を破棄しません。 GfxDeleter(bool hasOwnership)127 GfxDeleter(bool hasOwnership) 128 : m_HasOwnership(hasOwnership) 129 {} 130 131 //! GfxObject を破棄します。 operator()132 void operator() (GfxObject* object) 133 { 134 if (m_HasOwnership) 135 { 136 object->Destroy(); 137 } 138 } 139 140 private: 141 bool m_HasOwnership; 142 }; 143 144 //@} 145 146 //--------------------------------------------------------------------------- 147 //! @brief GfxObject 用の MovePtr ラップクラスです。 148 //--------------------------------------------------------------------------- 149 template<typename TObject> 150 class GfxPtr 151 { 152 public: 153 typedef ut::MovePtr<TObject, GfxDeleter> GfxMovePtr; 154 typedef typename GfxMovePtr::element_type element_type; 155 typedef typename GfxMovePtr::SafeBool SafeBool; 156 157 //---------------------------------------- 158 //! @name コンストラクタ/デストラクタ 159 //@{ 160 161 //! コンストラクタです。 GfxPtr()162 GfxPtr() : m_MovePtr() {} 163 164 //! コピーコンストラクタです。コピー元から要素を移動します。 GfxPtr(const GfxPtr & pointer)165 GfxPtr(const GfxPtr& pointer) 166 : m_MovePtr(const_cast<GfxPtr*>(&pointer)->m_MovePtr) {} 167 168 //! コンストラクタです。 169 template<typename TTObject> GfxPtr(TTObject * pointer)170 explicit GfxPtr(TTObject* pointer) 171 : m_MovePtr(pointer) {} 172 173 //! コンストラクタです。 174 //! 175 //! hasOwnership に false を指定すると、この GfxPtr インスタンスを破棄するときに 176 //! object の破棄を行いません。 177 //! 178 //! @param[in] pointer 設定するオブジェクトです。 179 //! @param[in] hasOwnership 所有権を持つかを指定します。 180 template<typename TTObject> GfxPtr(TTObject * pointer,bool hasOwnership)181 GfxPtr(TTObject* pointer, bool hasOwnership) 182 : m_MovePtr(pointer, GfxDeleter(hasOwnership)) {} 183 184 //! コンストラクタです。 185 template<typename TTObject, typename TTDeleter> GfxPtr(ut::internal::MoveSource<ut::MovePtr<TTObject,TTDeleter>> source)186 GfxPtr(ut::internal::MoveSource< ut::MovePtr<TTObject, TTDeleter> > source) 187 : m_MovePtr(source) {} 188 189 190 //! @brief デストラクタです。 ~GfxPtr()191 ~GfxPtr() {} 192 193 GfxPtr& operator=(GfxPtr<TObject> rhs) 194 { 195 m_MovePtr.operator=(rhs.m_MovePtr); 196 return *this; 197 } 198 Get()199 element_type* Get() const { return m_MovePtr.Get(); } 200 element_type& operator*() const { return *m_MovePtr; } 201 element_type* operator->() const { return m_MovePtr.operator->(); } 202 element_type& operator[](std::size_t i) const { return m_MovePtr[i]; } Release()203 element_type* Release() { return m_MovePtr.Release(); } 204 Reset()205 void Reset() { m_MovePtr.Reset(); } 206 207 template<typename TTObject> Reset(TTObject * object)208 void Reset(TTObject* object) { GfxPtr(object).Swap(*this); } 209 210 //! @brief オブジェクトを設定します。 211 //! 212 //! hasOwnership に false を指定すると、この GfxPtr インスタンスを破棄するときに 213 //! object の破棄を行いません。 214 //! 215 //! @param[in] object 設定するオブジェクトです。 216 //! @param[in] hasOwnership 所有権を持つかを指定します。 217 template<typename TTObject> Reset(TTObject * object,bool hasOwnership)218 void Reset(TTObject* object, bool hasOwnership) 219 { 220 GfxPtr(object, hasOwnership).Swap(*this); 221 } 222 SafeBool()223 operator SafeBool() const { return m_MovePtr.operator SafeBool(); } 224 Swap(GfxPtr & pointer)225 void Swap(GfxPtr& pointer) { m_MovePtr.Swap(pointer.m_MovePtr); } 226 GetDeleter()227 typename GfxMovePtr::deleter_reference GetDeleter() { return m_MovePtr.GetDeleter(); } GetDeleter()228 typename GfxMovePtr::deleter_const_reference GetDeleter() const { return m_MovePtr.GetDeleter(); } 229 230 private: 231 GfxMovePtr m_MovePtr; 232 //@} 233 }; 234 235 } // namespace gfx 236 } // namespace nw 237 238 #endif // NW_GFX_GFXOBJECT_H_ 239