QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
StateContext.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QHash>
4#include <QtCore/QString>
5#include <QtCore/QVariant>
6
7#include <any>
8#include <optional>
9#include <typeinfo>
10
32{
33public:
34 StateContext() = default;
35 ~StateContext() = default;
36
37 // -------------------------------------------------------------------------
38 // Type-safe API (preferred)
39 // -------------------------------------------------------------------------
40
44 template<typename T>
45 void set(const QString& key, T&& value)
46 {
47 _data[key] = std::any(std::forward<T>(value));
48 }
49
53 template<typename T>
54 std::optional<T> get(const QString& key) const
55 {
56 auto it = _data.find(key);
57 if (it == _data.end()) {
58 return std::nullopt;
59 }
60
61 try {
62 return std::any_cast<T>(it.value());
63 } catch (const std::bad_any_cast&) {
64 return std::nullopt;
65 }
66 }
67
72 template<typename T>
73 T getOr(const QString& key, const T& defaultValue) const
74 {
75 auto result = get<T>(key);
76 return result.value_or(defaultValue);
77 }
78
82 bool contains(const QString& key) const
83 {
84 return _data.contains(key);
85 }
86
90 template<typename T>
91 bool containsType(const QString& key) const
92 {
93 auto it = _data.find(key);
94 if (it == _data.end()) {
95 return false;
96 }
97 return it.value().type() == typeid(T);
98 }
99
103 bool remove(const QString& key)
104 {
105 return _data.remove(key);
106 }
107
109 void clear()
110 {
111 _data.clear();
112 }
113
115 int count() const
116 {
117 return _data.count();
118 }
119
121 QStringList keys() const
122 {
123 return _data.keys();
124 }
125
126 // -------------------------------------------------------------------------
127 // QVariant API (for QML compatibility)
128 // -------------------------------------------------------------------------
129
131 void setVariant(const QString& key, const QVariant& value)
132 {
133 _variantData[key] = value;
134 }
135
137 QVariant variant(const QString& key) const
138 {
139 return _variantData.value(key);
140 }
141
143 bool containsVariant(const QString& key) const
144 {
145 return _variantData.contains(key);
146 }
147
148private:
149 QHash<QString, std::any> _data;
150 QHash<QString, QVariant> _variantData;
151};
Type-safe context for passing data between states in a state machine.
QVariant variant(const QString &key) const
Retrieve a QVariant value.
void clear()
Clear all stored values.
~StateContext()=default
T getOr(const QString &key, const T &defaultValue) const
bool containsType(const QString &key) const
bool remove(const QString &key)
bool contains(const QString &key) const
int count() const
Get the number of stored values.
std::optional< T > get(const QString &key) const
void set(const QString &key, T &&value)
QStringList keys() const
Get all keys in the context.
StateContext()=default
void setVariant(const QString &key, const QVariant &value)
Store a QVariant value.
bool containsVariant(const QString &key) const
Check if a variant key exists.