Logo
ApraPipes 1.0
Loading...
Searching...
No Matches
FrameTypeRegistry.h
1// ============================================================
2// File: declarative/FrameTypeRegistry.h
3// Frame Type Registry for declarative pipeline validation
4// Task A3: FrameType Registry
5// ============================================================
6
7#pragma once
8
9#include <string>
10#include <string_view>
11#include <vector>
12#include <map>
13#include <array>
14#include <mutex>
15
16namespace apra {
17
18// ============================================================
19// FrameTypeDef - Compile-time frame type definition
20// Used in REGISTER_FRAME_TYPE macro
21// ============================================================
23 std::string_view name;
24 std::string_view parent; // Empty for root types
25 std::string_view description;
26
27 // Tags for categorization
28 static constexpr size_t MAX_TAGS = 8;
29 std::array<std::string_view, MAX_TAGS> tags = {};
30 size_t tag_count = 0;
31
32 // Attributes (metadata fields on this frame type)
33 struct AttrDef {
34 std::string_view name;
35 std::string_view type; // "int", "float", "bool", "string"
36 bool required = true;
37 std::string_view description;
38 };
39 static constexpr size_t MAX_ATTRS = 16;
40 std::array<AttrDef, MAX_ATTRS> attributes = {};
41 size_t attr_count = 0;
42
43 // Factory methods
44 template<size_t N>
45 static constexpr FrameTypeDef create(
46 std::string_view name,
47 std::string_view parent,
48 std::string_view description,
49 const std::array<std::string_view, N>& tagArr
50 ) {
51 FrameTypeDef def;
52 def.name = name;
53 def.parent = parent;
55 def.tag_count = N;
56 for (size_t i = 0; i < N && i < MAX_TAGS; ++i) {
57 def.tags[i] = tagArr[i];
58 }
59 return def;
60 }
61};
62
63// ============================================================
64// FrameTypeInfo - Runtime representation of frame type
65// ============================================================
67 std::string name;
68 std::string parent; // Empty for root types
69 std::string description;
70 std::vector<std::string> tags;
71
72 struct AttrInfo {
73 std::string name;
74 std::string type; // "int", "float", "bool", "string", "enum"
75 bool required = true;
76 std::vector<std::string> enum_values;
77 std::string description;
78 };
79 std::vector<AttrInfo> attributes;
80};
81
82// ============================================================
83// FrameTypeRegistry - Central registry for frame types
84// Thread-safe singleton with hierarchy queries
85// ============================================================
87public:
88 // Singleton access
90
91 // Registration
93
94 // Basic queries
95 bool hasFrameType(const std::string& name) const;
96 const FrameTypeInfo* getFrameType(const std::string& name) const;
97 std::vector<std::string> getAllFrameTypes() const;
98
99 // Tag queries
100 std::vector<std::string> getFrameTypesByTag(const std::string& tag) const;
101
102 // Hierarchy queries
103 std::string getParent(const std::string& name) const;
104 std::vector<std::string> getSubtypes(const std::string& name) const;
105 std::vector<std::string> getAncestors(const std::string& name) const;
106
107 // Compatibility checks (for validator)
108 bool isSubtype(const std::string& child, const std::string& parent) const;
109 bool isCompatible(const std::string& outputType, const std::string& inputType) const;
110
111 // Export
112 std::string toJson() const;
113 std::string toMarkdown() const; // Hierarchy diagram
114
115 // Clear registry (for testing)
116 void clear();
117
118 // Get count
119 size_t size() const;
120
121private:
122 FrameTypeRegistry() = default;
124
125 // Prevent copying
128
129 std::map<std::string, FrameTypeInfo> types_;
130 mutable std::mutex mutex_;
131
132 // Cache for hierarchy queries (invalidated on registration)
133 mutable std::map<std::string, std::vector<std::string>> ancestorCache_;
134 mutable bool cacheValid_ = false;
135
136 void invalidateCache() const;
137};
138
139// ============================================================
140// Helper to convert FrameTypeDef to FrameTypeInfo
141// ============================================================
142namespace detail {
143
145 FrameTypeInfo info;
146 info.name = std::string(def.name);
147 info.parent = std::string(def.parent);
148 info.description = std::string(def.description);
149
150 for (size_t i = 0; i < def.tag_count && i < FrameTypeDef::MAX_TAGS; ++i) {
151 info.tags.push_back(std::string(def.tags[i]));
152 }
153
154 for (size_t i = 0; i < def.attr_count && i < FrameTypeDef::MAX_ATTRS; ++i) {
156 attr.name = std::string(def.attributes[i].name);
157 attr.type = std::string(def.attributes[i].type);
158 attr.required = def.attributes[i].required;
159 attr.description = std::string(def.attributes[i].description);
160 info.attributes.push_back(attr);
161 }
162
163 return info;
164}
165
166} // namespace detail
167
168// ============================================================
169// REGISTER_FRAME_TYPE Macro
170// Registers a frame type at static initialization time
171//
172// Usage:
173// REGISTER_FRAME_TYPE(H264Frame)
174//
175// Requirements:
176// - FrameClass must have a nested `Metadata` struct with:
177// - static constexpr std::string_view name
178// - static constexpr std::string_view parent
179// - static constexpr std::string_view description
180// - static constexpr std::array<std::string_view, N> tags
181// ============================================================
182#define REGISTER_FRAME_TYPE(FrameClass) \
183 namespace { \
184 static bool _registered_ft_##FrameClass = []() { \
185 apra::FrameTypeInfo info; \
186 info.name = std::string(FrameClass::Metadata::name); \
187 info.parent = std::string(FrameClass::Metadata::parent); \
188 info.description = std::string(FrameClass::Metadata::description); \
189 \
190 for (const auto& tag : FrameClass::Metadata::tags) { \
191 info.tags.push_back(std::string(tag)); \
192 } \
193 \
194 apra::FrameTypeRegistry::instance().registerFrameType(std::move(info)); \
195 return true; \
196 }(); \
197 }
198
199} // namespace apra
Definition FrameTypeRegistry.h:86
bool hasFrameType(const std::string &name) const
Definition FrameTypeRegistry.cpp:44
FrameTypeRegistry & operator=(const FrameTypeRegistry &)=delete
bool cacheValid_
Definition FrameTypeRegistry.h:134
std::string toMarkdown() const
Definition FrameTypeRegistry.cpp:207
void registerFrameType(FrameTypeInfo info)
Definition FrameTypeRegistry.cpp:28
FrameTypeRegistry(const FrameTypeRegistry &)=delete
std::vector< std::string > getAllFrameTypes() const
Definition FrameTypeRegistry.cpp:58
std::string toJson() const
Definition FrameTypeRegistry.cpp:166
bool isCompatible(const std::string &outputType, const std::string &inputType) const
Definition FrameTypeRegistry.cpp:155
bool isSubtype(const std::string &child, const std::string &parent) const
Definition FrameTypeRegistry.cpp:146
std::vector< std::string > getSubtypes(const std::string &name) const
Definition FrameTypeRegistry.cpp:98
std::map< std::string, FrameTypeInfo > types_
Definition FrameTypeRegistry.h:129
void invalidateCache() const
Definition FrameTypeRegistry.cpp:269
std::vector< std::string > getFrameTypesByTag(const std::string &tag) const
Definition FrameTypeRegistry.cpp:72
std::mutex mutex_
Definition FrameTypeRegistry.h:130
std::vector< std::string > getAncestors(const std::string &name) const
Definition FrameTypeRegistry.cpp:111
const FrameTypeInfo * getFrameType(const std::string &name) const
Definition FrameTypeRegistry.cpp:49
static FrameTypeRegistry & instance()
Definition FrameTypeRegistry.cpp:19
std::string getParent(const std::string &name) const
Definition FrameTypeRegistry.cpp:89
std::map< std::string, std::vector< std::string > > ancestorCache_
Definition FrameTypeRegistry.h:133
void clear()
Definition FrameTypeRegistry.cpp:258
size_t size() const
Definition FrameTypeRegistry.cpp:264
FrameTypeInfo toFrameTypeInfo(const FrameTypeDef &def)
Definition FrameTypeRegistry.h:144
Definition FrameTypeRegistrations.h:10
Definition FrameTypeRegistry.h:33
std::string_view type
Definition FrameTypeRegistry.h:35
bool required
Definition FrameTypeRegistry.h:36
std::string_view name
Definition FrameTypeRegistry.h:34
std::string_view description
Definition FrameTypeRegistry.h:37
Definition FrameTypeRegistry.h:22
size_t tag_count
Definition FrameTypeRegistry.h:30
std::string_view name
Definition FrameTypeRegistry.h:23
std::string_view description
Definition FrameTypeRegistry.h:25
std::array< std::string_view, MAX_TAGS > tags
Definition FrameTypeRegistry.h:29
size_t attr_count
Definition FrameTypeRegistry.h:41
std::string_view parent
Definition FrameTypeRegistry.h:24
std::array< AttrDef, MAX_ATTRS > attributes
Definition FrameTypeRegistry.h:40
static constexpr size_t MAX_TAGS
Definition FrameTypeRegistry.h:28
static constexpr size_t MAX_ATTRS
Definition FrameTypeRegistry.h:39
static constexpr FrameTypeDef create(std::string_view name, std::string_view parent, std::string_view description, const std::array< std::string_view, N > &tagArr)
Definition FrameTypeRegistry.h:45
Definition FrameTypeRegistry.h:72
std::vector< std::string > enum_values
Definition FrameTypeRegistry.h:76
bool required
Definition FrameTypeRegistry.h:75
std::string type
Definition FrameTypeRegistry.h:74
std::string description
Definition FrameTypeRegistry.h:77
std::string name
Definition FrameTypeRegistry.h:73
Definition FrameTypeRegistry.h:66
std::vector< AttrInfo > attributes
Definition FrameTypeRegistry.h:79
std::vector< std::string > tags
Definition FrameTypeRegistry.h:70
std::string parent
Definition FrameTypeRegistry.h:68
std::string description
Definition FrameTypeRegistry.h:69
std::string name
Definition FrameTypeRegistry.h:67