mini-llvm 0.1.0
Loading...
Searching...
No Matches
ArrayConstant.h
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2
3#pragma once
4
5#include <cstddef>
6#include <memory>
7#include <ranges>
8#include <string>
9#include <vector>
10
13#include "mini-llvm/ir/Type.h"
15#include "mini-llvm/ir/Use.h"
16#include "mini-llvm/ir/Value.h"
19
20namespace mini_llvm::ir {
21
23 using ElementList = std::vector<std::unique_ptr<Use<Constant>>>;
24
25public:
28
29 ArrayConstant(std::unique_ptr<ArrayType> type, std::vector<std::shared_ptr<Constant>> elements);
30
32 return element_iterator(elements_.begin());
33 }
34
36 return element_iterator(elements_.end());
37 }
38
40 return const_element_iterator(elements_.begin());
41 }
42
44 return const_element_iterator(elements_.end());
45 }
46
47 bool element_empty() const {
48 return elements_.empty();
49 }
50
51 size_t element_size() const {
52 return elements_.size();
53 }
54
56 return *elements_[i];
57 }
58
59 const Use<Constant> &element(size_t i) const {
60 return *elements_[i];
61 }
62
63 void accept(ConstantVisitor &visitor) override {
64 visitor.visitArrayConstant(*this);
65 }
66
67 void accept(ConstantVisitor &visitor) const override {
68 visitor.visitArrayConstant(*this);
69 }
70
71 bool isWellFormed() const override;
72
73 std::unique_ptr<Type> type() const override {
74 return type_->clone();
75 }
76
77 std::string format() const override;
78 std::unique_ptr<Value> clone() const override;
79
80protected:
81 bool equals(const Constant &other) const override;
82
83private:
84 std::unique_ptr<ArrayType> type_;
85 ElementList elements_;
86};
87
88inline auto elements(ArrayConstant &C) {
89 return std::ranges::subrange(C.element_begin(), C.element_end());
90}
91
92inline auto elements(const ArrayConstant &C) {
93 return std::ranges::subrange(C.element_begin(), C.element_end());
94}
95
96} // namespace mini_llvm::ir
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
Definition IndirectIterator.h:16
Definition ArrayConstant.h:22
std::string format() const override
const Use< Constant > & element(size_t i) const
Definition ArrayConstant.h:59
element_iterator element_begin()
Definition ArrayConstant.h:31
bool isWellFormed() const override
const_element_iterator element_end() const
Definition ArrayConstant.h:43
size_t element_size() const
Definition ArrayConstant.h:51
IndirectIterator< ElementList::iterator, Use< Constant > > element_iterator
Definition ArrayConstant.h:26
const_element_iterator element_begin() const
Definition ArrayConstant.h:39
std::unique_ptr< Type > type() const override
Definition ArrayConstant.h:73
bool element_empty() const
Definition ArrayConstant.h:47
bool equals(const Constant &other) const override
Use< Constant > & element(size_t i)
Definition ArrayConstant.h:55
void accept(ConstantVisitor &visitor) override
Definition ArrayConstant.h:63
ArrayConstant(std::unique_ptr< ArrayType > type, std::vector< std::shared_ptr< Constant > > elements)
IndirectIterator< ElementList::const_iterator, const Use< Constant > > const_element_iterator
Definition ArrayConstant.h:27
element_iterator element_end()
Definition ArrayConstant.h:35
std::unique_ptr< Value > clone() const override
void accept(ConstantVisitor &visitor) const override
Definition ArrayConstant.h:67
Definition ConstantVisitor.h:26
virtual void visitArrayConstant(ArrayConstant &C)
Definition ConstantVisitor.h:38
Definition Constant.h:13
Definition Use.h:44
Definition Argument.h:13
auto elements(ArrayConstant &C)
Definition ArrayConstant.h:88