blob: 0a41d170df70fa0369e03238f5af2f51b63c875f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
/**
** \file type/class.hxx
** \brief Inline methods for type::Class.
*/
#pragma once
#include <iostream>
#include <misc/algorithm.hh>
#include <type/class.hh>
namespace type
{
inline const Class::attrs_type& Class::attrs_get() const { return attrs_; }
inline const Attribute* Class::attr_find(misc::symbol key) const
{
for (const Class* cur = this; cur; cur = cur->super_get())
{
const Attribute* attr = cur->owned_attr_find(key);
if (attr)
return attr;
}
return nullptr;
}
inline const Method* Class::meth_find(misc::symbol key) const
{
for (const Class* cur = this; cur; cur = cur->super_get())
{
const Method* meth = cur->owned_meth_find(key);
if (meth)
return meth;
}
return nullptr;
}
inline const Attribute* Class::owned_attr_find(misc::symbol key) const
{
for (const Attribute& at : attrs_get())
if (at.name_get() == key)
return &at;
return nullptr;
}
inline const Method* Class::owned_meth_find(misc::symbol key) const
{
for (const Method* m : meths_get())
if (m->name_get() == key)
return m;
return nullptr;
}
inline void Class::attr_add(const Attribute& attr)
{
attrs_.emplace_back(attr);
}
inline void Class::attr_add(const ast::VarDec* def)
{
attrs_.emplace_back(def);
}
inline const Class::meths_type& Class::meths_get() const { return meths_; }
inline void Class::meth_add(const Method* meth) { meths_.emplace_back(meth); }
inline bool Class::has_data() const { return !attrs_.empty(); }
inline unsigned Class::id_get() const { return id_; }
inline const Class* Class::super_get() const { return super_; }
inline void Class::super_set(const Class* super) { super_ = super; }
inline const Class::subclasses_type& Class::subclasses_get() const
{
return subclasses_;
}
inline void Class::subclass_add(const Class* subclass) const
{
subclasses_.emplace_back(subclass);
}
inline void Class::subclasses_clear() const { subclasses_.clear(); }
} // namespace type
|