Skip to content
Snippets Groups Projects
Commit a6685a5e authored by Sebastian Freitag's avatar Sebastian Freitag
Browse files

Merge branch 'feature/VistaDefaultObserver' into 'develop'

Feature/vista default observer

See merge request !25
parents af44585f a049f544
No related branches found
No related tags found
1 merge request!25Feature/vista default observer
......@@ -34,10 +34,6 @@
/* CONSTRUCTORS / DESTRUCTOR */
/*============================================================================*/
IVistaObserver::IVistaObserver(IVistaObserver &)
{}
IVistaObserver::IVistaObserver()
: m_bObserverEnabled( true )
{ }
......@@ -46,16 +42,12 @@ IVistaObserver::~IVistaObserver()
{
// copy vector of observables, because the original (member) version
// is altered during the ReleaseObserveable call
std::vector<IVistaObserveable *> vecObs = m_vecObserveables;
const auto vecObs = m_vecObserveables;
std::vector<IVistaObserveable *>::iterator it;
for (it = vecObs.begin(); it != vecObs.end(); ++it)
for( IVistaObserveable* pObs : vecObs )
{
ReleaseObserveable(*it, IVistaObserveable::TICKET_NONE);
ReleaseObserveable( pObs, IVistaObserveable::TICKET_NONE );
}
m_vecObserveables.clear();
}
/*============================================================================*/
......@@ -72,29 +64,27 @@ void IVistaObserver::SetIsObserverEnabled(bool bEnabled)
m_bObserverEnabled = bEnabled;
}
void IVistaObserver::UpdateRequest(IVistaObserveable *pObserveable, int msg, int nTicket)
void IVistaObserver::UpdateRequest( IVistaObserveable* pObserveable,
int msg,
int nTicket )
{
if( m_bObserverEnabled )
{
ObserverUpdate( pObserveable, msg, nTicket );
}
}
bool IVistaObserver::ObserveableDeleteRequest(
IVistaObserveable* pObserveable,
int nTicket /*= IVistaObserveable::TICKET_NONE */
)
bool IVistaObserver::ObserveableDeleteRequest( IVistaObserveable* pObserveable,
int nTicket )
{
return true;
}
void IVistaObserver::ObserveableDelete(
IVistaObserveable* pObserveable,
int nTicket /*= IVistaObserveable::TICKET_NONE */
)
void IVistaObserver::ObserveableDelete( IVistaObserveable* pObserveable, int nTicket )
{
// just delete pObserveable from list
std::vector<IVistaObserveable*>::iterator it =
std::find(m_vecObserveables.begin(), m_vecObserveables.end(), pObserveable);
const auto it = std::find( m_vecObserveables.begin(),
m_vecObserveables.end(),
pObserveable );
if( it != m_vecObserveables.end() )
{
......@@ -102,17 +92,15 @@ void IVistaObserver::ObserveableDelete(
}
}
void IVistaObserver::ReleaseObserveable(
IVistaObserveable* pObserveable,
int nTicket /*= IVistaObserveable::TICKET_NONE */
)
void IVistaObserver::ReleaseObserveable( IVistaObserveable* pObserveable, int nTicket )
{
if( Observes( pObserveable ) )
{
pObserveable->DetachObserver( this );
std::vector<IVistaObserveable*>::iterator it =
std::find(m_vecObserveables.begin(), m_vecObserveables.end(), pObserveable);
const auto it = std::find( m_vecObserveables.begin(),
m_vecObserveables.end(),
pObserveable );
if( it != m_vecObserveables.end() )
{
......@@ -123,25 +111,39 @@ void IVistaObserver::ReleaseObserveable(
bool IVistaObserver::Observes( IVistaObserveable* pObserveable )
{
std::vector<IVistaObserveable *>::iterator it =
std::find(m_vecObserveables.begin(), m_vecObserveables.end(), pObserveable);
const auto it = std::find( m_vecObserveables.begin(),
m_vecObserveables.end(),
pObserveable );
return ( it != m_vecObserveables.end() );
}
void IVistaObserver::Observe(
IVistaObserveable* pObserveable,
int nTicket /*= IVistaObserveable::TICKET_NONE */
)
void IVistaObserver::Observe( IVistaObserveable* pObserveable, int nTicket )
{
if (!Observes(pObserveable))
if( !Observes( pObserveable ) && pObserveable->AttachObserver( this, nTicket ) )
{
if (pObserveable->AttachObserver(this, nTicket))
m_vecObserveables.push_back( pObserveable );
}
}
/*============================================================================*/
/* LOCAL VARS AND FUNCS */
/* DEFAULT OBSERVER IMPLEMENTATION */
/*============================================================================*/
VistaSimpleObserver::VistaSimpleObserver(
std::function< void( IVistaObserveable*, int, int ) > fnObserverUpdate )
: m_fnObserverUpdate( std::move( fnObserverUpdate ) )
{ }
void VistaSimpleObserver::ObserverUpdate( IVistaObserveable* pObserveable,
int nMsg,
int nTicket )
{
m_fnObserverUpdate( pObserveable, nMsg, nTicket );
}
/*============================================================================*/
/* LOCAL VARS AND FUNCS */
/*============================================================================*/
......@@ -34,6 +34,8 @@
#include "VistaNameable.h"
#include "VistaObserveable.h"
#include <functional>
/*============================================================================*/
/* MACROS AND DEFINES */
......@@ -59,8 +61,10 @@
class VISTAASPECTSAPI IVistaObserver
{
public:
virtual ~IVistaObserver();
IVistaObserver( const IVistaObserver& ) = delete;
IVistaObserver& operator=( const IVistaObserver& ) = delete;
virtual ~IVistaObserver();
/**
* An observeable is about to be deleted, this can be forbidden by returning
......@@ -78,7 +82,6 @@ public:
virtual bool ObserveableDeleteRequest( IVistaObserveable* pObserveable,
int nTicket = IVistaObserveable::TICKET_NONE );
/**
* This is sent to the observer before the observeable is deleted. Note that this
* is not a question, but a notification. After this notification passed, the observer
......@@ -141,24 +144,37 @@ public:
bool GetIsObserverEnabled() const;
virtual void SetIsObserverEnabled( bool bEnabled );
protected:
IVistaObserver();
// list of objects observed by this observer
// Note: this is implemented as a vector (even though we have to perform
// operations like deleting arbitrary elements), as this is nevertheless
// way faster than on an std::list.
std::vector< IVistaObserveable* > m_vecObserveables;
private:
bool m_bObserverEnabled;
};
/**
* Copy-constructor. We prevent copying.
* This class facilitates the creation of a very simple observer, i.e., one in
* which only the ObserverUpdate function needs to be overridden. For this,
* instead of deriving a custom observer type, one can simply forgo this step
* and supply a std::function which is called by the update function. Note, that
* managing state usually becomes much harder using this implementation.
*/
IVistaObserver(IVistaObserver &);
class VISTAASPECTSAPI VistaSimpleObserver : public IVistaObserver
{
public:
VistaSimpleObserver(
std::function< void( IVistaObserveable*, int, int ) > fnObserverUpdate );
~VistaSimpleObserver() override = default;
bool m_bObserverEnabled;
void ObserverUpdate(
IVistaObserveable* pObserveable, int nMsg, int nTicket ) override;
private:
std::function< void( IVistaObserveable*, int, int ) > m_fnObserverUpdate;
};
/*============================================================================*/
/* LOCAL VARS AND FUNCS */
/*============================================================================*/
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment