@@ -223,6 +223,55 @@ namespace XSwiftBus
223
223
XPLMDataRef m_ref;
224
224
};
225
225
226
+ /* !
227
+ * Class providing a custom variable + dataref
228
+ * \tparam DataRefTraits The trait class representing the dataref.
229
+ */
230
+ template <class DataRefTraits >
231
+ class CustomDataRef
232
+ {
233
+ public:
234
+ // ! Constructor
235
+ CustomDataRef ()
236
+ {
237
+ if constexpr (std::is_same_v<typename DataRefTraits::type, int >)
238
+ {
239
+ m_ref = XPLMRegisterDataAccessor (DataRefTraits::name (), xplmType_Int, 0 , read , NULL , NULL , NULL , NULL ,
240
+ NULL , NULL , NULL , NULL , NULL , NULL , NULL , this , NULL );
241
+ }
242
+ else { static_assert (false , " Unsupported type" ); }
243
+ if (!m_ref)
244
+ {
245
+ XPLMDebugString (" Missing dataref:" );
246
+ XPLMDebugString (DataRefTraits::name ());
247
+ XPLMDebugString (" \n " );
248
+ }
249
+ }
250
+
251
+ CustomDataRef (const CustomDataRef &) = delete ;
252
+ CustomDataRef &operator =(const CustomDataRef &) = delete ;
253
+ CustomDataRef (CustomDataRef &&other) = default ;
254
+ CustomDataRef &operator =(CustomDataRef &&other) = default ;
255
+ ~CustomDataRef () { XPLMUnregisterDataAccessor (m_ref); }
256
+
257
+ static typename DataRefTraits::type read (void *refcon)
258
+ {
259
+ return reinterpret_cast <CustomDataRef *>(refcon)->get ();
260
+ }
261
+
262
+ // ! True if the dataref exists
263
+ bool isValid () const { return m_ref != nullptr ; }
264
+
265
+ // ! Set the value
266
+ void set (typename DataRefTraits::type val) { m_datarefVal = val; }
267
+
268
+ // ! Get the value
269
+ typename DataRefTraits::type get () const { return m_datarefVal; }
270
+
271
+ XPLMDataRef m_ref;
272
+ typename DataRefTraits::type m_datarefVal;
273
+ };
274
+
226
275
template <>
227
276
inline void DataRefImpl::implSet<int >(int d)
228
277
{
0 commit comments