mini-llvm 0.1.0
Loading...
Searching...
No Matches
Use.h
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2
3#pragma once
4
5#include <cassert>
6#include <concepts>
7#include <memory>
8#include <utility>
9#include <variant>
10
11#include "mini-llvm/ir/Value.h"
14
15namespace mini_llvm::ir {
16
18public:
19 virtual ~UseBase();
20
21 UseBase(Value *user, std::shared_ptr<Value> value);
22 UseBase(Value *user, std::weak_ptr<Value> value);
23
24 UseBase(const UseBase &) = delete;
25 UseBase &operator=(const UseBase &) = delete;
26
27 UseBase(UseBase &&) = delete;
28 UseBase &operator=(UseBase &&) = delete;
29
30 Value *user() const { return user_; }
31 virtual Value &operator*() const;
32 virtual Value *operator->() const { return &operator*(); }
33 virtual void set(std::shared_ptr<Value> value);
34 virtual void set(std::weak_ptr<Value> value);
35 bool expired() const;
36
37private:
38 Value *user_;
39 std::variant<std::monostate, std::shared_ptr<Value>, std::weak_ptr<Value>> value_;
40};
41
42template <typename ValueT = Value>
43 requires std::derived_from<ValueT, Value>
44class Use final : public UseBase {
45public:
46 Use(Value *user, std::shared_ptr<ValueT> value)
47 : UseBase(user, (assert(dynamic_cast<ValueT *>(&*value)), cast<Value>(std::move(value)))) {}
48
49 Use(Value *user, std::weak_ptr<ValueT> value)
50 : UseBase(user, (assert(!value.expired() && dynamic_cast<ValueT *>(&*value.lock())), cast<Value>(std::move(value)))) {}
51
52 ValueT &operator*() const override {
53 return static_cast<ValueT &>(UseBase::operator*());
54 }
55
56 ValueT *operator->() const override {
57 return static_cast<ValueT *>(UseBase::operator->());
58 }
59
60 void set(std::shared_ptr<Value> value) override {
61 assert(dynamic_cast<ValueT *>(&*value));
62 UseBase::set(std::move(value));
63 }
64
65 void set(std::weak_ptr<Value> value) override {
66 assert(!value.expired() && dynamic_cast<ValueT *>(&*value.lock()));
67 UseBase::set(std::move(value));
68 }
69};
70
71template <typename ValueT>
72 requires (std::derived_from<ValueT, Value> && !std::same_as<ValueT, Value>)
73class Use<ValueT> final : public UseBase {
74public:
75 Use(Value *user, std::shared_ptr<ValueT> value)
76 : UseBase(user, (assert(dynamic_cast<ValueT *>(&*value)), cast<Value>(std::move(value)))) {}
77
78 Use(Value *user, std::weak_ptr<ValueT> value)
79 : UseBase(user, (assert(!value.expired() && dynamic_cast<ValueT *>(&*value.lock())), cast<Value>(std::move(value)))) {}
80
81 ValueT &operator*() const override {
82 return static_cast<ValueT &>(UseBase::operator*());
83 }
84
85 ValueT *operator->() const override {
86 return static_cast<ValueT *>(UseBase::operator->());
87 }
88
89 void set(std::shared_ptr<Value> value) override {
90 assert(dynamic_cast<ValueT *>(&*value));
91 UseBase::set(std::move(value));
92 }
93
94 void set(std::weak_ptr<Value> value) override {
95 assert(!value.expired() && dynamic_cast<ValueT *>(&*value.lock()));
96 UseBase::set(std::move(value));
97 }
98
99 void set(std::shared_ptr<ValueT> value) {
100 UseBase::set(cast<Value>(std::move(value)));
101 }
102
103 void set(std::weak_ptr<ValueT> value) {
104 UseBase::set(cast<Value>(std::move(value)));
105 }
106};
107
108} // namespace mini_llvm::ir
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
UseBase(Value *user, std::weak_ptr< Value > value)
virtual void set(std::weak_ptr< Value > value)
Value * user() const
Definition Use.h:30
UseBase(Value *user, std::shared_ptr< Value > value)
virtual Value & operator*() const
virtual Value * operator->() const
Definition Use.h:32
virtual void set(std::shared_ptr< Value > value)
UseBase & operator=(const UseBase &)=delete
UseBase(const UseBase &)=delete
UseBase(UseBase &&)=delete
UseBase & operator=(UseBase &&)=delete
Use(Value *user, std::shared_ptr< ValueT > value)
Definition Use.h:75
ValueT & operator*() const override
Definition Use.h:81
void set(std::weak_ptr< ValueT > value)
Definition Use.h:103
void set(std::shared_ptr< ValueT > value)
Definition Use.h:99
void set(std::weak_ptr< Value > value) override
Definition Use.h:94
Use(Value *user, std::weak_ptr< ValueT > value)
Definition Use.h:78
void set(std::shared_ptr< Value > value) override
Definition Use.h:89
ValueT * operator->() const override
Definition Use.h:85
Use(Value *user, std::shared_ptr< ValueT > value)
Definition Use.h:46
ValueT & operator*() const override
Definition Use.h:52
void set(std::weak_ptr< Value > value) override
Definition Use.h:65
Use(Value *user, std::weak_ptr< ValueT > value)
Definition Use.h:49
void set(std::shared_ptr< Value > value) override
Definition Use.h:60
ValueT * operator->() const override
Definition Use.h:56
Definition Value.h:24
Definition Argument.h:13
std::unique_ptr< To > cast(std::unique_ptr< From > from) noexcept
Definition Memory.h:10