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  }