@@ -38,6 +38,9 @@ class ReadFunctor{
38
38
messageType* payloadPointer; // !< -- pointer to the incoming msg data
39
39
MsgHeader *headerPointer; // !< -- pointer to the incoming msg header
40
40
bool initialized; // !< -- flag indicating if the input message is connect to another message
41
+ void * sourceRef; // Generic pointer to store source reference
42
+ void (*refIncCallback)(void *); // Function pointer for increment ref
43
+ void (*refDecCallback)(void *); // Function pointer for decrement ref
41
44
42
45
public:
43
46
// !< -- BSK Logging
@@ -46,10 +49,20 @@ class ReadFunctor{
46
49
47
50
48
51
// ! constructor
49
- ReadFunctor () : initialized(false ) {};
52
+ ReadFunctor () :
53
+ initialized (false ),
54
+ sourceRef (nullptr ),
55
+ refIncCallback (nullptr ),
56
+ refDecCallback (nullptr ) {}
50
57
51
58
// ! constructor
52
- ReadFunctor (messageType* payloadPtr, MsgHeader *headerPtr) : payloadPointer(payloadPtr), headerPointer(headerPtr), initialized(true ){};
59
+ ReadFunctor (messageType* payloadPtr, MsgHeader *headerPtr) :
60
+ payloadPointer (payloadPtr),
61
+ headerPointer (headerPtr),
62
+ initialized (true ),
63
+ sourceRef (nullptr ),
64
+ refIncCallback (nullptr ),
65
+ refDecCallback (nullptr ) {}
53
66
54
67
// ! constructor
55
68
const messageType& operator ()(){
@@ -174,6 +187,43 @@ class ReadFunctor{
174
187
175
188
// ! Recorder method description
176
189
Recorder<messageType> recorder (uint64_t timeDiff = 0 ){return Recorder<messageType>(this , timeDiff);}
190
+
191
+ /* ! Set source reference and callback functions for reference counting
192
+ * @param src Pointer to source object
193
+ * @param incRef Function to increment reference count
194
+ * @param decRef Function to decrement reference count
195
+ */
196
+ void setSourceRef (void * src, void (*incRef)(void *), void (*decRef)(void *)) {
197
+ if (sourceRef && refDecCallback) {
198
+ refDecCallback (sourceRef);
199
+ }
200
+ sourceRef = src;
201
+ refIncCallback = incRef;
202
+ refDecCallback = decRef;
203
+ if (sourceRef && refIncCallback) {
204
+ refIncCallback (sourceRef);
205
+ }
206
+ }
207
+
208
+ /* ! Check if this reader is subscribed to a specific message source
209
+ * @param source Pointer to message source to check
210
+ * @return 1 if subscribed, 0 if not
211
+ */
212
+ uint8_t isSubscribedTo (const Message<messageType>* source) const {
213
+ if (!source) return 0 ;
214
+ return (this ->payloadPointer == source->getPayloadPtr () &&
215
+ this ->headerPointer == source->getHeaderPtr ());
216
+ }
217
+
218
+ /* ! Check if this reader is subscribed to a void pointer source
219
+ * @param source Void pointer to message source to check
220
+ * @return 1 if subscribed, 0 if not
221
+ */
222
+ uint8_t isSubscribedTo (const void * source) const {
223
+ const Message<messageType>* msgSource =
224
+ static_cast <const Message<messageType>*>(source);
225
+ return isSubscribedTo (msgSource);
226
+ }
177
227
};
178
228
179
229
/* ! Write Functor */
@@ -232,6 +282,16 @@ class Message{
232
282
233
283
// ! Return the memory size of the payload, be careful about dynamically sized things
234
284
uint64_t getPayloadSize () {return sizeof (messageType);};
285
+
286
+ /* ! Get pointer to message payload
287
+ * @return Const pointer to payload data
288
+ */
289
+ const messageType* getPayloadPtr () const { return &payload; }
290
+
291
+ /* ! Get pointer to message header
292
+ * @return Const pointer to message header
293
+ */
294
+ const MsgHeader* getHeaderPtr () const { return &header; }
235
295
};
236
296
237
297
0 commit comments