aboutsummaryrefslogtreecommitdiff
path: root/boot/symbol.cc
diff options
context:
space:
mode:
Diffstat (limited to 'boot/symbol.cc')
-rw-r--r--boot/symbol.cc43
1 files changed, 27 insertions, 16 deletions
diff --git a/boot/symbol.cc b/boot/symbol.cc
index da948fd..5e303fb 100644
--- a/boot/symbol.cc
+++ b/boot/symbol.cc
@@ -155,6 +155,11 @@ namespace elna::boot
return resolved_this.empty() && resolved_that.empty();
}
+ type::operator bool() const
+ {
+ return !empty();
+ }
+
bool type::empty() const
{
return std::holds_alternative<std::monostate>(payload);
@@ -458,35 +463,41 @@ namespace elna::boot
bool is_numeric_type(const type& checked)
{
- type const resolved = resolve_underlying_type(checked);
-
- return is_primitive_type(resolved, "Int")
- || is_primitive_type(resolved, "Word")
- || is_primitive_type(resolved, "Float");
+ return is_primitive_type(checked, "Int")
+ || is_primitive_type(checked, "Word")
+ || is_primitive_type(checked, "Float");
}
bool is_integral_type(const type& checked)
{
- type const resolved = resolve_underlying_type(checked);
-
- return is_primitive_type(resolved, "Int")
- || is_primitive_type(resolved, "Word");
+ return is_primitive_type(checked, "Int")
+ || is_primitive_type(checked, "Word");
}
bool is_discrete_type(const type& checked)
{
- type const resolved = resolve_underlying_type(checked);
-
- return is_primitive_type(resolved, "Int")
- || is_primitive_type(resolved, "Word")
- || is_primitive_type(resolved, "Bool")
- || is_primitive_type(resolved, "Char");
+ return is_integral_type(checked)
+ || is_primitive_type(checked, "Bool")
+ || is_primitive_type(checked, "Char");
}
bool is_any_pointer_type(const type& checked)
{
return checked.get<pointer_type>() != nullptr
|| checked.get<procedure_type>() != nullptr
- || is_primitive_type(resolve_underlying_type(checked), "Pointer");
+ || is_primitive_type(checked, "Pointer");
+ }
+
+ type get_range_base_type(const type& range)
+ {
+ if (auto array = range.get<array_type>())
+ {
+ return array->base;
+ }
+ else if (auto slice = range.get<slice_type>())
+ {
+ return slice->base;
+ }
+ return type();
}
}