remove ObjectPool
This commit is contained in:
parent
5a877ccf7b
commit
a134a2e952
|
|
@ -16,7 +16,6 @@
|
|||
<ClInclude Include="..\..\src\kiwano\base\Director.h" />
|
||||
<ClInclude Include="..\..\src\kiwano\base\Module.h" />
|
||||
<ClInclude Include="..\..\src\kiwano\base\ObjectBase.h" />
|
||||
<ClInclude Include="..\..\src\kiwano\base\ObjectPool.h" />
|
||||
<ClInclude Include="..\..\src\kiwano\base\RefObject.h" />
|
||||
<ClInclude Include="..\..\src\kiwano\base\RefPtr.h" />
|
||||
<ClInclude Include="..\..\src\kiwano\core\Allocator.h" />
|
||||
|
|
@ -134,7 +133,6 @@
|
|||
<ClCompile Include="..\..\src\kiwano\base\Director.cpp" />
|
||||
<ClCompile Include="..\..\src\kiwano\base\Module.cpp" />
|
||||
<ClCompile Include="..\..\src\kiwano\base\ObjectBase.cpp" />
|
||||
<ClCompile Include="..\..\src\kiwano\base\ObjectPool.cpp" />
|
||||
<ClCompile Include="..\..\src\kiwano\base\RefObject.cpp" />
|
||||
<ClCompile Include="..\..\src\kiwano\core\Allocator.cpp" />
|
||||
<ClCompile Include="..\..\src\kiwano\core\Exception.cpp" />
|
||||
|
|
|
|||
|
|
@ -339,9 +339,6 @@
|
|||
<ClInclude Include="..\..\src\kiwano\utils\ConfigIni.h">
|
||||
<Filter>utils</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\kiwano\base\ObjectPool.h">
|
||||
<Filter>base</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\kiwano\core\Defer.h">
|
||||
<Filter>core</Filter>
|
||||
</ClInclude>
|
||||
|
|
@ -575,9 +572,6 @@
|
|||
<ClCompile Include="..\..\src\kiwano\utils\ConfigIni.cpp">
|
||||
<Filter>utils</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\kiwano\base\ObjectPool.cpp">
|
||||
<Filter>base</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\kiwano\2d\action\Action.cpp">
|
||||
<Filter>2d\action</Filter>
|
||||
</ClCompile>
|
||||
|
|
|
|||
|
|
@ -258,18 +258,18 @@ bool Actor::HandleEvent(Event* evt)
|
|||
{
|
||||
hover_ = true;
|
||||
|
||||
auto hover = new (autogc) MouseHoverEvent;
|
||||
MouseHoverEventPtr hover = new MouseHoverEvent;
|
||||
hover->pos = mouse_evt->pos;
|
||||
HandleEvent(hover);
|
||||
HandleEvent(hover.Get());
|
||||
}
|
||||
else if (hover_ && !contains)
|
||||
{
|
||||
hover_ = false;
|
||||
pressed_ = false;
|
||||
|
||||
auto out = new (autogc) MouseOutEvent;
|
||||
MouseOutEventPtr out = new MouseOutEvent;
|
||||
out->pos = mouse_evt->pos;
|
||||
HandleEvent(out);
|
||||
HandleEvent(out.Get());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -284,10 +284,10 @@ bool Actor::HandleEvent(Event* evt)
|
|||
|
||||
auto mouse_up_evt = dynamic_cast<MouseUpEvent*>(evt);
|
||||
|
||||
auto click = new (autogc) MouseClickEvent;
|
||||
click->pos = mouse_up_evt->pos;
|
||||
click->button = mouse_up_evt->button;
|
||||
HandleEvent(click);
|
||||
MouseClickEventPtr click = new MouseClickEvent;
|
||||
click->pos = mouse_up_evt->pos;
|
||||
click->button = mouse_up_evt->button;
|
||||
HandleEvent(click.Get());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ ActionDelayEntity::ActionDelayEntity(Duration delay)
|
|||
|
||||
ActionDelayEntity* ActionDelayEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionDelayEntity(GetDelay());
|
||||
ActionDelayEntity* ptr = new ActionDelayEntity(GetDelay());
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ ActionGroupEntity* ActionGroupEntity::Clone() const
|
|||
actions.push_back(action->Clone());
|
||||
}
|
||||
}
|
||||
auto ptr = new (autogc) ActionGroupEntity(actions, parallel_);
|
||||
ActionGroupEntity* ptr = new ActionGroupEntity(actions, parallel_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
@ -138,7 +138,7 @@ ActionGroupEntity* ActionGroupEntity::Reverse() const
|
|||
actions.push_back(action->Reverse());
|
||||
}
|
||||
}
|
||||
auto ptr = new (autogc) ActionGroupEntity(actions, parallel_);
|
||||
ActionGroupEntity* ptr = new ActionGroupEntity(actions, parallel_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -170,14 +170,14 @@ void ActionMoveByEntity::UpdateTween(Actor* target, float percent)
|
|||
|
||||
ActionMoveByEntity* ActionMoveByEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionMoveByEntity(GetDuration(), displacement_);
|
||||
ActionMoveByEntity* ptr = new ActionMoveByEntity(GetDuration(), displacement_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
ActionMoveByEntity* ActionMoveByEntity::Reverse() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionMoveByEntity(GetDuration(), -displacement_);
|
||||
ActionMoveByEntity* ptr = new ActionMoveByEntity(GetDuration(), -displacement_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
@ -190,7 +190,7 @@ ActionMoveToEntity::ActionMoveToEntity(Duration duration, const Point& distinati
|
|||
|
||||
ActionMoveToEntity* ActionMoveToEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionMoveToEntity(GetDuration(), distination_);
|
||||
ActionMoveToEntity* ptr = new ActionMoveToEntity(GetDuration(), distination_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
@ -215,14 +215,14 @@ ActionJumpByEntity::ActionJumpByEntity(Duration duration, const Vec2& displaceme
|
|||
|
||||
ActionJumpByEntity* ActionJumpByEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionJumpByEntity(GetDuration(), displacement_, height_, jump_count_);
|
||||
ActionJumpByEntity* ptr = new ActionJumpByEntity(GetDuration(), displacement_, height_, jump_count_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
ActionJumpByEntity* ActionJumpByEntity::Reverse() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionJumpByEntity(GetDuration(), -displacement_, height_, jump_count_);
|
||||
ActionJumpByEntity* ptr = new ActionJumpByEntity(GetDuration(), -displacement_, height_, jump_count_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
@ -259,7 +259,7 @@ ActionJumpToEntity::ActionJumpToEntity(Duration duration, const Point& distinati
|
|||
|
||||
ActionJumpToEntity* ActionJumpToEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionJumpToEntity(GetDuration(), distination_, height_, jump_count_);
|
||||
ActionJumpToEntity* ptr = new ActionJumpToEntity(GetDuration(), distination_, height_, jump_count_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
@ -299,14 +299,14 @@ void ActionScaleByEntity::UpdateTween(Actor* target, float percent)
|
|||
|
||||
ActionScaleByEntity* ActionScaleByEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionScaleByEntity(GetDuration(), delta_x_, delta_y_);
|
||||
ActionScaleByEntity* ptr = new ActionScaleByEntity(GetDuration(), delta_x_, delta_y_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
ActionScaleByEntity* ActionScaleByEntity::Reverse() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionScaleByEntity(GetDuration(), -delta_x_, -delta_y_);
|
||||
ActionScaleByEntity* ptr = new ActionScaleByEntity(GetDuration(), -delta_x_, -delta_y_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
@ -320,7 +320,7 @@ ActionScaleToEntity::ActionScaleToEntity(Duration duration, float scale_x, float
|
|||
|
||||
ActionScaleToEntity* ActionScaleToEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionScaleToEntity(GetDuration(), end_scale_x_, end_scale_y_);
|
||||
ActionScaleToEntity* ptr = new ActionScaleToEntity(GetDuration(), end_scale_x_, end_scale_y_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
@ -360,7 +360,7 @@ void ActionFadeToEntity::UpdateTween(Actor* target, float percent)
|
|||
|
||||
ActionFadeToEntity* ActionFadeToEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionFadeToEntity(GetDuration(), end_val_);
|
||||
ActionFadeToEntity* ptr = new ActionFadeToEntity(GetDuration(), end_val_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
@ -395,14 +395,14 @@ void ActionRotateByEntity::UpdateTween(Actor* target, float percent)
|
|||
|
||||
ActionRotateByEntity* ActionRotateByEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionRotateByEntity(GetDuration(), delta_val_);
|
||||
ActionRotateByEntity* ptr = new ActionRotateByEntity(GetDuration(), delta_val_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
ActionRotateByEntity* ActionRotateByEntity::Reverse() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionRotateByEntity(GetDuration(), -delta_val_);
|
||||
ActionRotateByEntity* ptr = new ActionRotateByEntity(GetDuration(), -delta_val_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
@ -415,7 +415,7 @@ ActionRotateToEntity::ActionRotateToEntity(Duration duration, float rotation)
|
|||
|
||||
ActionRotateToEntity* ActionRotateToEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionRotateToEntity(GetDuration(), end_val_);
|
||||
ActionRotateToEntity* ptr = new ActionRotateToEntity(GetDuration(), end_val_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
@ -438,7 +438,7 @@ ActionCustomEntity::ActionCustomEntity(Duration duration, ActionCustom::TweenFun
|
|||
|
||||
ActionCustomEntity* ActionCustomEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionCustomEntity(GetDuration(), tween_func_);
|
||||
ActionCustomEntity* ptr = new ActionCustomEntity(GetDuration(), tween_func_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,14 +41,14 @@ ActionWalkEntity::ActionWalkEntity(Duration duration, ShapePtr path, bool rotati
|
|||
|
||||
ActionWalkEntity* ActionWalkEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionWalkEntity(GetDuration(), path_, rotating_, start_, end_);
|
||||
ActionWalkEntity* ptr = new ActionWalkEntity(GetDuration(), path_, rotating_, start_, end_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
ActionWalkEntity* ActionWalkEntity::Reverse() const
|
||||
{
|
||||
auto ptr = new (autogc) ActionWalkEntity(GetDuration(), path_, rotating_, end_, start_);
|
||||
ActionWalkEntity* ptr = new ActionWalkEntity(GetDuration(), path_, rotating_, end_, start_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -87,14 +87,14 @@ void AnimationEntity::UpdateTween(Actor* target, float percent)
|
|||
|
||||
AnimationEntity* AnimationEntity::Clone() const
|
||||
{
|
||||
auto ptr = new (autogc) AnimationEntity(GetDuration(), frame_seq_);
|
||||
AnimationEntity* ptr = new AnimationEntity(GetDuration(), frame_seq_);
|
||||
DoClone(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
AnimationEntity* AnimationEntity::Reverse() const
|
||||
{
|
||||
auto ptr = new (autogc) AnimationEntity(GetDuration(), nullptr);
|
||||
AnimationEntity* ptr = new AnimationEntity(GetDuration(), nullptr);
|
||||
DoClone(ptr);
|
||||
|
||||
if (frame_seq_)
|
||||
|
|
|
|||
|
|
@ -1,60 +0,0 @@
|
|||
// Copyright (c) 2016-2018 Kiwano - Nomango
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#include <kiwano/base/ObjectPool.h>
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
|
||||
ObjectPool::ObjectPool()
|
||||
{
|
||||
}
|
||||
|
||||
void ObjectPool::AddObject(RefObject* obj)
|
||||
{
|
||||
if (obj)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
if (!Contains(obj))
|
||||
{
|
||||
objects_.push_back(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool ObjectPool::Contains(RefObject* obj) const
|
||||
{
|
||||
return std::find(objects_.begin(), objects_.end(), obj) != objects_.end();
|
||||
}
|
||||
|
||||
void ObjectPool::Clear()
|
||||
{
|
||||
Vector<RefObject*> copied;
|
||||
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
copied = std::move(objects_);
|
||||
}
|
||||
|
||||
for (auto obj : copied)
|
||||
obj->Release();
|
||||
}
|
||||
|
||||
} // namespace kiwano
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
// Copyright (c) 2016-2018 Kiwano - Nomango
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#pragma once
|
||||
#include <kiwano/core/Singleton.h>
|
||||
#include <kiwano/base/ObjectBase.h>
|
||||
#include <mutex>
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 对象池
|
||||
*/
|
||||
class KGE_API ObjectPool : public Singleton<ObjectPool>
|
||||
{
|
||||
friend Singleton<ObjectPool>;
|
||||
|
||||
public:
|
||||
ObjectPool();
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 添加对象到内存池
|
||||
* @param[in] obj 引用计数对象
|
||||
*/
|
||||
void AddObject(RefObject* obj);
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 判断对象是否在对象池中
|
||||
* @param[in] obj 引用计数对象
|
||||
*/
|
||||
bool Contains(RefObject* obj) const;
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 清空所有对象
|
||||
*/
|
||||
void Clear();
|
||||
|
||||
private:
|
||||
ObjectPool(const ObjectPool&) = delete;
|
||||
|
||||
ObjectPool& operator=(const ObjectPool&) = delete;
|
||||
|
||||
private:
|
||||
std::mutex mutex_;
|
||||
Vector<RefObject*> objects_;
|
||||
};
|
||||
|
||||
} // namespace kiwano
|
||||
|
|
@ -19,15 +19,12 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
#include <kiwano/base/RefObject.h>
|
||||
#include <kiwano/base/ObjectPool.h>
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
|
||||
autogc_t const autogc;
|
||||
|
||||
RefObject::RefObject()
|
||||
: ref_count_(1)
|
||||
: ref_count_(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -47,22 +44,17 @@ void RefObject::Release()
|
|||
}
|
||||
}
|
||||
|
||||
void RefObject::AutoRelease()
|
||||
uint32_t RefObject::GetRefCount() const
|
||||
{
|
||||
ObjectPool::GetInstance().AddObject(this);
|
||||
return ref_count_.load();
|
||||
}
|
||||
|
||||
void* RefObject::operator new(std::size_t size)
|
||||
{
|
||||
return memory::Alloc(size);
|
||||
}
|
||||
|
||||
void* RefObject::operator new(std::size_t size, autogc_t const&)
|
||||
void* RefObject::operator new(size_t size)
|
||||
{
|
||||
void* ptr = memory::Alloc(size);
|
||||
if (ptr)
|
||||
if (!ptr)
|
||||
{
|
||||
ObjectPool::GetInstance().AddObject((ObjectBase*)ptr);
|
||||
throw std::bad_alloc();
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
|
|
@ -72,9 +64,38 @@ void RefObject::operator delete(void* ptr)
|
|||
memory::Free(ptr);
|
||||
}
|
||||
|
||||
void RefObject::operator delete(void* ptr, autogc_t const&)
|
||||
void* RefObject::operator new(size_t size, std::nothrow_t const&)
|
||||
{
|
||||
memory::Free(ptr);
|
||||
try
|
||||
{
|
||||
void* ptr = memory::Alloc(size);
|
||||
return ptr;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void RefObject::operator delete(void* ptr, std::nothrow_t const&)
|
||||
{
|
||||
try
|
||||
{
|
||||
memory::Free(ptr);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
void* RefObject::operator new(size_t size, void* ptr)
|
||||
{
|
||||
return ::operator new(size, ptr);
|
||||
}
|
||||
|
||||
void RefObject::operator delete(void* ptr, void* place) noexcept
|
||||
{
|
||||
::operator delete(ptr, place);
|
||||
}
|
||||
|
||||
} // namespace kiwano
|
||||
|
|
|
|||
|
|
@ -25,13 +25,6 @@
|
|||
namespace kiwano
|
||||
{
|
||||
|
||||
struct autogc_t
|
||||
{
|
||||
autogc_t() = default;
|
||||
};
|
||||
|
||||
extern autogc_t const autogc;
|
||||
|
||||
/**
|
||||
* \~chinese
|
||||
* @brief 引用计数器
|
||||
|
|
@ -47,34 +40,29 @@ public:
|
|||
/// @brief 减少引用计数
|
||||
void Release();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief ×Ô¶¯ÊÍ·Å
|
||||
void AutoRelease();
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 获取引用计数
|
||||
uint32_t GetRefCount() const;
|
||||
|
||||
void* operator new(std::size_t size);
|
||||
static void* operator new(size_t size);
|
||||
|
||||
void* operator new(std::size_t size, autogc_t const&);
|
||||
static void operator delete(void* ptr);
|
||||
|
||||
void operator delete(void* ptr);
|
||||
static void* operator new(size_t size, std::nothrow_t const&) noexcept;
|
||||
|
||||
void operator delete(void* ptr, autogc_t const&);
|
||||
static void operator delete(void* ptr, std::nothrow_t const&) noexcept;
|
||||
|
||||
static void* operator new(size_t size, void* ptr) noexcept;
|
||||
|
||||
static void operator delete(void* ptr, void* place) noexcept;
|
||||
|
||||
virtual ~RefObject();
|
||||
|
||||
protected:
|
||||
RefObject();
|
||||
|
||||
virtual ~RefObject();
|
||||
|
||||
private:
|
||||
std::atomic<uint32_t> ref_count_;
|
||||
};
|
||||
|
||||
inline uint32_t RefObject::GetRefCount() const
|
||||
{
|
||||
return ref_count_.load();
|
||||
}
|
||||
|
||||
} // namespace kiwano
|
||||
|
|
|
|||
|
|
@ -53,12 +53,7 @@ template <typename _Ty, typename... _Args>
|
|||
inline RefPtr<_Ty> MakePtr(_Args&&... args)
|
||||
{
|
||||
static_assert(std::is_base_of<RefObject, _Ty>::value, "_Ty must be derived from RefObject");
|
||||
|
||||
RefPtr<_Ty> ptr;
|
||||
|
||||
_Ty** pptr = ptr.GetAddressOfAndRelease();
|
||||
(*pptr) = new _Ty(std::forward<_Args>(args)...);
|
||||
return ptr;
|
||||
return RefPtr<_Ty>(new _Ty(std::forward<_Args>(args)...));
|
||||
}
|
||||
|
||||
/// \~chinese
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ MemoryAllocator* GetGlobalAllocator()
|
|||
return ::operator new(size);
|
||||
}
|
||||
|
||||
virtual void Free(void* ptr, size_t) override
|
||||
virtual void Free(void* ptr) override
|
||||
{
|
||||
::operator delete(ptr);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ public:
|
|||
|
||||
/// \~chinese
|
||||
/// @brief ÊÍ·ÅÄÚ´æ
|
||||
virtual void Free(void* ptr, size_t size = 0) = 0;
|
||||
virtual void Free(void* ptr) = 0;
|
||||
};
|
||||
|
||||
/// \~chinese
|
||||
|
|
@ -65,13 +65,6 @@ inline void Free(void* ptr)
|
|||
memory::GetAllocator()->Free(ptr);
|
||||
}
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 使用当前内存分配器释放内存
|
||||
inline void Free(void* ptr, size_t size)
|
||||
{
|
||||
memory::GetAllocator()->Free(ptr, size);
|
||||
}
|
||||
|
||||
} // namespace memory
|
||||
|
||||
/// \~chinese
|
||||
|
|
@ -120,13 +113,13 @@ public:
|
|||
|
||||
inline void deallocate(void* ptr, size_t count)
|
||||
{
|
||||
memory::Free(ptr, sizeof(_Ty) * count);
|
||||
memory::Free(ptr /*, sizeof(_Ty) * count */);
|
||||
}
|
||||
|
||||
template <typename _UTy, typename... _Args>
|
||||
inline void construct(_UTy* ptr, _Args&&... args)
|
||||
inline void construct(_UTy* const ptr, _Args&&... args)
|
||||
{
|
||||
::new (ptr) _Ty(std::forward<_Args>(args)...);
|
||||
::new (const_cast<void*>(static_cast<const volatile void*>(ptr))) _Ty(std::forward<_Args>(args)...);
|
||||
}
|
||||
|
||||
template <typename _UTy>
|
||||
|
|
|
|||
|
|
@ -56,23 +56,28 @@ using WideStringStream = std::wstringstream;
|
|||
|
||||
/// \~chinese
|
||||
/// @brief 线性数组容器
|
||||
template <typename _Ty, typename... _Args>
|
||||
using Vector = std::vector<_Ty, _Args...>;
|
||||
template <typename _Ty, typename _Alloc = std::allocator<_Ty>>
|
||||
using Vector = std::vector<_Ty, _Alloc>;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 链表容器
|
||||
template <typename _Ty, typename... _Args>
|
||||
using List = std::list<_Ty, _Args...>;
|
||||
template <typename _Ty, typename _Alloc = std::allocator<_Ty>>
|
||||
using List = std::list<_Ty, _Alloc>;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 双端队列容器
|
||||
template <typename _Ty, typename _Alloc = std::allocator<_Ty>>
|
||||
using Deque = std::deque<_Ty, _Alloc>;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 队列容器
|
||||
template <typename _Ty, typename... _Args>
|
||||
using Queue = std::queue<_Ty, _Args...>;
|
||||
template <typename _Ty, typename _Container = Deque<_Ty>>
|
||||
using Queue = std::queue<_Ty, _Container>;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 集合容器
|
||||
template <typename _Ty, typename... _Args>
|
||||
using Set = std::set<_Ty, _Args...>;
|
||||
template <typename _Kty, typename _Compare = std::less<_Kty>, typename _Alloc = std::allocator<_Kty>>
|
||||
using Set = std::set<_Kty, _Compare, _Alloc>;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 对容器
|
||||
|
|
@ -81,23 +86,25 @@ using Pair = std::pair<_Ty1, _Ty2>;
|
|||
|
||||
/// \~chinese
|
||||
/// @brief 无序集合容器
|
||||
template <typename _Ty, typename... _Args>
|
||||
using UnorderedSet = std::unordered_set<_Ty, _Args...>;
|
||||
template <typename _Kty, typename _Hash = std::hash<_Kty>, typename _Keq = std::equal_to<_Kty>,
|
||||
typename _Alloc = std::allocator<_Kty>>
|
||||
using UnorderedSet = std::unordered_set<_Kty, _Hash, _Keq, _Alloc>;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 栈容器
|
||||
template <typename _Ty, typename... _Args>
|
||||
using Stack = std::stack<_Ty, _Args...>;
|
||||
template <typename _Ty, typename _Container = Deque<_Ty>>
|
||||
using Stack = std::stack<_Ty, _Container>;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief ×Ö·û´®ÈÝÆ÷
|
||||
template <typename _Kty, typename _Ty, typename... _Args>
|
||||
using Map = std::map<_Kty, _Ty, _Args...>;
|
||||
/// @brief 排序关联容器
|
||||
template <typename _Kty, typename _Ty, typename _Compare = std::less<_Kty>, typename _Alloc = std::allocator<Pair<const _Kty, _Ty>>>
|
||||
using Map = std::map<_Kty, _Ty, _Compare, _Alloc>;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief ×Ö·û´®ÈÝÆ÷
|
||||
template <typename _Kty, typename _Ty, typename... _Args>
|
||||
using UnorderedMap = std::unordered_map<_Kty, _Ty, _Args...>;
|
||||
/// @brief 非排序关联容器
|
||||
template <typename _Kty, typename _Ty, typename _Hash = std::hash<_Kty>, typename _Keq = std::equal_to<_Kty>,
|
||||
typename _Alloc = std::allocator<Pair<const _Kty, _Ty>>>
|
||||
using UnorderedMap = std::unordered_map<_Kty, _Ty, _Hash, _Keq, _Alloc>;
|
||||
|
||||
/// \~chinese
|
||||
/// @brief 不可拷贝对象
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@
|
|||
#include <kiwano/platform/Application.h>
|
||||
#include <kiwano/core/Defer.h>
|
||||
#include <kiwano/base/Director.h>
|
||||
#include <kiwano/base/ObjectPool.h>
|
||||
#include <kiwano/render/Renderer.h>
|
||||
#include <kiwano/render/TextureCache.h>
|
||||
#include <kiwano/utils/ResourceCache.h>
|
||||
|
|
@ -83,9 +82,6 @@ void Application::Run(RunnerPtr runner)
|
|||
// Execute main loop
|
||||
if (!runner->MainLoop(timer_->GetDeltaTime()))
|
||||
running_ = false;
|
||||
|
||||
// Clear objects
|
||||
ObjectPool::GetInstance().Clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -137,9 +133,6 @@ void Application::Destroy()
|
|||
// Clear device resources
|
||||
TextureCache::GetInstance().Clear();
|
||||
Renderer::GetInstance().Destroy();
|
||||
|
||||
// Clear objects
|
||||
ObjectPool::GetInstance().Clear();
|
||||
}
|
||||
|
||||
void Application::Use(Module& module)
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ namespace kiwano
|
|||
* \~chinese
|
||||
* @brief 输入设备实例,可获取鼠标和键盘的按键状态
|
||||
*/
|
||||
class KGE_API Input
|
||||
class KGE_API Input final
|
||||
: public Singleton<Input>
|
||||
, public Module
|
||||
{
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@
|
|||
|
||||
#pragma once
|
||||
#include <kiwano/core/Common.h>
|
||||
#include <kiwano/macros.h>
|
||||
|
||||
namespace kiwano
|
||||
{
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ namespace kiwano
|
|||
* \~chinese
|
||||
* @brief 纹理缓存
|
||||
*/
|
||||
class KGE_API TextureCache : public Singleton<TextureCache>
|
||||
class KGE_API TextureCache final : public Singleton<TextureCache>
|
||||
{
|
||||
friend Singleton<TextureCache>;
|
||||
|
||||
|
|
|
|||
|
|
@ -218,7 +218,7 @@ private:
|
|||
* \~chinese
|
||||
* @brief 日志记录器
|
||||
*/
|
||||
class KGE_API Logger : public Singleton<Logger>
|
||||
class KGE_API Logger final : public Singleton<Logger>
|
||||
{
|
||||
friend Singleton<Logger>;
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ namespace kiwano
|
|||
/// \~chinese
|
||||
/// @brief ×ÊÔ´»º´æ
|
||||
/// @details ×ÊÔ´»º´æ
|
||||
class KGE_API ResourceCache : public Singleton<ResourceCache>
|
||||
class KGE_API ResourceCache final : public Singleton<ResourceCache>
|
||||
{
|
||||
friend Singleton<ResourceCache>;
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ typedef IntrusiveList<TaskPtr> TaskList;
|
|||
* \~chinese
|
||||
* @brief 任务调度器
|
||||
*/
|
||||
class KGE_API TaskScheduler
|
||||
class KGE_API TaskScheduler : Noncopyable
|
||||
{
|
||||
public:
|
||||
/// \~chinese
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ namespace kiwano
|
|||
/// @brief 用户数据
|
||||
/// @details
|
||||
/// UserData是一个简易的运行时数据库,存放(字符串-值)的键值对,无持久化
|
||||
class KGE_API UserData : public Singleton<UserData>
|
||||
class KGE_API UserData final : public Singleton<UserData>
|
||||
{
|
||||
friend Singleton<UserData>;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue