diff options
Diffstat (limited to 'boot/symbol.cc')
| -rw-r--r-- | boot/symbol.cc | 43 |
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(); } } |
