Added ResourceListenerWrapper
This class wraps the call to Resource::AddResourceListener/RemoveResourceListener using RAII and help a lot with some of the dependencies. Thanks to this, the render queues now handle their resources listening properly. Former-commit-id: 7f215ffa4ccadcc4f44f777656970e92ce01087a
This commit is contained in:
45
include/Nazara/Core/ResourceListenerWrapper.hpp
Normal file
45
include/Nazara/Core/ResourceListenerWrapper.hpp
Normal file
@@ -0,0 +1,45 @@
|
||||
// Copyright (C) 2015 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Core module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_RESOURCELISTENERWRAPPER_HPP
|
||||
#define NAZARA_RESOURCELISTENERWRAPPER_HPP
|
||||
|
||||
#include <Nazara/Prerequesites.hpp>
|
||||
#include <Nazara/Core/Resource.hpp>
|
||||
#include <Nazara/Core/ResourceListener.hpp>
|
||||
#include <type_traits>
|
||||
|
||||
template<typename T>
|
||||
class NzResourceListenerWrapper
|
||||
{
|
||||
static_assert(std::is_base_of<NzResource, T>::value, "ResourceRef should only be used with resource type");
|
||||
|
||||
public:
|
||||
NzResourceListenerWrapper(NzResourceListener* listener, int index = 0, T* resource = nullptr);
|
||||
NzResourceListenerWrapper(const NzResourceListenerWrapper& listener);
|
||||
NzResourceListenerWrapper(NzResourceListenerWrapper&& listener);
|
||||
~NzResourceListenerWrapper();
|
||||
|
||||
bool IsValid() const;
|
||||
void Reset(T* resource = nullptr);
|
||||
|
||||
operator bool() const;
|
||||
operator T*() const;
|
||||
T* operator->() const;
|
||||
|
||||
NzResourceListenerWrapper& operator=(T* resource);
|
||||
NzResourceListenerWrapper& operator=(const NzResourceListenerWrapper& listener);
|
||||
NzResourceListenerWrapper& operator=(NzResourceListenerWrapper&& listener);
|
||||
|
||||
private:
|
||||
T* m_resource;
|
||||
NzResourceListener* m_listener;
|
||||
int m_index;
|
||||
};
|
||||
|
||||
#include <Nazara/Core/ResourceListenerWrapper.inl>
|
||||
|
||||
#endif // NAZARA_RESOURCELISTENERWRAPPER_HPP
|
||||
108
include/Nazara/Core/ResourceListenerWrapper.inl
Normal file
108
include/Nazara/Core/ResourceListenerWrapper.inl
Normal file
@@ -0,0 +1,108 @@
|
||||
// Copyright (C) 2015 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Core module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Core/Debug.hpp>
|
||||
|
||||
template<typename T>
|
||||
NzResourceListenerWrapper<T>::NzResourceListenerWrapper(NzResourceListener* listener, int index, T* resource) :
|
||||
m_resource(nullptr),
|
||||
m_listener(listener),
|
||||
m_index(index)
|
||||
{
|
||||
Reset(resource);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
NzResourceListenerWrapper<T>::NzResourceListenerWrapper(const NzResourceListenerWrapper& listener) :
|
||||
m_resource(nullptr),
|
||||
m_listener(listener.m_listener),
|
||||
m_index(listener.m_index)
|
||||
{
|
||||
Reset(listener.m_resource);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
NzResourceListenerWrapper<T>::NzResourceListenerWrapper(NzResourceListenerWrapper&& listener) :
|
||||
m_resource(listener.m_resource),
|
||||
m_listener(listener.m_listener),
|
||||
m_index(listener.m_index)
|
||||
{
|
||||
listener.m_resource = nullptr;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
NzResourceListenerWrapper<T>::~NzResourceListenerWrapper()
|
||||
{
|
||||
Reset(nullptr);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool NzResourceListenerWrapper<T>::IsValid() const
|
||||
{
|
||||
return m_resource != nullptr;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void NzResourceListenerWrapper<T>::Reset(T* resource)
|
||||
{
|
||||
if (resource)
|
||||
resource->AddResourceListener(m_listener, m_index);
|
||||
|
||||
if (m_resource)
|
||||
m_resource->RemoveResourceListener(m_listener);
|
||||
|
||||
m_resource = resource;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
NzResourceListenerWrapper<T>::operator bool() const
|
||||
{
|
||||
return IsValid();
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
NzResourceListenerWrapper<T>::operator T*() const
|
||||
{
|
||||
return m_resource;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T* NzResourceListenerWrapper<T>::operator->() const
|
||||
{
|
||||
return m_resource;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
NzResourceListenerWrapper<T>& NzResourceListenerWrapper<T>::operator=(T* resource)
|
||||
{
|
||||
Reset(resource);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
NzResourceListenerWrapper<T>& NzResourceListenerWrapper<T>::operator=(const NzResourceListenerWrapper& listener)
|
||||
{
|
||||
m_index = listener.m_index;
|
||||
m_listener = listener.m_listener;
|
||||
Reset(listener.m_resource);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
NzResourceListenerWrapper<T>& NzResourceListenerWrapper<T>::operator=(NzResourceListenerWrapper&& listener)
|
||||
{
|
||||
Reset();
|
||||
|
||||
m_index = listener.m_index;
|
||||
m_listener = listener.m_listener;
|
||||
m_resource = listener.m_resource;
|
||||
|
||||
listener.m_resource = nullptr;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
#include <Nazara/Core/DebugOff.hpp>
|
||||
Reference in New Issue
Block a user