Documentation for ObjectRef

Former-commit-id: 3c704ed4e8999b0cdc66f6fe29ca0f170cc6619c
This commit is contained in:
Gawaboumga 2016-02-21 14:22:57 +01:00
parent de5a994a5c
commit 040c8b099f
2 changed files with 161 additions and 1 deletions

View File

@ -7,12 +7,27 @@
namespace Nz namespace Nz
{ {
/*!
* \class Nz::ObjectRef
* \brief Core class that represents a reference to an object
*/
/*!
* \brief Constructs a ObjectRef object by default
*/
template<typename T> template<typename T>
ObjectRef<T>::ObjectRef() : ObjectRef<T>::ObjectRef() :
m_object(nullptr) m_object(nullptr)
{ {
} }
/*!
* \brief Constructs a ObjectRef object with a pointer to an object
*
* \param object Pointer to handle like a reference (can be nullptr)
*/
template<typename T> template<typename T>
ObjectRef<T>::ObjectRef(T* object) : ObjectRef<T>::ObjectRef(T* object) :
m_object(object) m_object(object)
@ -21,6 +36,12 @@ namespace Nz
m_object->AddReference(); m_object->AddReference();
} }
/*!
* \brief Constructs a ObjectRef object by assignation
*
* \param ref ObjectRef to assign into this
*/
template<typename T> template<typename T>
ObjectRef<T>::ObjectRef(const ObjectRef& ref) : ObjectRef<T>::ObjectRef(const ObjectRef& ref) :
m_object(ref.m_object) m_object(ref.m_object)
@ -29,6 +50,12 @@ namespace Nz
m_object->AddReference(); m_object->AddReference();
} }
/*!
* \brief Constructs a ObjectRef<U> object from another type of ObjectRef
*
* \param ref ObjectRef of type U to convert to type T
*/
template<typename T> template<typename T>
template<typename U> template<typename U>
ObjectRef<T>::ObjectRef(const ObjectRef<U>& ref) : ObjectRef<T>::ObjectRef(const ObjectRef<U>& ref) :
@ -36,13 +63,23 @@ namespace Nz
{ {
} }
/*!
* \brief Constructs a ObjectRef object by move semantic
*
* \param ref ObjectRef to move into this
*/
template<typename T> template<typename T>
ObjectRef<T>::ObjectRef(ObjectRef&& ref) noexcept : ObjectRef<T>::ObjectRef(ObjectRef&& ref) noexcept :
m_object(ref.m_object) m_object(ref.m_object)
{ {
ref.m_object = nullptr; // On vole la référence ref.m_object = nullptr; // We steal the reference
} }
/*!
* \brief Destructs the object (remove a reference to the object when shared)
*/
template<typename T> template<typename T>
ObjectRef<T>::~ObjectRef() ObjectRef<T>::~ObjectRef()
{ {
@ -50,27 +87,50 @@ namespace Nz
m_object->RemoveReference(); m_object->RemoveReference();
} }
/*!
* \brief Gets the underlying pointer
* \return Underlying pointer
*/
template<typename T> template<typename T>
T* ObjectRef<T>::Get() const T* ObjectRef<T>::Get() const
{ {
return m_object; return m_object;
} }
/*!
* \brief Checks whether the reference is valid
* \return true if reference is not nullptr
*/
template<typename T> template<typename T>
bool ObjectRef<T>::IsValid() const bool ObjectRef<T>::IsValid() const
{ {
return m_object != nullptr; return m_object != nullptr;
} }
/*!
* \brief Releases the handle of the pointer
* \return Underlying pointer
*/
template<typename T> template<typename T>
T* ObjectRef<T>::Release() T* ObjectRef<T>::Release()
{ {
if (m_object)
m_object->RemoveReference();
T* object = m_object; T* object = m_object;
m_object = nullptr; m_object = nullptr;
return object; return object;
} }
/*!
* \brief Resets the content of the ObjectRef with another pointer
* \return true if old handle is destroyed
*/
template<typename T> template<typename T>
bool ObjectRef<T>::Reset(T* object) bool ObjectRef<T>::Reset(T* object)
{ {
@ -88,6 +148,13 @@ namespace Nz
return destroyed; return destroyed;
} }
/*!
* \brief Swaps the content of the two ObjectRef
* \return A reference to this
*
* \param ref ObjectRef to swap
*/
template<typename T> template<typename T>
ObjectRef<T>& ObjectRef<T>::Swap(ObjectRef& ref) ObjectRef<T>& ObjectRef<T>::Swap(ObjectRef& ref)
{ {
@ -96,24 +163,48 @@ namespace Nz
return *this; return *this;
} }
/*!
* \brief Converts the ObjectRef to bool
* \return true if reference is not nullptr
*
* \see IsValid
*/
template<typename T> template<typename T>
ObjectRef<T>::operator bool() const ObjectRef<T>::operator bool() const
{ {
return IsValid(); return IsValid();
} }
/*!
* \brief Dereferences the ObjectRef
* \return Underlying pointer
*/
template<typename T> template<typename T>
ObjectRef<T>::operator T*() const ObjectRef<T>::operator T*() const
{ {
return m_object; return m_object;
} }
/*!
* \brief Dereferences the ObjectRef
* \return Underlying pointer
*/
template<typename T> template<typename T>
T* ObjectRef<T>::operator->() const T* ObjectRef<T>::operator->() const
{ {
return m_object; return m_object;
} }
/*!
* \brief Assigns the object into this
* \return A reference to this
*
* \param object Pointer to handle like a reference (can be nullptr)
*/
template<typename T> template<typename T>
ObjectRef<T>& ObjectRef<T>::operator=(T* object) ObjectRef<T>& ObjectRef<T>::operator=(T* object)
{ {
@ -122,6 +213,13 @@ namespace Nz
return *this; return *this;
} }
/*!
* \brief Sets the reference of the ObjectRef with the handle from another
* \return A reference to this
*
* \param ref The other ObjectRef
*/
template<typename T> template<typename T>
ObjectRef<T>& ObjectRef<T>::operator=(const ObjectRef& ref) ObjectRef<T>& ObjectRef<T>::operator=(const ObjectRef& ref)
{ {
@ -130,6 +228,13 @@ namespace Nz
return *this; return *this;
} }
/*!
* \brief Sets the reference of the ObjectRef from another type of ObjectRef
* \return A reference to this
*
* \param ref ObjectRef of type U to convert
*/
template<typename T> template<typename T>
template<typename U> template<typename U>
ObjectRef<T>& ObjectRef<T>::operator=(const ObjectRef<U>& ref) ObjectRef<T>& ObjectRef<T>::operator=(const ObjectRef<U>& ref)
@ -141,6 +246,13 @@ namespace Nz
return *this; return *this;
} }
/*!
* \brief Moves the ObjectRef into this
* \return A reference to this
*
* \param ref ObjectRef to move in this
*/
template<typename T> template<typename T>
ObjectRef<T>& ObjectRef<T>::operator=(ObjectRef&& ref) noexcept ObjectRef<T>& ObjectRef<T>::operator=(ObjectRef&& ref) noexcept
{ {
@ -154,6 +266,13 @@ namespace Nz
namespace std namespace std
{ {
/*!
* \brief Gives a hash representation of the object, specialisation of std
* \return Hash of the ObjectRef
*
* \param object Object to hash
*/
template<typename T> template<typename T>
struct hash<Nz::ObjectRef<T>> struct hash<Nz::ObjectRef<T>>
{ {

View File

@ -0,0 +1,41 @@
#include <Nazara/Core/ObjectRef.hpp>
#include <Catch/catch.hpp>
#include <Nazara/Utility/Font.hpp>
SCENARIO("ObjectRef", "[CORE][OBJECTREF]")
{
GIVEN("A ObjectRef")
{
Nz::ObjectRef<Nz::Font> objectRef;
WHEN("We have two objectRef handling the same object")
{
Nz::Font font;
objectRef = &font;
Nz::ObjectRef<Nz::Font> otherRef(&font);
THEN("Pointers the same")
{
REQUIRE(objectRef.IsValid());
REQUIRE(otherRef.IsValid());
}
objectRef.Reset(nullptr);
}
WHEN("We assign it to a simple font")
{
Nz::Font font;
THEN("Release suppress the reference to the object")
{
objectRef.Reset(&font);
objectRef.Release();
REQUIRE(!objectRef.IsValid());
}
}
}
}