Helios Engine 0.1.0
A modular ECS based data-oriented C++23 game engine
 
Loading...
Searching...
No Matches
helios::app::details::SystemDiagnostics Class Reference

Provides diagnostic information about system conflicts and validation errors. More...

#include <system_diagnostics.hpp>

Classes

struct  ComponentConflict
 Information about a component conflict between two systems. More...
 
struct  ResourceConflict
 Information about a resource conflict between two systems. More...
 

Static Public Member Functions

static auto AnalyzeComponentConflicts (const AccessPolicy &policy_a, const AccessPolicy &policy_b) -> std::vector< ComponentConflict >
 Analyzes conflicts between two access policies.
 
static auto AnalyzeResourceConflicts (const AccessPolicy &policy_a, const AccessPolicy &policy_b) -> std::vector< ResourceConflict >
 Analyzes resource conflicts between two access policies.
 
static std::string FormatComponentConflicts (std::string_view system_a_name, std::string_view system_b_name, std::span< const ComponentConflict > conflicts)
 Formats component conflict information into human-readable string.
 
static std::string FormatResourceConflicts (std::string_view system_a_name, std::string_view system_b_name, std::span< const ResourceConflict > conflicts)
 Formats resource conflict information into human-readable string.
 
static std::string SummarizeAccessPolicy (const AccessPolicy &policy)
 Generates a summary of access policy for debugging.
 

Detailed Description

Provides diagnostic information about system conflicts and validation errors.

Helper class for generating detailed error messages about scheduling conflicts and access policy violations.

Definition at line 23 of file system_diagnostics.hpp.

Member Function Documentation

◆ AnalyzeComponentConflicts()

auto helios::app::details::SystemDiagnostics::AnalyzeComponentConflicts ( const AccessPolicy policy_a,
const AccessPolicy policy_b 
) -> std::vector<ComponentConflict>
inlinestatic

Analyzes conflicts between two access policies.

Parameters
policy_aFirst access policy
policy_bSecond access policy
Returns
Vector of component conflicts found

Definition at line 133 of file system_diagnostics.hpp.

134 {
135 const auto queries_a = policy_a.GetQueries();
136 const auto queries_b = policy_b.GetQueries();
137
138 std::vector<ComponentConflict> conflicts;
139 conflicts.reserve(queries_a.size() * queries_b.size());
140
141 // Check all query pairs for conflicts
142 for (const auto& query_a : queries_a) {
143 for (const auto& query_b : queries_b) {
144 // Check write-write conflicts
145 const auto write_write = FindIntersection(query_a.write_components, query_b.write_components);
146 for (const auto& component : write_write) {
147 conflicts.emplace_back(component.type_id, component.name, false, "write", "write");
148 }
149
150 // Check write-read conflicts (a writes, b reads)
151 const auto write_read_a = FindIntersection(query_a.write_components, query_b.read_components);
152 for (const auto& component : write_read_a) {
153 conflicts.emplace_back(component.type_id, component.name, true, "write", "read");
154 }
155
156 // Check read-write conflicts (a reads, b writes)
157 const auto read_write_a = FindIntersection(query_a.read_components, query_b.write_components);
158 for (const auto& component : read_write_a) {
159 conflicts.emplace_back(component.type_id, component.name, true, "read", "write");
160 }
161 }
162 }
163
164 return conflicts;
165}

◆ AnalyzeResourceConflicts()

std::vector< SystemDiagnostics::ResourceConflict > helios::app::details::SystemDiagnostics::AnalyzeResourceConflicts ( const AccessPolicy policy_a,
const AccessPolicy policy_b 
) -> std::vector<ResourceConflict>
inlinestatic

Analyzes resource conflicts between two access policies.

Parameters
policy_aFirst access policy
policy_bSecond access policy
Returns
Vector of resource conflicts found

Definition at line 167 of file system_diagnostics.hpp.

168 {
169 const auto read_a = policy_a.GetReadResources();
170 const auto write_a = policy_a.GetWriteResources();
171 const auto read_b = policy_b.GetReadResources();
172 const auto write_b = policy_b.GetWriteResources();
173
174 // Write-write conflicts
175 const auto write_write = FindIntersection(write_a, write_b);
176
177 // Write-read conflicts (a writes, b reads)
178 const auto write_read = FindIntersection(write_a, read_b);
179
180 // Read-write conflicts (a reads, b writes)
181 const auto read_write = FindIntersection(read_a, write_b);
182
183 std::vector<ResourceConflict> conflicts;
184 conflicts.reserve(write_write.size() + write_read.size() + read_write.size());
185
186 for (const auto& resource : write_write) {
187 conflicts.emplace_back(resource.type_id, resource.name, false, "write", "write");
188 }
189
190 for (const auto& resource : write_read) {
191 conflicts.emplace_back(resource.type_id, resource.name, true, "write", "read");
192 }
193
194 for (const auto& resource : read_write) {
195 conflicts.emplace_back(resource.type_id, resource.name, true, "read", "write");
196 }
197
198 return conflicts;
199}

◆ FormatComponentConflicts()

std::string helios::app::details::SystemDiagnostics::FormatComponentConflicts ( std::string_view  system_a_name,
std::string_view  system_b_name,
std::span< const ComponentConflict conflicts 
)
inlinestatic

Formats component conflict information into human-readable string.

Parameters
system_a_nameName of first system
system_b_nameName of second system
conflictsList of component conflicts
Returns
Formatted error message

Definition at line 201 of file system_diagnostics.hpp.

203 {
204 if (conflicts.empty()) {
205 return "";
206 }
207
208 std::string result = std::format("Component conflicts between '{}' and '{}':\n", system_a_name, system_b_name);
209 for (const auto& conflict : conflicts) {
210 result += std::format(" - {} ({}: {}, {}: {})\n", conflict.component_name, system_a_name, conflict.system_a_access,
211 system_b_name, conflict.system_b_access);
212 }
213
214 return result;
215}

◆ FormatResourceConflicts()

std::string helios::app::details::SystemDiagnostics::FormatResourceConflicts ( std::string_view  system_a_name,
std::string_view  system_b_name,
std::span< const ResourceConflict conflicts 
)
inlinestatic

Formats resource conflict information into human-readable string.

Parameters
system_a_nameName of first system
system_b_nameName of second system
conflictsList of resource conflicts
Returns
Formatted error message

Definition at line 217 of file system_diagnostics.hpp.

219 {
220 if (conflicts.empty()) {
221 return {};
222 }
223
224 std::string result = std::format("Resource conflicts between '{}' and '{}':\n", system_a_name, system_b_name);
225
226 for (const auto& conflict : conflicts) {
227 result += std::format(" - {} ({}: {}, {}: {})\n", conflict.resource_name, system_a_name, conflict.system_a_access,
228 system_b_name, conflict.system_b_access);
229 }
230 return result;
231}

◆ SummarizeAccessPolicy()

std::string helios::app::details::SystemDiagnostics::SummarizeAccessPolicy ( const AccessPolicy policy)
inlinestatic

Generates a summary of access policy for debugging.

Parameters
policyAccess policy to summarize
Returns
Human-readable summary string

Definition at line 233 of file system_diagnostics.hpp.

233 {
234 std::string result = "Access Policy Summary:\n";
235
236 // Summarize queries
237 const auto queries = policy.GetQueries();
238 if (!queries.empty()) {
239 result += std::format(" Queries ({}):\n", queries.size());
240 for (size_t i = 0; i < queries.size(); ++i) {
241 const auto& query = queries[i];
242 result += std::format(" Query {}:\n", i);
243
244 if (!query.read_components.empty()) {
245 result += " Read: ";
246 for (const auto& comp : query.read_components) {
247 result += std::format("{}, ", comp.name);
248 }
249 result += "\n";
250 }
251
252 if (!query.write_components.empty()) {
253 result += " Write: ";
254 for (const auto& comp : query.write_components) {
255 result += std::format("{}, ", comp.name);
256 }
257 result += "\n";
258 }
259 }
260 }
261
262 // Summarize resources
263 const auto read_resources = policy.GetReadResources();
264 const auto write_resources = policy.GetWriteResources();
265
266 if (!read_resources.empty()) {
267 result += " Read Resources: ";
268 for (const auto& res : read_resources) {
269 result += std::format("{}, ", res.name);
270 }
271 result += "\n";
272 }
273
274 if (!write_resources.empty()) {
275 result += " Write Resources: ";
276 for (const auto& res : write_resources) {
277 result += std::format("{}, ", res.name);
278 }
279 result += "\n";
280 }
281
282 if (queries.empty() && read_resources.empty() && write_resources.empty()) {
283 result += " (No data access declared)\n";
284 }
285
286 return result;
287}