VapourSynth-llvmexpr
Loading...
Searching...
No Matches
AnalysisResults.hpp
Go to the documentation of this file.
1
19
20#ifndef LLVMEXPR_ANALYSIS_FRAMEWORK_ANALYSIS_RESULTS_HPP
21#define LLVMEXPR_ANALYSIS_FRAMEWORK_ANALYSIS_RESULTS_HPP
22
23#include "AnalysisError.hpp"
24
25#include <any>
26#include <format>
27#include <typeindex>
28#include <unordered_map>
29
30namespace analysis {
31
33 public:
34 template <typename PassT> typename PassT::Result& getResult() {
35 auto key = std::type_index(typeid(PassT));
36 auto it = results.find(key);
37 if (it == results.end()) {
38 throw AnalysisError(
39 std::format("Analysis result not available for pass: {}",
40 typeid(PassT).name()));
41 }
42 return std::any_cast<typename PassT::Result&>(it->second);
43 }
44
45 template <typename PassT> const typename PassT::Result& getResult() const {
46 auto key = std::type_index(typeid(PassT));
47 auto it = results.find(key);
48 if (it == results.end()) {
49 throw AnalysisError(
50 std::format("Analysis result not available for pass: {}",
51 typeid(PassT).name()));
52 }
53 return std::any_cast<const typename PassT::Result&>(it->second);
54 }
55
56 template <typename PassT> void setResult(typename PassT::Result&& result) {
57 auto key = std::type_index(typeid(PassT));
58 results[key] = std::any(std::move(result));
59 }
60
61 template <typename PassT> [[nodiscard]] bool hasResult() const {
62 return results.contains(std::type_index(typeid(PassT)));
63 }
64
65 template <typename PassT> void invalidate() {
66 results.erase(std::type_index(typeid(PassT)));
67 }
68
69 void invalidate(const std::type_index& pass_type) {
70 results.erase(pass_type);
71 }
72
73 void clear() { results.clear(); }
74
75 [[nodiscard]] const std::unordered_map<std::type_index, std::any>&
76 getAll() const {
77 return results;
78 }
79
80 private:
81 std::unordered_map<std::type_index, std::any> results;
82};
83
84} // namespace analysis
85
86#endif // LLVMEXPR_ANALYSIS_FRAMEWORK_ANALYSIS_RESULTS_HPP
void invalidate(const std::type_index &pass_type)
const std::unordered_map< std::type_index, std::any > & getAll() const
void setResult(typename PassT::Result &&result)
const PassT::Result & getResult() const