Scroom 0.14-48-ga0fee447
Loading...
Searching...
No Matches
Scroom::Utils::Observable< T > Class Template Reference

#include <observable.hh>

Inheritance diagram for Scroom::Utils::Observable< T >:
Inheritance graph
Collaboration diagram for Scroom::Utils::Observable< T >:
Collaboration graph

Public Types

using Observer = std::shared_ptr< T >
 
using Ptr = std::shared_ptr< Observable< T > >
 

Public Member Functions

 Observable ()
 
 ~Observable () override
 
 Observable (const Observable &)=delete
 
 Observable (Observable &&)=delete
 
Observable operator= (const Observable &)=delete
 
Observable operator= (Observable &&)=delete
 
Scroom::Bookkeeping::Token registerStrongObserver (Observer const &observer)
 
Scroom::Bookkeeping::Token registerObserver (ObserverWeak const &observer)
 
- Public Member Functions inherited from Scroom::Utils::Base
 Base ()=default
 
 Base (const Base &)=delete
 
 Base (Base &&)=delete
 
Baseoperator= (const Base &)=delete
 
Baseoperator= (Base &&)=delete
 
virtual ~Base ()=default
 
template<typename R >
std::shared_ptr< R > shared_from_this ()
 
template<typename R >
std::shared_ptr< R const > shared_from_this () const
 

Protected Member Functions

std::list< ObservergetObservers ()
 
virtual void observerAdded (Observer const &observer, Scroom::Bookkeeping::Token const &token)
 

Private Types

using ObserverWeak = std::weak_ptr< T >
 
using Registration = Detail::Registration< T >
 

Private Member Functions

void unregisterObserver (ObserverWeak const &observer)
 

Private Attributes

Scroom::Bookkeeping::Map< ObserverWeak, typenameRegistration::Ptr >::Ptr registrationMap
 

Friends

class Detail::Registration< T >
 

Detailed Description

template<typename T>
class Scroom::Utils::Observable< T >

Base class for something that accepts observers.

Upon registering, observers are given a Registration. If the same Observer registers twice (using the same method), he'll still receive events only once. When the Observer destroys his Registration, he'll be unregistered.

There are two ways of registering: One can register a shared_ptr, or a weak_ptr, depending on whether you want the Observable to keep the Observer from being destructed.

Note
When you register one Observer with both a shared_ptr and a weak_ptr, unpredictable things will happen.

Member Typedef Documentation

◆ Observer

template<typename T >
using Scroom::Utils::Observable< T >::Observer = std::shared_ptr<T>

◆ ObserverWeak

template<typename T >
using Scroom::Utils::Observable< T >::ObserverWeak = std::weak_ptr<T>
private

◆ Ptr

template<typename T >
using Scroom::Utils::Observable< T >::Ptr = std::shared_ptr<Observable<T> >

◆ Registration

template<typename T >
using Scroom::Utils::Observable< T >::Registration = Detail::Registration<T>
private

Constructor & Destructor Documentation

◆ Observable() [1/3]

template<typename T >
Scroom::Utils::Observable< T >::Observable ( )
172 {
174 }
static Ptr create()
Definition bookkeepingimpl.hh:424
Scroom::Bookkeeping::Map< ObserverWeak, typenameRegistration::Ptr >::Ptr registrationMap
Definition observable.hh:82
Here is the call graph for this function:

◆ ~Observable()

template<typename T >
Scroom::Utils::Observable< T >::~Observable ( )
override
178 {
179 // Destroy strong references to any observers
180 //
181 // The one holding the token of the registration is in control
182 // of the lifetime of the registration objects. Hence, as long
183 // as the Token is valid, a reference to the Registration will
184 // exist, which may, in turn, contain a (strong) reference to an
185 // Observer. This is not desirable. As soon as the observable is
186 // deleted (which is now), it should no longer hold any
187 // references to any Observers. Hence, we should manually reset
188 // references to observers here.
189 for(const typename Registration::Ptr& registration: registrationMap->values())
190 {
191 registration->o.reset();
192 }
193 }
std::shared_ptr< Registration< T > > Ptr
Definition observable.hh:40
Stuff registration
Definition observable-tests.cc:96

◆ Observable() [2/3]

template<typename T >
Scroom::Utils::Observable< T >::Observable ( const Observable< T > &  )
delete

◆ Observable() [3/3]

template<typename T >
Scroom::Utils::Observable< T >::Observable ( Observable< T > &&  )
delete

Member Function Documentation

◆ getObservers()

template<typename T >
std::list< typename Observable< T >::Observer > Scroom::Utils::Observable< T >::getObservers ( )
protected

Retrieve a list of current observers.

Always, a list of shared_ptr objects is returned, regardless of whether the Observer registered a shared_ptr or a weak_ptr.

197 {
198 std::list<typename Observable<T>::Observer> result;
199 for(const typename Registration::Ptr& registration: registrationMap->values())
200 {
201 Observer const o = registration->observer.lock();
202 if(o)
203 {
204 result.push_back(o);
205 }
206 }
207
208 return result;
209 }
std::shared_ptr< T > Observer
Definition observable.hh:73
SampleIterator< const uint8_t > result
Definition sampleiterator-tests.cc:94

Referenced by PresentationBase::close(), TestObservable::getObservers(), TestRecursiveObservable::getObservers(), CompressedTile::notifyObservers(), PresentationBase::open(), TileViewState::reportDone(), and CompressedTile::reportFinished().

Here is the caller graph for this function:

◆ observerAdded()

template<typename T >
void Scroom::Utils::Observable< T >::observerAdded ( Observer const &  observer,
Scroom::Bookkeeping::Token const &  token 
)
protectedvirtual

Override this function if you want to be notified of new observers registering.

259 {
260 // Do nothing
261 }

◆ operator=() [1/2]

template<typename T >
Observable Scroom::Utils::Observable< T >::operator= ( const Observable< T > &  )
delete

◆ operator=() [2/2]

template<typename T >
Observable Scroom::Utils::Observable< T >::operator= ( Observable< T > &&  )
delete

◆ registerObserver()

template<typename T >
Scroom::Bookkeeping::Token Scroom::Utils::Observable< T >::registerObserver ( ObserverWeak const &  observer)
233 {
236 if(r)
237 {
238 r->set(observer);
239 }
240 else
241 {
244 }
245
247
248 return t;
249 }
V get(const K &k)
Definition bookkeepingimpl.hh:332
Token reReserve(const K &k)
Definition bookkeepingimpl.hh:228
void set(const K &k, const V &v)
Definition bookkeepingimpl.hh:313
Definition bookkeeping.hh:50
std::shared_ptr< R > shared_from_this()
Definition utilities.hh:48
static Ptr create(std::weak_ptr< Observable< T > > observable, std::shared_ptr< T > observer)
Definition observable.hh:156
virtual void observerAdded(Observer const &observer, Scroom::Bookkeeping::Token const &token)
Definition observable.hh:258
TestObserver::Ptr observer
Definition observable-tests.cc:91
ThreadPool t(0)
Scroom::Utils::Rectangle< double > const r
Definition transformpresentation_test.cc:65

Referenced by CompressedTile::registerObserver(), and CompressedTile::registerObserver().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ registerStrongObserver()

template<typename T >
Scroom::Bookkeeping::Token Scroom::Utils::Observable< T >::registerStrongObserver ( Observer const &  observer)
213 {
216 if(r)
217 {
218 r->set(observer);
219 }
220 else
221 {
224 }
225
227
228 return t;
229 }

Referenced by CompressedTile::registerStrongObserver(), and CompressedTile::registerStrongObserver().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ unregisterObserver()

template<typename T >
void Scroom::Utils::Observable< T >::unregisterObserver ( ObserverWeak const &  observer)
private
253 {
255 }
void remove(const K &k)
Definition bookkeepingimpl.hh:283

Friends And Related Symbol Documentation

◆ Detail::Registration< T >

template<typename T >
friend class Detail::Registration< T >
friend

Member Data Documentation

◆ registrationMap

template<typename T >
Scroom::Bookkeeping::Map<ObserverWeak,typenameRegistration::Ptr>::Ptr Scroom::Utils::Observable< T >::registrationMap
private

Map all registrations to their registration data


The documentation for this class was generated from the following file: