class.ha (1570B)
1 // SPDX-License-Identifier: MPL-2.0 2 // (c) Hare authors <https://harelang.org> 3 4 // Returns true if the given type is a signed type. 5 export fn is_signed(ty: const *_type) bool = { 6 match (ty.repr) { 7 case let al: alias => 8 return is_signed(al.secondary as const *_type); 9 case let bi: builtin => 10 switch (bi) { 11 case builtin::F32, builtin::F64, builtin::I16, builtin::I32, 12 builtin::I64, builtin::I8, builtin::INT => 13 return true; 14 case => 15 return false; 16 }; 17 case let e: _enum => 18 switch (e.storage) { 19 case builtin::I16, builtin::I32, builtin::I64, builtin::I8, 20 builtin::INT => 21 return true; 22 case => 23 return false; 24 }; 25 case => 26 return false; 27 }; 28 }; 29 30 // Returns true if the given type is a floating-point type. 31 export fn is_float(ty: const *_type) bool = { 32 match (ty.repr) { 33 case let al: alias => 34 return is_float(al.secondary as const *_type); 35 case let bi: builtin => 36 switch (bi) { 37 case builtin::F32, builtin::F64 => 38 return true; 39 case => 40 return false; 41 }; 42 case => 43 return false; 44 }; 45 }; 46 47 // Returns true if the given type is an integer type. 48 export fn is_integer(ty: const *_type) bool = { 49 match (ty.repr) { 50 case let al: alias => 51 return is_integer(al.secondary as const *_type); 52 case let bi: builtin => 53 switch (bi) { 54 case builtin::INT, builtin::UINT, builtin::I16, 55 builtin::I32, builtin::I64, builtin::I8, builtin::U16, 56 builtin::U32, builtin::U64, builtin::U8, 57 builtin::SIZE, builtin::UINTPTR => 58 return true; 59 case => 60 return false; 61 }; 62 case _enum => 63 return true; 64 case => 65 return false; 66 }; 67 };