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