docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
analysis.h
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4#include <mutex>
5#include <typeindex>
6#include <unordered_map>
7
8namespace docc {
9namespace analysis {
10
11class SDFGRegistry;
12class AnalysisManager;
13
14class Analysis {
15 friend class AnalysisManager;
16 virtual void anchor();
17
18protected:
19 virtual void run(AnalysisManager& AM) = 0;
20
21public:
22 virtual ~Analysis() = default;
23};
24
26 friend class SDFGRegistry;
27
28private:
29 std::recursive_mutex lock_;
30 std::unordered_map<std::type_index, std::unique_ptr<Analysis>> cache_;
31
32public:
33 AnalysisManager() = default;
34
37
38 template<class T>
39 static bool available(AnalysisManager& AM) {
40 return T::available(AM);
41 }
42
43 template<class T>
44 T& get() {
45 std::lock_guard<std::recursive_mutex> lock(lock_);
46
47 std::type_index Key = std::type_index(typeid(T));
48 auto It = cache_.find(Key);
49 if (It != cache_.end()) {
50 return *static_cast<T*>(It->second.get());
51 }
52
53 cache_[Key] = std::make_unique<T>();
54 cache_[Key]->run(*this);
55
56 return *static_cast<T*>(cache_[Key].get());
57 }
58};
59
60} // namespace analysis
61} // namespace docc
Definition analysis.h:25
T & get()
Definition analysis.h:44
AnalysisManager & operator=(const AnalysisManager &)=delete
static bool available(AnalysisManager &AM)
Definition analysis.h:39
friend class SDFGRegistry
Definition analysis.h:26
AnalysisManager(const AnalysisManager &)=delete
Definition analysis.h:14
virtual ~Analysis()=default
virtual void run(AnalysisManager &AM)=0
friend class AnalysisManager
Definition analysis.h:15
Definition sdfg_registry.h:55
Definition analysis.h:9
Definition targets.h:8