GenericListener.inl
Go to the documentation of this file.
1 namespace iv
2 {
3 
4 //========================= GenericListener ============================
5 template< class Listener >
7  cm( inst, this, "GenericListener" ),
8  inst( inst ),
9  index( index ),
10  initialized( false )
11 {
12  static_assert( std::is_base_of_v< GenericListener< Listener >, Listener >, "Listener must inherit GenericListener< Listener > to allow static down-cast." );
13  this->index->AddListener( static_cast< Listener * >( this ) );
14 }
15 
16 template< class Listener >
18 {
19  this->index->RemoveListener( static_cast< Listener * >( this ) );
20 }
21 
22 template< class Listener >
24 {
25  return this->inst;
26 }
27 
28 template< class Listener >
30 {
31  if( this->initialized )
32  return;
33 
34  this->initialized = true;
35  this->index->InitializeListener( static_cast< Listener * >( this ) );
36 }
37 
38 template< class Listener >
40 {
41  if( !this->initialized )
42  this->cm.warning( SRC_INFO, "Sending event to GenericListener that was not initialized. Call GenericListener< Listener >::Initialize on it after it is fully constructed for proper functionality." );
43 }
44 
45 //========================= GenericListener_Index ============================
46 template< class Listener >
48  cm( inst, this, "GenericListener_Index" ),
49  inst( inst )
50 {
51 }
52 
53 template< class Listener >
55 {
56  return this->inst;
57 }
58 
59 template< class Listener >
61 {
62  this->listeners.insert( listener );
63 }
64 
65 template< class Listener >
67 {
68  this->listeners.erase( listener );
69 }
70 
71 template< class Listener >
73 {
74  this->Listener_Initialize( listener );
75 }
76 
77 template< class Listener >
78 template< class ... Params >
79 void GenericListener_Index< Listener >::InvokeListeners( void( Listener::* member )( Params ... ), Params ... params )
80 {
81  static_assert( std::is_base_of_v< GenericListener< Listener >, Listener >, "Listener should inherit GenericListener< Listener > to allow us to check that it was properly initialized (could be reimplemented, ommiting this QOL feature, if needed)." );
82 
83  this->listeners.foreach(
84  [&]( Listener * listener )
85  {
86  listener->VerifyInitialization();
87  ( listener->*member )( params ... );
88  }
89  );
90 }
91 
92 }