35 using ArgumentList = std::vector<std::shared_ptr<Argument>>;
36 using AttributeList = std::vector<std::unique_ptr<Attribute>>;
37 using BasicBlockList = std::list<std::shared_ptr<BasicBlock>>;
102 return attrs_.empty();
106 return attrs_.size();
117 template <
typename T>
118 requires std::derived_from<T, Attribute>
120 auto i = std::ranges::find_if(attrs_, [](
const std::unique_ptr<Attribute> &
attr) {
121 return dynamic_cast<const T *
>(&*
attr);
123 if (i == attrs_.end()) {
129 template <
typename T>
131 auto i = std::ranges::find_if(attrs_, [](
const std::unique_ptr<Attribute> &
attr) {
132 return dynamic_cast<const T *
>(&*
attr);
134 if (i == attrs_.end()) {
140 template <
typename T>
141 requires std::derived_from<T, Attribute>
143 attrs_.push_back(std::move(
attr));
144 return static_cast<T &
>(*attrs_.back());
147 template <
typename T>
148 requires std::derived_from<T, Attribute>
150 std::erase_if(attrs_, [](
const std::unique_ptr<Attribute> &
attr) {
151 return dynamic_cast<const T *
>(&*
attr);
196 return *std::prev(
end());
200 return *std::prev(
end());
204 return blocks_.empty();
208 return blocks_.size();
250 assert(
typeid(*
this) !=
typeid(other));
255 std::unique_ptr<FunctionType> functionType_;
258 AttributeList attrs_;
259 BasicBlockList blocks_;
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
Definition IndirectIterator.h:16
Definition OptionalReference.h:13
Definition Attribute.h:13
Definition BasicBlock.h:28
Definition ConstantVisitor.h:26
virtual void visitFunction(Function &C)
Definition ConstantVisitor.h:41
bool arg_empty() const
Definition Function.h:77
iterator begin()
Definition Function.h:155
const Attribute & attr(size_t i) const
Definition Function.h:113
reverse_iterator rbegin()
Definition Function.h:171
std::unique_ptr< FunctionType > functionType() const
Definition Function.h:53
bool empty() const
Definition Function.h:203
IndirectIterator< BasicBlockList::iterator, BasicBlock > iterator
Definition Function.h:46
BasicBlock & add(const_iterator pos)
std::string format() const override
IndirectIterator< AttributeList::const_iterator, Attribute > attr_iterator
Definition Function.h:43
bool isDeclaration() const override
Definition Function.h:232
const_arg_iterator arg_end() const
Definition Function.h:73
const_iterator end() const
Definition Function.h:167
size_t arg_size() const
Definition Function.h:81
arg_iterator arg_begin()
Definition Function.h:61
bool equals(const Constant &other) const override
Definition Function.h:249
const_arg_iterator arg_begin() const
Definition Function.h:65
IndirectIterator< BasicBlockList::const_iterator, const BasicBlock > const_iterator
Definition Function.h:47
iterator end()
Definition Function.h:163
void removeAttr()
Definition Function.h:149
void remove(const_iterator pos)
Attribute & attr(size_t i)
Definition Function.h:109
const BasicBlock & entry() const
Definition Function.h:215
void accept(ConstantVisitor &visitor) override
Definition Function.h:238
bool isWellFormed() const override
const BasicBlock & front() const
Definition Function.h:191
attr_iterator attr_end() const
Definition Function.h:97
const_iterator begin() const
Definition Function.h:159
const BasicBlock & back() const
Definition Function.h:199
Argument & arg(size_t i)
Definition Function.h:85
BasicBlock & append(std::shared_ptr< BasicBlock > block)
arg_iterator arg_end()
Definition Function.h:69
const Argument & arg(size_t i) const
Definition Function.h:89
const_reverse_iterator rend() const
Definition Function.h:183
OptionalReference< const Attribute > attr() const
Definition Function.h:130
OptionalReference< Attribute > attr()
Definition Function.h:119
attr_iterator attr_begin() const
Definition Function.h:93
BasicBlock & prepend(std::shared_ptr< BasicBlock > block)
BasicBlock & add(const_iterator pos, std::shared_ptr< BasicBlock > block)
reverse_iterator rend()
Definition Function.h:179
BasicBlock & back()
Definition Function.h:195
void accept(ConstantVisitor &visitor) const override
Definition Function.h:242
size_t attr_size() const
Definition Function.h:105
BasicBlock & entry()
Definition Function.h:211
IndirectIterator< BasicBlockList::reverse_iterator, BasicBlock > reverse_iterator
Definition Function.h:48
T & addAttr(std::unique_ptr< T > attr)
Definition Function.h:142
IndirectIterator< ArgumentList::const_iterator, const Argument > const_arg_iterator
Definition Function.h:41
BasicBlock & front()
Definition Function.h:187
IndirectIterator< ArgumentList::iterator, Argument > arg_iterator
Definition Function.h:40
IndirectIterator< BasicBlockList::const_reverse_iterator, const BasicBlock > const_reverse_iterator
Definition Function.h:49
Function(std::unique_ptr< FunctionType > functionType, Linkage linkage)
size_t size() const
Definition Function.h:207
IndirectIterator< AttributeList::const_iterator, const Attribute > const_attr_iterator
Definition Function.h:44
Linkage linkage() const
Definition Function.h:57
bool attr_empty() const
Definition Function.h:101
const_reverse_iterator rbegin() const
Definition Function.h:175
Definition GlobalValue.h:17
auto args(Function &F)
Definition Function.h:262
auto attrs(const Function &F)
Definition Function.h:270
MINI_LLVM_EXPORT std::string toDot(const Function &F)
Linkage
Definition Linkage.h:7
std::unique_ptr< To > cast(std::unique_ptr< From > from) noexcept
Definition Memory.h:10