Communication Library for Autonomous Systems v1.0
Reliable and secure communication library for autonomous vehicle systems
Loading...
Searching...
No Matches
observed.h
Go to the documentation of this file.
1#ifndef OBSERVED_H
2#define OBSERVED_H
3
4#include <pthread.h>
5#include "api/util/list.h"
6
7// Forward declarations for Conditional Observer class
8template <typename T, typename Condition>
10
11// Conditionally Observed Class
12template <typename T, typename Condition>
14 public:
19
20 public:
22 virtual ~Conditionally_Data_Observed() = default;
23
26 bool notify(T* d, Condition c);
27 bool notify(T* d);
28
29 protected:
31};
32
33/****************** CONDITIONALLY_DATA_OBSERVED IMPLEMENTATION *************/
34template <typename T, typename C>
38
39template <typename T, typename C>
41 _observers.remove(o);
42}
43
44template <typename T, typename C>
46 bool notified = false;
47
48 for (typename Observers::Iterator obs = _observers.begin(); obs != _observers.end(); ++obs) {
49 if ((*obs)->rank() == c) {
50 (*obs)->update(c, d);
51 notified = true;
52 }
53 }
54
55 return notified;
56}
57
58template <typename T, typename C>
60 bool notified = false;
61
62 for (typename Observers::Iterator obs = _observers.begin(); obs != _observers.end(); ++obs) {
63 (*obs)->update((*obs)->rank(), d);
64 notified = true;
65 }
66
67 return notified;
68}
69
70// Specification for when Condition = void
71template <typename T>
73 public:
77
79 virtual ~Conditionally_Data_Observed() = default;
80
83 bool notify(T* d) {
84 bool notified = false;
85
86 for (typename Observers::Iterator obs = _observers.begin(); obs != _observers.end(); ++obs) {
87 (*obs)->update(d);
88 notified = true;
89 }
90
91 return notified;
92 }
93
94 protected:
96};
97/****************************************************************************/
98
99
100// Foward declaration for Concurrent_Observer Class
101template <typename D, typename C>
103
104// Concurrent Observed
105template<typename D, typename C>
107 friend class Concurrent_Observer<D, C>;
108
109 public:
114
115 public:
118
119 void attach(Observer* o, C c) ;
120 void detach(Observer* o, C c) ;
121 virtual bool notify(D* d, C c);
122
123 protected:
126};
127
128/************************* CONCURRENT_OBSERVED IMPLEMENTATION *****************************/
129template <typename D, typename C>
133
134template <typename D, typename C>
138
139template <typename D, typename C>
141 pthread_mutex_lock(&_mtx);
142 _observers.insert(o);
144}
145
146template <typename D, typename C>
148 pthread_mutex_lock(&_mtx);
149 o->_is_detached = true; // Mark as detached
150 o->detach_signal(); // Signal any blocked threads
151 _observers.remove(o);
153}
154
155template <typename D, typename C>
157 pthread_mutex_lock(&_mtx);
158 bool notified = false;
159
160 for (typename Observers::Iterator obs = _observers.begin(); obs != _observers.end(); ++obs) {
161 if ((*obs)->rank() == c) {
162 (*obs)->update(c, d);
163 notified = true;
164 }
165 }
166
168 return notified;
169}
170
171// Specification for when Condition = void
172template <typename D>
174 friend class Concurrent_Observer<D, void>;
175
176 public:
180
183
189
195
196 bool notify(D* d) {
198 bool notified = false;
199
200 for (typename Observers::Iterator obs = _observers.begin(); obs != _observers.end(); ++obs) {
201 (*obs)->update(d);
202 notified = true;
203 }
204
206 return notified;
207 }
208
209 private:
212};
213
214/*********************************************************************************************/
215
216#endif // OBSERVED_H
List< Observer > Observers
Definition observed.h:179
D Observed_Data
Definition observed.h:177
void attach(Observer *o)
Definition observed.h:184
void detach(Observer *o)
Definition observed.h:190
Concurrent_Observer< D, void > Observer
Definition observed.h:178
~Concurrent_Observed()
Definition observed.h:182
bool notify(D *d)
Definition observed.h:196
Concurrent_Observed()
Definition observed.h:181
Definition observed.h:106
void detach(Observer *o, C c)
Definition observed.h:147
virtual bool notify(D *d, C c)
Definition observed.h:156
Concurrent_Observed()
Definition observed.h:130
C Observing_Condition
Definition observed.h:111
Concurrent_Observer< D, C > Observer
Definition observed.h:112
pthread_mutex_t _mtx
Definition observed.h:124
Ordered_List< Observer, C > Observers
Definition observed.h:113
Observers _observers
Definition observed.h:125
void attach(Observer *o, C c)
Definition observed.h:140
D Observed_Data
Definition observed.h:110
~Concurrent_Observed()
Definition observed.h:135
Definition observer.h:134
Definition observer.h:79
Definition bus.h:10
Definition observer.h:54
Definition observer.h:13
Observers _observers
Definition observed.h:95
bool notify(T *d)
Definition observed.h:83
virtual ~Conditionally_Data_Observed()=default
void attach(Observer *o)
Definition observed.h:81
Conditional_Data_Observer< T, void > Observer
Definition observed.h:75
void detach(Observer *o)
Definition observed.h:82
List< Observer > Observers
Definition observed.h:76
T Observed_Data
Definition observed.h:74
Definition observed.h:13
Observers _observers
Definition observed.h:30
void detach(Observer *o, Condition c)
Definition observed.h:40
virtual ~Conditionally_Data_Observed()=default
Conditional_Data_Observer< T, Condition > Observer
Definition observed.h:17
void attach(Observer *o, Condition c)
Definition observed.h:35
Condition Observing_Condition
Definition observed.h:16
T Observed_Data
Definition observed.h:15
bool notify(T *d, Condition c)
bool notify(T *d)
Definition observed.h:59
Ordered_List< Observer, Condition > Observers
Definition observed.h:18
Definition list.h:9
Definition list.h:25
Iterator begin()
Definition list.h:81
void insert(T *item)
Definition list.h:69
Iterator end()
Definition list.h:86
std::list< Observer * >::iterator Iterator
Definition list.h:27
void remove(T *item)
Definition list.h:75
Select_Debug<(Traits< T >::debugged &&Traits< Debug >::error)> db(Debug_Error l)
Definition debug.h:166