20#ifndef LLVMEXPR_ANALYSIS_FRAMEWORK_ANALYSIS_RESULTS_HPP
21#define LLVMEXPR_ANALYSIS_FRAMEWORK_ANALYSIS_RESULTS_HPP
28#include <unordered_map>
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()) {
39 std::format(
"Analysis result not available for pass: {}",
40 typeid(PassT).name()));
42 return std::any_cast<typename PassT::Result&>(it->second);
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()) {
50 std::format(
"Analysis result not available for pass: {}",
51 typeid(PassT).name()));
53 return std::any_cast<const typename PassT::Result&>(it->second);
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));
61 template <
typename PassT> [[nodiscard]]
bool hasResult()
const {
62 return results.contains(std::type_index(
typeid(PassT)));
66 results.erase(std::type_index(
typeid(PassT)));
70 results.erase(pass_type);
73 void clear() { results.clear(); }
75 [[nodiscard]]
const std::unordered_map<std::type_index, std::any>&
81 std::unordered_map<std::type_index, std::any> results;
void invalidate(const std::type_index &pass_type)
const std::unordered_map< std::type_index, std::any > & getAll() const
PassT::Result & getResult()
void setResult(typename PassT::Result &&result)
const PassT::Result & getResult() const