Communication Library for Autonomous Systems v1.0
Reliable and secure communication library for autonomous vehicle systems
Loading...
Searching...
No Matches
observer.h
Go to the documentation of this file.
1#ifndef OBSERVER_H
2#define OBSERVER_H
3
4#include <semaphore.h>
5#include "api/util/list.h"
6
7// Forward declarations for Conditionally_Data_Observed class
8template <typename T, typename Condition>
10
11// Fundamentals for Observer X Observed
12template <typename T, typename Condition>
15
16 public:
20
22 virtual ~Conditional_Data_Observer() = default;
23
24 virtual void update(Condition c, Observed_Data* d);
25 virtual T* updated();
26
27 const Condition rank() { return _rank; };
28
29 protected:
32};
33
34/*********************** CONDITIONAL_DATA_OBSERVER IMPLEMENTATION ************************/
35template <typename T, typename Condition>
39
40template <typename T, typename Condition>
42 if (c == _rank) {
43 _data.insert(d);
44 }
45}
46
47template <typename T, typename Condition>
49 return _data.empty() ? nullptr : _data.remove();
50}
51
52// Specificaton for when Condition = void
53template <typename T>
55 friend class Conditionally_Data_Observed<T, void>;
56
57 public:
60
62 virtual ~Conditional_Data_Observer() = default;
63
64 virtual void update(Observed_Data* d) { _data.insert(d); }
65 virtual T* updated() { return _data.empty() ? nullptr : _data.remove(); }
66
67 protected:
69};
70/*****************************************************************************************/
71
72
73// Foward declaration for Concurrent_Observed class;
74template <typename D, typename C>
76
77// Conditional Observer x Conditionally Observed with Data decoupled by a Semaphore
78template<typename D, typename C>
80 friend class Concurrent_Observed<D, C>;
81
82 public:
86
87 public:
90
91 void update(C c, D* d) override;
93
94 // Signal detach to unblock any waiting threads
96 sem_post(&_semaphore);
97 }
98
99 private:
100 sem_t _semaphore;
101 bool _is_detached{false};
102};
103
104/***************** CONCURRENT_OBSERVER IMPLEMENTATION *************************/
105template <typename D, typename C>
109
110template <typename D, typename C>
114
115template <typename D, typename C>
117 if (c == this->_rank) {
118 this->_data.insert(d);
119 sem_post(&_semaphore);
120 }
121}
122
123template <typename D, typename C>
125 sem_wait(&_semaphore);
126 if (_is_detached) {
127 return nullptr;
128 }
129 return this->_data.remove();
130}
131
132// Specification for when Condition = void
133template <typename D>
135 friend class Concurrent_Observed<D, void>;
136
137 public:
140
141 Concurrent_Observer() { sem_init(&_semaphore, 0, 0); };
143
144 void update(D* d) {
145 this->_data.insert(d);
146 sem_post(&_semaphore);
147 };
148
150 sem_wait(&_semaphore);
151 return this->_data.remove();
152 }
153
154 private:
155 sem_t _semaphore;
156};
157/*******************************************************************************/
158
159#endif // OBSERVER_H
Definition observed.h:106
Concurrent_Observed< D, void > Observed
Definition observer.h:139
D Observed_Data
Definition observer.h:138
~Concurrent_Observer()
Definition observer.h:142
Concurrent_Observer()
Definition observer.h:141
void update(D *d)
Definition observer.h:144
D * updated()
Definition observer.h:149
Definition observer.h:79
C Observing_Condition
Definition observer.h:84
~Concurrent_Observer()
Definition observer.h:111
D Observed_Data
Definition observer.h:83
void detach_signal()
Definition observer.h:95
D * updated()
Definition observer.h:124
void update(C c, D *d) override
Definition observer.h:116
Concurrent_Observed< D, C > Observed
Definition observer.h:85
Concurrent_Observer(C rank)
Definition observer.h:106
Definition bus.h:10
T Observed_Data
Definition observer.h:58
List< T > _data
Definition observer.h:68
Conditionally_Data_Observed< T, void > Observed
Definition observer.h:59
virtual void update(Observed_Data *d)
Definition observer.h:64
virtual ~Conditional_Data_Observer()=default
virtual T * updated()
Definition observer.h:65
Definition observer.h:13
T Observed_Data
Definition observer.h:17
Condition Observing_Condition
Definition observer.h:18
List< T > _data
Definition observer.h:31
const Condition rank()
Definition observer.h:27
virtual T * updated()
Definition observer.h:48
virtual ~Conditional_Data_Observer()=default
Conditional_Data_Observer(Condition c)
Definition observer.h:36
Condition _rank
Definition observer.h:30
virtual void update(Condition c, Observed_Data *d)
Definition observer.h:41
Conditionally_Data_Observed< T, Condition > Observed
Definition observer.h:19
Definition observed.h:13
Definition list.h:9
void insert(T *item)
Definition list.h:45
T * remove()
Definition list.h:51
Select_Debug<(Traits< T >::debugged &&Traits< Debug >::error)> db(Debug_Error l)
Definition debug.h:166