github.com/gotranspile/cxgo@v0.3.7/types/kinds.go (about) 1 package types 2 3 import "strings" 4 5 type Kind int 6 7 const ( 8 Unknown = Kind(0) 9 Untyped = Kind(1 << iota) 10 unsafeKind 11 Ptr 12 Int 13 Float 14 Bool 15 Struct 16 Func 17 Array 18 Signed 19 Unsigned 20 21 UnsafePtr = unsafeKind | Ptr 22 UntypedInt = Untyped | Int 23 Nil = Untyped | Ptr 24 ) 25 26 func (k Kind) Is(k2 Kind) bool { 27 if k2 == Unknown { 28 return k == k2 29 } 30 return k&k2 == k2 31 } 32 33 func (k Kind) IsUntyped() bool { 34 return k.Is(Untyped) 35 } 36 37 func (k Kind) IsPtr() bool { 38 return k.Is(Ptr) 39 } 40 41 func (k Kind) IsUnsafePtr() bool { 42 return k.Is(UnsafePtr) 43 } 44 45 func (k Kind) IsFunc() bool { 46 return k.Is(Func) 47 } 48 49 func (k Kind) IsRef() bool { 50 return k.IsPtr() || k.IsFunc() 51 } 52 53 func (k Kind) IsInt() bool { 54 return k.Is(Int) 55 } 56 57 func (k Kind) IsSigned() bool { 58 return k.Is(Signed) 59 } 60 61 func (k Kind) IsUnsigned() bool { 62 return k.Is(Unsigned) 63 } 64 65 func (k Kind) IsFloat() bool { 66 return k.Is(Float) 67 } 68 69 func (k Kind) IsBool() bool { 70 return k.Is(Bool) 71 } 72 73 func (k Kind) Major() Kind { 74 return k & (Func | Ptr | Array | Struct | Int | Float | Bool) 75 } 76 77 var kindNames = []struct { 78 Kind Kind 79 Name string 80 }{ 81 {Nil, "Nil"}, 82 {UntypedInt, "UntypedInt"}, 83 {UnsafePtr, "UnsafePtr"}, 84 {Unsigned, "Unsigned"}, 85 {Signed, "Signed"}, 86 {Int, "Int"}, 87 {Float, "Float"}, 88 {Bool, "Bool"}, 89 {Untyped, "Untyped"}, 90 {Ptr, "Ptr"}, 91 {Array, "Array"}, 92 {Func, "Func"}, 93 {Struct, "Struct"}, 94 } 95 96 func (k Kind) String() string { 97 if k == 0 { 98 return "Unknown" 99 } 100 var kinds []string 101 for _, s := range kindNames { 102 if k&s.Kind != 0 { 103 kinds = append(kinds, s.Name) 104 k &^= s.Kind 105 } 106 } 107 return strings.Join(kinds, "|") 108 }