FreeTensor
Loading...
Searching...
No Matches
metadata.h
Go to the documentation of this file.
1#ifndef FREE_TENSOR_METADATA_H
2#define FREE_TENSOR_METADATA_H
3
4#include <atomic>
5#include <functional>
6#include <iostream>
7#include <string>
8#include <unordered_set>
9#include <vector>
10
11#include <func_utils.h>
12#include <id.h>
13#include <ref.h>
14
15namespace freetensor {
16
17enum class MetadataType {
19 Source,
21};
22
24 public:
25 virtual ~MetadataContent() {}
26
27 virtual MetadataType getType() const = 0;
28 virtual bool printByDefault() const = 0;
29 virtual void print(std::ostream &os, bool printLocation,
30 int nIndent) const = 0;
31
32 virtual size_t hash() const = 0;
33 virtual bool sameAs(const MetadataContent &other) const = 0;
34 friend bool operator==(const MetadataContent &lhs,
35 const MetadataContent &rhs) {
36 return lhs.sameAs(rhs);
37 }
38};
42
43std::ostream &manipMetadataSkipLocation(std::ostream &);
44std::ostream &manipMetadataWithLocation(std::ostream &);
45
46std::ostream &manipMetadataOneLine(std::ostream &);
47std::ostream &manipMetadataMultiLine(std::ostream &);
48
49std::ostream &manipMetadataNoId(std::ostream &os);
50std::ostream &manipMetadataPrintId(std::ostream &os);
51
52std::ostream &operator<<(std::ostream &os, const Metadata &md);
53
55 std::string op_;
56 std::vector<Metadata> sources_;
57
58 public:
59 TransformedMetadataContent(const std::string &op,
60 const std::vector<Metadata> sources);
61
62 ~TransformedMetadataContent() override = default;
63
64 MetadataType getType() const override { return MetadataType::Transformed; }
65 bool printByDefault() const override { return true; }
66 void print(std::ostream &os, bool printLocation,
67 int nIndent) const override;
68
69 size_t hash() const override;
70 bool sameAs(const MetadataContent &other) const override;
71
72 const std::string &op() const { return op_; }
73 const std::vector<Metadata> &sources() const { return sources_; }
74};
76
77TransformedMetadata makeMetadata(const std::string &op,
78 const std::vector<Metadata> &sources);
79
81 std::vector<std::string> labels_; // sorted
82 std::unordered_set<std::string> labelsSet_;
83 std::optional<std::pair<std::string, int>> location_;
84 Metadata callerMetadata_;
85
86 public:
88 const std::vector<std::string> &labels,
89 const std::optional<std::pair<std::string, int>> &location,
90 const Metadata &callerMetadata);
91
92 ~SourceMetadataContent() override = default;
93
94 const std::vector<std::string> &labels() const { return labels_; }
95 const std::unordered_set<std::string> &labelsSet() const {
96 return labelsSet_;
97 }
98 const Metadata &caller() const { return callerMetadata_; }
99
100 MetadataType getType() const override { return MetadataType::Source; }
101 bool printByDefault() const override { return !labels_.empty(); }
102 void print(std::ostream &os, bool printLocation,
103 int nIndent) const override;
104
105 size_t hash() const override;
106 bool sameAs(const MetadataContent &other) const override;
107};
109
111makeMetadata(const std::vector<std::string> &labels,
112 const std::optional<std::pair<std::string, int>> &location,
113 const Metadata &callerMetadata);
114
116 ID id_;
117
118 public:
119 AnonymousMetadataContent(const ID &id);
120 ~AnonymousMetadataContent() override = default;
121 MetadataType getType() const override { return MetadataType::Anonymous; }
122 bool printByDefault() const override { return false; }
123 void print(std::ostream &os, bool printLocation,
124 int nIndent) const override;
125
126 size_t hash() const override;
127 bool sameAs(const MetadataContent &other) const override;
128
129 ID id() const { return id_; }
130};
132
133AnonymousMetadata makeMetadata(const ID &id = {});
134
135std::string toString(const Metadata &md, bool shouldSkipLocation = false);
136
137} // namespace freetensor
138
139namespace std {
140
141template <> struct hash<freetensor::MetadataContent> {
142 size_t operator()(const freetensor::MetadataContent &md) const {
143 return md.hash();
144 }
145};
146
147} // namespace std
148
149#endif // FREE_TENSOR_METADATA_H
Definition: metadata.h:115
bool sameAs(const MetadataContent &other) const override
Definition: metadata.cc:206
MetadataType getType() const override
Definition: metadata.h:121
~AnonymousMetadataContent() override=default
ID id() const
Definition: metadata.h:129
void print(std::ostream &os, bool printLocation, int nIndent) const override
Definition: metadata.cc:189
size_t hash() const override
Definition: metadata.cc:200
bool printByDefault() const override
Definition: metadata.h:122
Definition: id.h:18
Definition: metadata.h:23
virtual bool sameAs(const MetadataContent &other) const =0
virtual void print(std::ostream &os, bool printLocation, int nIndent) const =0
virtual MetadataType getType() const =0
virtual size_t hash() const =0
virtual bool printByDefault() const =0
friend bool operator==(const MetadataContent &lhs, const MetadataContent &rhs)
Definition: metadata.h:34
virtual ~MetadataContent()
Definition: metadata.h:25
Definition: func_utils.h:9
Definition: metadata.h:80
size_t hash() const override
Definition: metadata.cc:144
const std::vector< std::string > & labels() const
Definition: metadata.h:94
MetadataType getType() const override
Definition: metadata.h:100
bool printByDefault() const override
Definition: metadata.h:101
bool sameAs(const MetadataContent &other) const override
Definition: metadata.cc:159
const std::unordered_set< std::string > & labelsSet() const
Definition: metadata.h:95
const Metadata & caller() const
Definition: metadata.h:98
void print(std::ostream &os, bool printLocation, int nIndent) const override
Definition: metadata.cc:128
~SourceMetadataContent() override=default
bool sameAs(const MetadataContent &other) const override
Definition: metadata.cc:95
size_t hash() const override
Definition: metadata.cc:86
bool printByDefault() const override
Definition: metadata.h:65
const std::string & op() const
Definition: metadata.h:72
const std::vector< Metadata > & sources() const
Definition: metadata.h:73
void print(std::ostream &os, bool printLocation, int nIndent) const override
Definition: metadata.cc:75
~TransformedMetadataContent() override=default
MetadataType getType() const override
Definition: metadata.h:64
Definition: allocator.h:9
auto && lhs
Definition: const_fold.cc:70
auto makeMetadata(const std::string &op, Srcs &&...sourceStmts)
Definition: ast.h:315
std::ostream & manipMetadataMultiLine(std::ostream &)
Definition: metadata.cc:46
std::ostream & manipMetadataNoId(std::ostream &os)
Definition: metadata.cc:51
std::ostream & manipMetadataSkipLocation(std::ostream &)
Definition: metadata.cc:33
Ref< MetadataContent > Metadata
Definition: metadata.h:39
std::string toString(const AST &op)
Definition: print_ast.cc:784
std::ostream & manipMetadataPrintId(std::ostream &os)
Definition: metadata.cc:55
MetadataType
Definition: metadata.h:17
std::ostream & manipMetadataWithLocation(std::ostream &)
Definition: metadata.cc:37
auto auto && rhs
Definition: const_fold.cc:70
std::ostream & operator<<(std::ostream &os, const Dependence &dep)
Definition: deps.cc:1404
std::ostream & manipMetadataOneLine(std::ostream &)
Definition: metadata.cc:42
STL namespace.
size_t operator()(const freetensor::MetadataContent &md) const
Definition: metadata.h:142