diff --git a/include/Nazara/Audio/SoundBuffer.inl b/include/Nazara/Audio/SoundBuffer.inl index 22ed4b19a..a4c42be69 100644 --- a/include/Nazara/Audio/SoundBuffer.inl +++ b/include/Nazara/Audio/SoundBuffer.inl @@ -18,6 +18,8 @@ namespace Nz SoundBufferRef SoundBuffer::New(Args&&... args) { std::unique_ptr object(new SoundBuffer(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Core/RefCounted.hpp b/include/Nazara/Core/RefCounted.hpp index 42936ff7e..542784787 100644 --- a/include/Nazara/Core/RefCounted.hpp +++ b/include/Nazara/Core/RefCounted.hpp @@ -22,7 +22,7 @@ namespace Nz class NAZARA_CORE_API RefCounted { public: - RefCounted(); + RefCounted(bool persistent = true); RefCounted(const RefCounted&) = delete; RefCounted(RefCounted&&) = default; virtual ~RefCounted(); @@ -31,12 +31,17 @@ namespace Nz unsigned int GetReferenceCount() const; + bool IsPersistent() const; + bool RemoveReference() const; + bool SetPersistent(bool persistent = true, bool checkReferenceCount = false); + RefCounted& operator=(const RefCounted&) = delete; RefCounted& operator=(RefCounted&&) = default; private: + std::atomic_bool m_persistent; mutable std::atomic_uint m_referenceCount; }; } diff --git a/include/Nazara/Graphics/Billboard.inl b/include/Nazara/Graphics/Billboard.inl index 95a0e5b87..6c4a1e0a9 100644 --- a/include/Nazara/Graphics/Billboard.inl +++ b/include/Nazara/Graphics/Billboard.inl @@ -234,6 +234,8 @@ namespace Nz BillboardRef Billboard::New(Args&&... args) { std::unique_ptr object(new Billboard(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Graphics/ColorBackground.inl b/include/Nazara/Graphics/ColorBackground.inl index 49efd4874..67b1f2558 100644 --- a/include/Nazara/Graphics/ColorBackground.inl +++ b/include/Nazara/Graphics/ColorBackground.inl @@ -18,6 +18,8 @@ namespace Nz ColorBackgroundRef ColorBackground::New(Args&&... args) { std::unique_ptr object(new ColorBackground(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Graphics/Material.inl b/include/Nazara/Graphics/Material.inl index 801e341ae..6d5315640 100644 --- a/include/Nazara/Graphics/Material.inl +++ b/include/Nazara/Graphics/Material.inl @@ -1099,6 +1099,8 @@ namespace Nz MaterialRef Material::New(Args&&... args) { std::unique_ptr object(new Material(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Graphics/Model.inl b/include/Nazara/Graphics/Model.inl index fba9655ec..a2b4c3967 100644 --- a/include/Nazara/Graphics/Model.inl +++ b/include/Nazara/Graphics/Model.inl @@ -18,6 +18,8 @@ namespace Nz ModelRef Model::New(Args&&... args) { std::unique_ptr object(new Model(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Graphics/SkyboxBackground.inl b/include/Nazara/Graphics/SkyboxBackground.inl index 15d3eb137..6171f1e28 100644 --- a/include/Nazara/Graphics/SkyboxBackground.inl +++ b/include/Nazara/Graphics/SkyboxBackground.inl @@ -119,6 +119,8 @@ namespace Nz SkyboxBackgroundRef SkyboxBackground::New(Args&&... args) { std::unique_ptr object(new SkyboxBackground(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Graphics/Sprite.inl b/include/Nazara/Graphics/Sprite.inl index 166807f2b..840a930e6 100644 --- a/include/Nazara/Graphics/Sprite.inl +++ b/include/Nazara/Graphics/Sprite.inl @@ -271,6 +271,8 @@ namespace Nz SpriteRef Sprite::New(Args&&... args) { std::unique_ptr object(new Sprite(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Graphics/TextSprite.inl b/include/Nazara/Graphics/TextSprite.inl index 48b0c061b..baeeb50db 100644 --- a/include/Nazara/Graphics/TextSprite.inl +++ b/include/Nazara/Graphics/TextSprite.inl @@ -210,6 +210,8 @@ namespace Nz TextSpriteRef TextSprite::New(Args&&... args) { std::unique_ptr object(new TextSprite(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Graphics/TextureBackground.inl b/include/Nazara/Graphics/TextureBackground.inl index 423ab5a81..31067f36c 100644 --- a/include/Nazara/Graphics/TextureBackground.inl +++ b/include/Nazara/Graphics/TextureBackground.inl @@ -41,6 +41,8 @@ namespace Nz TextureBackgroundRef TextureBackground::New(Args&&... args) { std::unique_ptr object(new TextureBackground(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Graphics/TileMap.inl b/include/Nazara/Graphics/TileMap.inl index 0f7c8faca..405683f40 100644 --- a/include/Nazara/Graphics/TileMap.inl +++ b/include/Nazara/Graphics/TileMap.inl @@ -432,6 +432,8 @@ namespace Nz TileMapRef TileMap::New(Args&&... args) { std::unique_ptr object(new TileMap(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Physics/Geom.inl b/include/Nazara/Physics/Geom.inl index 0a21fbd23..9699cac96 100644 --- a/include/Nazara/Physics/Geom.inl +++ b/include/Nazara/Physics/Geom.inl @@ -11,6 +11,8 @@ namespace Nz BoxGeomRef BoxGeom::New(Args&&... args) { std::unique_ptr object(new BoxGeom(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } @@ -18,6 +20,8 @@ namespace Nz CapsuleGeomRef CapsuleGeom::New(Args&&... args) { std::unique_ptr object(new CapsuleGeom(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } @@ -25,6 +29,8 @@ namespace Nz CompoundGeomRef CompoundGeom::New(Args&&... args) { std::unique_ptr object(new CompoundGeom(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } @@ -32,6 +38,8 @@ namespace Nz ConeGeomRef ConeGeom::New(Args&&... args) { std::unique_ptr object(new ConeGeom(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } @@ -39,6 +47,8 @@ namespace Nz ConvexHullGeomRef ConvexHullGeom::New(Args&&... args) { std::unique_ptr object(new ConvexHullGeom(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } @@ -46,6 +56,8 @@ namespace Nz CylinderGeomRef CylinderGeom::New(Args&&... args) { std::unique_ptr object(new CylinderGeom(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } @@ -53,6 +65,8 @@ namespace Nz NullGeomRef NullGeom::New(Args&&... args) { std::unique_ptr object(new NullGeom(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } @@ -60,6 +74,8 @@ namespace Nz SphereGeomRef SphereGeom::New(Args&&... args) { std::unique_ptr object(new SphereGeom(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Renderer/RenderBuffer.inl b/include/Nazara/Renderer/RenderBuffer.inl index 59a9a5dd8..bd81e7a17 100644 --- a/include/Nazara/Renderer/RenderBuffer.inl +++ b/include/Nazara/Renderer/RenderBuffer.inl @@ -11,6 +11,8 @@ namespace Nz RenderBufferRef RenderBuffer::New(Args&&... args) { std::unique_ptr object(new RenderBuffer(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Renderer/Shader.inl b/include/Nazara/Renderer/Shader.inl index 0e8309008..b868c540e 100644 --- a/include/Nazara/Renderer/Shader.inl +++ b/include/Nazara/Renderer/Shader.inl @@ -11,6 +11,8 @@ namespace Nz ShaderRef Shader::New(Args&&... args) { std::unique_ptr object(new Shader(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Renderer/Texture.inl b/include/Nazara/Renderer/Texture.inl index c9813ac73..4dc53464b 100644 --- a/include/Nazara/Renderer/Texture.inl +++ b/include/Nazara/Renderer/Texture.inl @@ -11,6 +11,8 @@ namespace Nz TextureRef Texture::New(Args&&... args) { std::unique_ptr object(new Texture(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } diff --git a/include/Nazara/Renderer/UberShaderPreprocessor.inl b/include/Nazara/Renderer/UberShaderPreprocessor.inl index fb9477030..1e6528775 100644 --- a/include/Nazara/Renderer/UberShaderPreprocessor.inl +++ b/include/Nazara/Renderer/UberShaderPreprocessor.inl @@ -11,6 +11,8 @@ namespace Nz UberShaderPreprocessorRef UberShaderPreprocessor::New(Args&&... args) { std::unique_ptr object(new UberShaderPreprocessor(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Utility/Animation.inl b/include/Nazara/Utility/Animation.inl index f742e4c0e..0ae58c0f4 100644 --- a/include/Nazara/Utility/Animation.inl +++ b/include/Nazara/Utility/Animation.inl @@ -11,6 +11,8 @@ namespace Nz AnimationRef Animation::New(Args&&... args) { std::unique_ptr object(new Animation(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Utility/Buffer.inl b/include/Nazara/Utility/Buffer.inl index 39c1960f7..8703fd82c 100644 --- a/include/Nazara/Utility/Buffer.inl +++ b/include/Nazara/Utility/Buffer.inl @@ -11,6 +11,8 @@ namespace Nz BufferRef Buffer::New(Args&&... args) { std::unique_ptr object(new Buffer(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Utility/Font.inl b/include/Nazara/Utility/Font.inl index 5f8e94c2c..241915a3e 100644 --- a/include/Nazara/Utility/Font.inl +++ b/include/Nazara/Utility/Font.inl @@ -11,6 +11,8 @@ namespace Nz FontRef Font::New(Args&&... args) { std::unique_ptr object(new Font(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Utility/Image.inl b/include/Nazara/Utility/Image.inl index ca111f9e9..5cb8ef42f 100644 --- a/include/Nazara/Utility/Image.inl +++ b/include/Nazara/Utility/Image.inl @@ -11,6 +11,8 @@ namespace Nz ImageRef Image::New(Args&&... args) { std::unique_ptr object(new Image(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Utility/IndexBuffer.inl b/include/Nazara/Utility/IndexBuffer.inl index 789019f91..1c1d16a18 100644 --- a/include/Nazara/Utility/IndexBuffer.inl +++ b/include/Nazara/Utility/IndexBuffer.inl @@ -11,6 +11,8 @@ namespace Nz IndexBufferRef IndexBuffer::New(Args&&... args) { std::unique_ptr object(new IndexBuffer(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Utility/Mesh.inl b/include/Nazara/Utility/Mesh.inl index 21d52bf7d..4877e03fe 100644 --- a/include/Nazara/Utility/Mesh.inl +++ b/include/Nazara/Utility/Mesh.inl @@ -11,6 +11,8 @@ namespace Nz MeshRef Mesh::New(Args&&... args) { std::unique_ptr object(new Mesh(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Utility/SkeletalMesh.inl b/include/Nazara/Utility/SkeletalMesh.inl index f6a590902..69119dc87 100644 --- a/include/Nazara/Utility/SkeletalMesh.inl +++ b/include/Nazara/Utility/SkeletalMesh.inl @@ -11,6 +11,8 @@ namespace Nz SkeletalMeshRef SkeletalMesh::New(Args&&... args) { std::unique_ptr object(new SkeletalMesh(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Utility/Skeleton.inl b/include/Nazara/Utility/Skeleton.inl index 839227462..4c0ef4546 100644 --- a/include/Nazara/Utility/Skeleton.inl +++ b/include/Nazara/Utility/Skeleton.inl @@ -11,6 +11,8 @@ namespace Nz SkeletonRef Skeleton::New(Args&&... args) { std::unique_ptr object(new Skeleton(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Utility/StaticMesh.inl b/include/Nazara/Utility/StaticMesh.inl index a18ae32f5..06afcec95 100644 --- a/include/Nazara/Utility/StaticMesh.inl +++ b/include/Nazara/Utility/StaticMesh.inl @@ -11,6 +11,8 @@ namespace Nz StaticMeshRef StaticMesh::New(Args&&... args) { std::unique_ptr object(new StaticMesh(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Utility/VertexBuffer.inl b/include/Nazara/Utility/VertexBuffer.inl index a4ebef1be..24268e9cb 100644 --- a/include/Nazara/Utility/VertexBuffer.inl +++ b/include/Nazara/Utility/VertexBuffer.inl @@ -11,6 +11,8 @@ namespace Nz VertexBufferRef VertexBuffer::New(Args&&... args) { std::unique_ptr object(new VertexBuffer(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/include/Nazara/Utility/VertexDeclaration.inl b/include/Nazara/Utility/VertexDeclaration.inl index f74e29a7c..beed900d5 100644 --- a/include/Nazara/Utility/VertexDeclaration.inl +++ b/include/Nazara/Utility/VertexDeclaration.inl @@ -11,6 +11,8 @@ namespace Nz VertexDeclarationRef VertexDeclaration::New(Args&&... args) { std::unique_ptr object(new VertexDeclaration(std::forward(args)...)); + object->SetPersistent(false); + return object.release(); } } diff --git a/src/Nazara/Core/RefCounted.cpp b/src/Nazara/Core/RefCounted.cpp index f37300c32..31e749515 100644 --- a/src/Nazara/Core/RefCounted.cpp +++ b/src/Nazara/Core/RefCounted.cpp @@ -23,10 +23,13 @@ namespace Nz */ /*! - * \brief Constructs a RefCounted object + * \brief Constructs a RefCounted object with a persistance aspect + * + * \param persistent if false, object is destroyed when no more referenced */ - RefCounted::RefCounted() : + RefCounted::RefCounted(bool persistent) : + m_persistent(persistent), m_referenceCount(0) { } @@ -64,6 +67,16 @@ namespace Nz return m_referenceCount; } + /*! + * \brief Checks whether the object is persistent + * \return true if object is not destroyed when no more referenced + */ + + bool RefCounted::IsPersistent() const + { + return m_persistent; + } + /*! * \brief Removes a reference to the object * \return true if object is deleted because no more referenced @@ -81,7 +94,7 @@ namespace Nz } #endif - if (--m_referenceCount == 0) + if (--m_referenceCount == 0 && !m_persistent) { delete this; // Suicide @@ -90,4 +103,26 @@ namespace Nz else return false; } + + /*! + * \brief Sets the persistence of the object + * \return true if object is deleted because no more referenced + * + * \param persistent Sets the persistence of the object + * \param checkReferenceCount Checks if the object should be destroyed if true + */ + + bool RefCounted::SetPersistent(bool persistent, bool checkReferenceCount) + { + m_persistent = persistent; + + if (checkReferenceCount && !persistent && m_referenceCount == 0) + { + delete this; + + return true; + } + else + return false; + } }