github.com/gotranspile/cxgo@v0.3.8-0.20240118201721-29871598a6a2/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  	UntypedFloat = Untyped | Float
    24  	Nil          = Untyped | Ptr
    25  )
    26  
    27  func (k Kind) Is(k2 Kind) bool {
    28  	if k2 == Unknown {
    29  		return k == k2
    30  	}
    31  	return k&k2 == k2
    32  }
    33  
    34  func (k Kind) IsUntyped() bool {
    35  	return k.Is(Untyped)
    36  }
    37  
    38  func (k Kind) IsUntypedInt() bool {
    39  	return k.Is(UntypedInt)
    40  }
    41  
    42  func (k Kind) IsUntypedFloat() bool {
    43  	return k.Is(UntypedFloat)
    44  }
    45  
    46  func (k Kind) IsPtr() bool {
    47  	return k.Is(Ptr)
    48  }
    49  
    50  func (k Kind) IsUnsafePtr() bool {
    51  	return k.Is(UnsafePtr)
    52  }
    53  
    54  func (k Kind) IsFunc() bool {
    55  	return k.Is(Func)
    56  }
    57  
    58  func (k Kind) IsRef() bool {
    59  	return k.IsPtr() || k.IsFunc()
    60  }
    61  
    62  func (k Kind) IsInt() bool {
    63  	return k.Is(Int)
    64  }
    65  
    66  func (k Kind) IsSigned() bool {
    67  	return k.Is(Signed)
    68  }
    69  
    70  func (k Kind) IsUnsigned() bool {
    71  	return k.Is(Unsigned)
    72  }
    73  
    74  func (k Kind) IsFloat() bool {
    75  	return k.Is(Float)
    76  }
    77  
    78  func (k Kind) IsBool() bool {
    79  	return k.Is(Bool)
    80  }
    81  
    82  func (k Kind) Major() Kind {
    83  	return k & (Func | Ptr | Array | Struct | Int | Float | Bool)
    84  }
    85  
    86  var kindNames = []struct {
    87  	Kind Kind
    88  	Name string
    89  }{
    90  	{Nil, "Nil"},
    91  	{UntypedInt, "UntypedInt"},
    92  	{UnsafePtr, "UnsafePtr"},
    93  	{Unsigned, "Unsigned"},
    94  	{Signed, "Signed"},
    95  	{Int, "Int"},
    96  	{Float, "Float"},
    97  	{Bool, "Bool"},
    98  	{Untyped, "Untyped"},
    99  	{Ptr, "Ptr"},
   100  	{Array, "Array"},
   101  	{Func, "Func"},
   102  	{Struct, "Struct"},
   103  }
   104  
   105  func (k Kind) String() string {
   106  	if k == 0 {
   107  		return "Unknown"
   108  	}
   109  	var kinds []string
   110  	for _, s := range kindNames {
   111  		if k&s.Kind != 0 {
   112  			kinds = append(kinds, s.Name)
   113  			k &^= s.Kind
   114  		}
   115  	}
   116  	return strings.Join(kinds, "|")
   117  }