Warning: This file is not a C or C++ file. It does not have highlighting.

1//===-- include/flang/Runtime/type-code.h -----------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef FORTRAN_RUNTIME_TYPE_CODE_H_
10#define FORTRAN_RUNTIME_TYPE_CODE_H_
11
12#include "flang/Common/Fortran.h"
13#include "flang/Common/optional.h"
14#include "flang/ISO_Fortran_binding_wrapper.h"
15#include <utility>
16
17namespace Fortran::runtime {
18
19using common::TypeCategory;
20
21class TypeCode {
22public:
23 TypeCode() {}
24 explicit RT_API_ATTRS TypeCode(ISO::CFI_type_t t) : raw_{t} {}
25 RT_API_ATTRS TypeCode(TypeCategory, int kind);
26
27 RT_API_ATTRS int raw() const { return raw_; }
28
29 constexpr RT_API_ATTRS bool IsValid() const {
30 return raw_ >= CFI_type_signed_char && raw_ <= CFI_TYPE_LAST;
31 }
32 constexpr RT_API_ATTRS bool IsInteger() const {
33 return raw_ >= CFI_type_signed_char && raw_ <= CFI_type_ptrdiff_t;
34 }
35 constexpr RT_API_ATTRS bool IsReal() const {
36 return raw_ >= CFI_type_half_float && raw_ <= CFI_type_float128;
37 }
38 constexpr RT_API_ATTRS bool IsComplex() const {
39 return raw_ >= CFI_type_half_float_Complex &&
40 raw_ <= CFI_type_float128_Complex;
41 }
42 constexpr RT_API_ATTRS bool IsCharacter() const {
43 return raw_ == CFI_type_char || raw_ == CFI_type_char16_t ||
44 raw_ == CFI_type_char32_t;
45 }
46 constexpr RT_API_ATTRS bool IsLogical() const {
47 return raw_ == CFI_type_Bool ||
48 (raw_ >= CFI_type_int_least8_t && raw_ <= CFI_type_int_least64_t);
49 }
50 constexpr RT_API_ATTRS bool IsDerived() const {
51 return raw_ == CFI_type_struct;
52 }
53 constexpr RT_API_ATTRS bool IsIntrinsic() const {
54 return IsValid() && !IsDerived();
55 }
56
57 RT_API_ATTRS Fortran::common::optional<std::pair<TypeCategory, int>>
58 GetCategoryAndKind() const;
59
60 RT_API_ATTRS bool operator==(TypeCode that) const {
61 if (raw_ == that.raw_) { // fast path
62 return true;
63 } else {
64 // Multiple raw CFI_type_... codes can represent the same Fortran
65 // type category + kind type parameter, e.g. CFI_type_int and
66 // CFI_type_int32_t.
67 auto thisCK{GetCategoryAndKind()};
68 auto thatCK{that.GetCategoryAndKind()};
69 return thisCK && thatCK && *thisCK == *thatCK;
70 }
71 }
72 RT_API_ATTRS bool operator!=(TypeCode that) const { return !(*this == that); }
73
74private:
75 ISO::CFI_type_t raw_{CFI_type_other};
76};
77} // namespace Fortran::runtime
78#endif // FORTRAN_RUNTIME_TYPE_CODE_H_
79

Warning: This file is not a C or C++ file. It does not have highlighting.

source code of flang/include/flang/Runtime/type-code.h