Icarus
Vehicle Simulation as a Transformable Computational Graph, built on Vulcan and Janus
Loading...
Searching...
No Matches
Handle.hpp
Go to the documentation of this file.
1#pragma once
2
10
12
14
15#include <cassert>
16#include <string>
17
18namespace icarus {
19
41template <typename T> class SignalHandle {
42 public:
48 SignalHandle(T *ptr, const SignalDescriptor *meta) : ptr_(ptr), meta_(meta) {}
49
53 SignalHandle() : ptr_(nullptr), meta_(nullptr) {}
54
55 // =========================================================================
56 // Zero-overhead access (hot path)
57 // =========================================================================
58
62 T &operator*() {
63 ICARUS_ASSERT_PTR(ptr_, "SignalHandle::operator*");
64 return *ptr_;
65 }
66 const T &operator*() const {
67 ICARUS_ASSERT_PTR(ptr_, "SignalHandle::operator* const");
68 return *ptr_;
69 }
70
75 ICARUS_ASSERT_PTR(ptr_, "SignalHandle::operator->");
76 return ptr_;
77 }
78 const T *operator->() const {
79 ICARUS_ASSERT_PTR(ptr_, "SignalHandle::operator-> const");
80 return ptr_;
81 }
82
86 T *ptr() { return ptr_; }
87 const T *ptr() const { return ptr_; }
88
89 // =========================================================================
90 // Introspection (cold path)
91 // =========================================================================
92
97 [[nodiscard]] const std::string &name() const {
98 assert(meta_ != nullptr && "Cannot access name() on invalid handle");
99 return meta_->name;
100 }
101
106 [[nodiscard]] const std::string &unit() const {
107 assert(meta_ != nullptr && "Cannot access unit() on invalid handle");
108 return meta_->unit;
109 }
110
115 [[nodiscard]] SignalLifecycle lifecycle() const {
116 assert(meta_ != nullptr && "Cannot access lifecycle() on invalid handle");
117 return meta_->lifecycle;
118 }
119
124 [[nodiscard]] const SignalDescriptor *descriptor() const {
125 assert(meta_ != nullptr && "Cannot access descriptor() on invalid handle");
126 return meta_;
127 }
128
129 // =========================================================================
130 // Validity check
131 // =========================================================================
132
136 explicit operator bool() const { return ptr_ != nullptr; }
137
141 [[nodiscard]] bool valid() const { return ptr_ != nullptr; }
142
143 private:
144 T *ptr_;
145 const SignalDescriptor *meta_;
146};
147
148} // namespace icarus
Core type definitions, concepts, and configuration for Icarus.
#define ICARUS_ASSERT_PTR(ptr, context)
Definition CoreTypes.hpp:260
Signal types and descriptors for the Icarus Signal Backplane.
SignalHandle()
Default constructor (creates invalid handle).
Definition Handle.hpp:53
const SignalDescriptor * descriptor() const
Get the full signal descriptor.
Definition Handle.hpp:124
const T & operator*() const
Definition Handle.hpp:66
T * ptr()
Get raw pointer for integration with Eigen loops.
Definition Handle.hpp:86
const T * ptr() const
Definition Handle.hpp:87
SignalLifecycle lifecycle() const
Get the signal lifecycle.
Definition Handle.hpp:115
const T * operator->() const
Definition Handle.hpp:78
SignalHandle(T *ptr, const SignalDescriptor *meta)
Construct a SignalHandle with pointer and metadata.
Definition Handle.hpp:48
const std::string & name() const
Get the signal name.
Definition Handle.hpp:97
T * operator->()
Arrow operator for member access (if T is a class).
Definition Handle.hpp:74
const std::string & unit() const
Get the signal unit.
Definition Handle.hpp:106
T & operator*()
Dereference to get/set the signal value.
Definition Handle.hpp:62
bool valid() const
Check if handle is valid.
Definition Handle.hpp:141
Definition AggregationTypes.hpp:13
vulcan::io::SignalLifecycle SignalLifecycle
Signal lifecycle (re-exported from Vulcan for consistency).
Definition Signal.hpp:30
Descriptor for a signal on the backplane.
Definition Signal.hpp:136