mini-llvm
0.1.0
Toggle main menu visibility
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
"
12
#include "
mini-llvm/utils/Compiler.h
"
13
#include "
mini-llvm/utils/Memory.h
"
14
15
namespace
mini_llvm::ir
{
16
17
class
MINI_LLVM_EXPORT
UseBase
{
18
public
:
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
37
private
:
38
Value
*user_;
39
std::variant<std::monostate, std::shared_ptr<Value>, std::weak_ptr<Value>> value_;
40
};
41
42
template
<
typename
ValueT = Value>
43
requires
std::derived_from<ValueT, Value>
44
class
Use
final :
public
UseBase
{
45
public
:
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
71
template
<
typename
ValueT>
72
requires
(std::derived_from<ValueT, Value> && !std::same_as<ValueT, Value>)
73
class
Use<ValueT>
final
: public
UseBase
{
74
public:
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
Compiler.h
MINI_LLVM_EXPORT
#define MINI_LLVM_EXPORT
Definition
Compiler.h:17
Memory.h
Value.h
mini_llvm::ir::UseBase::UseBase
UseBase(Value *user, std::weak_ptr< Value > value)
mini_llvm::ir::UseBase::expired
bool expired() const
mini_llvm::ir::UseBase::set
virtual void set(std::weak_ptr< Value > value)
mini_llvm::ir::UseBase::user
Value * user() const
Definition
Use.h:30
mini_llvm::ir::UseBase::UseBase
UseBase(Value *user, std::shared_ptr< Value > value)
mini_llvm::ir::UseBase::operator*
virtual Value & operator*() const
mini_llvm::ir::UseBase::operator->
virtual Value * operator->() const
Definition
Use.h:32
mini_llvm::ir::UseBase::set
virtual void set(std::shared_ptr< Value > value)
mini_llvm::ir::UseBase::operator=
UseBase & operator=(const UseBase &)=delete
mini_llvm::ir::UseBase::UseBase
UseBase(const UseBase &)=delete
mini_llvm::ir::UseBase::~UseBase
virtual ~UseBase()
mini_llvm::ir::UseBase::UseBase
UseBase(UseBase &&)=delete
mini_llvm::ir::UseBase::operator=
UseBase & operator=(UseBase &&)=delete
mini_llvm::ir::Use< ValueT >::Use
Use(Value *user, std::shared_ptr< ValueT > value)
Definition
Use.h:75
mini_llvm::ir::Use< ValueT >::operator*
ValueT & operator*() const override
Definition
Use.h:81
mini_llvm::ir::Use< ValueT >::set
void set(std::weak_ptr< ValueT > value)
Definition
Use.h:103
mini_llvm::ir::Use< ValueT >::set
void set(std::shared_ptr< ValueT > value)
Definition
Use.h:99
mini_llvm::ir::Use< ValueT >::set
void set(std::weak_ptr< Value > value) override
Definition
Use.h:94
mini_llvm::ir::Use< ValueT >::Use
Use(Value *user, std::weak_ptr< ValueT > value)
Definition
Use.h:78
mini_llvm::ir::Use< ValueT >::set
void set(std::shared_ptr< Value > value) override
Definition
Use.h:89
mini_llvm::ir::Use< ValueT >::operator->
ValueT * operator->() const override
Definition
Use.h:85
mini_llvm::ir::Use::Use
Use(Value *user, std::shared_ptr< ValueT > value)
Definition
Use.h:46
mini_llvm::ir::Use::operator*
ValueT & operator*() const override
Definition
Use.h:52
mini_llvm::ir::Use::set
void set(std::weak_ptr< Value > value) override
Definition
Use.h:65
mini_llvm::ir::Use::Use
Use(Value *user, std::weak_ptr< ValueT > value)
Definition
Use.h:49
mini_llvm::ir::Use::set
void set(std::shared_ptr< Value > value) override
Definition
Use.h:60
mini_llvm::ir::Use::operator->
ValueT * operator->() const override
Definition
Use.h:56
mini_llvm::ir::Value
Definition
Value.h:24
mini_llvm::ir
Definition
Argument.h:13
mini_llvm::cast
std::unique_ptr< To > cast(std::unique_ptr< From > from) noexcept
Definition
Memory.h:10
include
mini-llvm
ir
Use.h
Generated by
1.17.0