Added ResourceConstListener
I don't know yet if it's a good idea but at least it's an idea Former-commit-id: b034a787d8d8ccce0804f1276958b32c9e149147
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
#include <Nazara/Core/Resource.hpp>
|
||||
#include <Nazara/Core/Config.hpp>
|
||||
#include <Nazara/Core/Error.hpp>
|
||||
#include <Nazara/Core/ResourceConstListener.hpp>
|
||||
#include <Nazara/Core/ResourceListener.hpp>
|
||||
|
||||
#if NAZARA_CORE_THREADSAFE && NAZARA_THREADSAFETY_RESOURCE
|
||||
@@ -34,6 +35,19 @@ NzResource::~NzResource()
|
||||
#endif
|
||||
}
|
||||
|
||||
void NzResource::AddResourceConstListener(const NzResourceConstListener* listener, int index) const
|
||||
{
|
||||
///DOC: Est ignoré si appelé depuis un évènement
|
||||
NazaraLock(m_mutex)
|
||||
|
||||
if (!m_resourceListenersLocked)
|
||||
{
|
||||
auto pair = m_resourceConstListeners.insert(std::make_pair(listener, std::make_pair(index, 1U)));
|
||||
if (!pair.second)
|
||||
pair.first->second.second++;
|
||||
}
|
||||
}
|
||||
|
||||
void NzResource::AddResourceListener(NzResourceListener* listener, int index) const
|
||||
{
|
||||
///DOC: Est ignoré si appelé depuis un évènement
|
||||
@@ -62,6 +76,19 @@ bool NzResource::IsPersistent() const
|
||||
return m_resourcePersistent;
|
||||
}
|
||||
|
||||
void NzResource::RemoveResourceConstListener(const NzResourceConstListener* listener) const
|
||||
{
|
||||
///DOC: Est ignoré si appelé depuis un évènement
|
||||
NazaraLock(m_mutex);
|
||||
|
||||
if (!m_resourceListenersLocked)
|
||||
{
|
||||
ResourceConstListenerMap::iterator it = m_resourceConstListeners.find(listener);
|
||||
if (it != m_resourceConstListeners.end())
|
||||
RemoveResourceConstListenerIterator(it);
|
||||
}
|
||||
}
|
||||
|
||||
void NzResource::RemoveResourceListener(NzResourceListener* listener) const
|
||||
{
|
||||
///DOC: Est ignoré si appelé depuis un évènement
|
||||
@@ -115,6 +142,15 @@ void NzResource::NotifyCreated()
|
||||
|
||||
m_resourceListenersLocked = true;
|
||||
|
||||
auto constIt = m_resourceConstListeners.begin();
|
||||
while (constIt != m_resourceConstListeners.end())
|
||||
{
|
||||
if (!constIt->first->OnResourceCreated(this, constIt->second.first))
|
||||
RemoveResourceConstListenerIterator(constIt++);
|
||||
else
|
||||
++constIt;
|
||||
}
|
||||
|
||||
auto it = m_resourceListeners.begin();
|
||||
while (it != m_resourceListeners.end())
|
||||
{
|
||||
@@ -133,6 +169,15 @@ void NzResource::NotifyDestroy()
|
||||
|
||||
m_resourceListenersLocked = true;
|
||||
|
||||
auto constIt = m_resourceConstListeners.begin();
|
||||
while (constIt != m_resourceConstListeners.end())
|
||||
{
|
||||
if (!constIt->first->OnResourceDestroy(this, constIt->second.first))
|
||||
RemoveResourceConstListenerIterator(constIt++);
|
||||
else
|
||||
++constIt;
|
||||
}
|
||||
|
||||
auto it = m_resourceListeners.begin();
|
||||
while (it != m_resourceListeners.end())
|
||||
{
|
||||
@@ -151,6 +196,15 @@ void NzResource::NotifyModified(unsigned int code)
|
||||
|
||||
m_resourceListenersLocked = true;
|
||||
|
||||
auto constIt = m_resourceConstListeners.begin();
|
||||
while (constIt != m_resourceConstListeners.end())
|
||||
{
|
||||
if (!constIt->first->OnResourceModified(this, constIt->second.first, code))
|
||||
RemoveResourceConstListenerIterator(constIt++);
|
||||
else
|
||||
++constIt;
|
||||
}
|
||||
|
||||
auto it = m_resourceListeners.begin();
|
||||
while (it != m_resourceListeners.end())
|
||||
{
|
||||
@@ -163,6 +217,15 @@ void NzResource::NotifyModified(unsigned int code)
|
||||
m_resourceListenersLocked = false;
|
||||
}
|
||||
|
||||
void NzResource::RemoveResourceConstListenerIterator(ResourceConstListenerMap::iterator iterator) const
|
||||
{
|
||||
unsigned int& referenceCount = iterator->second.second;
|
||||
if (referenceCount == 1)
|
||||
m_resourceConstListeners.erase(iterator);
|
||||
else
|
||||
referenceCount--;
|
||||
}
|
||||
|
||||
void NzResource::RemoveResourceListenerIterator(ResourceListenerMap::iterator iterator) const
|
||||
{
|
||||
unsigned int& referenceCount = iterator->second.second;
|
||||
|
||||
39
src/Nazara/Core/ResourceConstListener.cpp
Normal file
39
src/Nazara/Core/ResourceConstListener.cpp
Normal file
@@ -0,0 +1,39 @@
|
||||
// Copyright (C) 2014 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/ResourceConstListener.hpp>
|
||||
#include <Nazara/Core/Debug.hpp>
|
||||
|
||||
NzResourceConstListener::~NzResourceConstListener() = default;
|
||||
|
||||
bool NzResourceConstListener::OnResourceCreated(const NzResource* resource, int index) const
|
||||
{
|
||||
NazaraUnused(resource);
|
||||
NazaraUnused(index);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool NzResourceConstListener::OnResourceDestroy(const NzResource* resource, int index) const
|
||||
{
|
||||
NazaraUnused(resource);
|
||||
NazaraUnused(index);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool NzResourceConstListener::OnResourceModified(const NzResource* resource, int index, unsigned int code) const
|
||||
{
|
||||
NazaraUnused(resource);
|
||||
NazaraUnused(index);
|
||||
NazaraUnused(code);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void NzResourceConstListener::OnResourceReleased(const NzResource* resource, int index) const
|
||||
{
|
||||
NazaraUnused(resource);
|
||||
NazaraUnused(index);
|
||||
}
|
||||
Reference in New Issue
Block a user