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:
Lynix
2015-01-18 23:59:01 +01:00
parent a6183fae69
commit 8f9ea9db17
33 changed files with 602 additions and 411 deletions

View 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

View 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>