// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package ssa

// Stub implementation used for testing.
type TypeImpl struct {
	Size_   int64
	Align   int64
	Boolean bool
	Integer bool
	Signed  bool
	Float   bool
	Complex bool
	Ptr     bool
	string  bool
	slice   bool
	array   bool
	struct_ bool
	inter   bool
	Elem_   Type

	Name string
}

func (t *TypeImpl) Size() int64            { return t.Size_ }
func (t *TypeImpl) Alignment() int64       { return t.Align }
func (t *TypeImpl) IsBoolean() bool        { return t.Boolean }
func (t *TypeImpl) IsInteger() bool        { return t.Integer }
func (t *TypeImpl) IsSigned() bool         { return t.Signed }
func (t *TypeImpl) IsFloat() bool          { return t.Float }
func (t *TypeImpl) IsComplex() bool        { return t.Complex }
func (t *TypeImpl) IsPtrShaped() bool      { return t.Ptr }
func (t *TypeImpl) IsString() bool         { return t.string }
func (t *TypeImpl) IsSlice() bool          { return t.slice }
func (t *TypeImpl) IsArray() bool          { return t.array }
func (t *TypeImpl) IsStruct() bool         { return t.struct_ }
func (t *TypeImpl) IsInterface() bool      { return t.inter }
func (t *TypeImpl) IsMemory() bool         { return false }
func (t *TypeImpl) IsFlags() bool          { return false }
func (t *TypeImpl) IsTuple() bool          { return false }
func (t *TypeImpl) IsVoid() bool           { return false }
func (t *TypeImpl) String() string         { return t.Name }
func (t *TypeImpl) SimpleString() string   { return t.Name }
func (t *TypeImpl) ElemType() Type         { return t.Elem_ }
func (t *TypeImpl) PtrTo() Type            { panic("not implemented") }
func (t *TypeImpl) NumFields() int         { panic("not implemented") }
func (t *TypeImpl) FieldType(i int) Type   { panic("not implemented") }
func (t *TypeImpl) FieldOff(i int) int64   { panic("not implemented") }
func (t *TypeImpl) FieldName(i int) string { panic("not implemented") }
func (t *TypeImpl) NumElem() int64         { panic("not implemented") }

func (t *TypeImpl) Equal(u Type) bool {
	x, ok := u.(*TypeImpl)
	if !ok {
		return false
	}
	return x == t
}

func (t *TypeImpl) Compare(u Type) Cmp {
	x, ok := u.(*TypeImpl)
	// ssa.CompilerType < ssa.TypeImpl < gc.Type
	if !ok {
		_, ok := u.(*CompilerType)
		if ok {
			return CMPgt
		}
		return CMPlt
	}
	if t == x {
		return CMPeq
	}
	if t.Name < x.Name {
		return CMPlt
	}
	if t.Name > x.Name {
		return CMPgt
	}
	return CMPeq

}

var (
	// shortcuts for commonly used basic types
	TypeInt8       = &TypeImpl{Size_: 1, Align: 1, Integer: true, Signed: true, Name: "int8"}
	TypeInt16      = &TypeImpl{Size_: 2, Align: 2, Integer: true, Signed: true, Name: "int16"}
	TypeInt32      = &TypeImpl{Size_: 4, Align: 4, Integer: true, Signed: true, Name: "int32"}
	TypeInt64      = &TypeImpl{Size_: 8, Align: 8, Integer: true, Signed: true, Name: "int64"}
	TypeFloat32    = &TypeImpl{Size_: 4, Align: 4, Float: true, Name: "float32"}
	TypeFloat64    = &TypeImpl{Size_: 8, Align: 8, Float: true, Name: "float64"}
	TypeComplex64  = &TypeImpl{Size_: 8, Align: 4, Complex: true, Name: "complex64"}
	TypeComplex128 = &TypeImpl{Size_: 16, Align: 8, Complex: true, Name: "complex128"}
	TypeUInt8      = &TypeImpl{Size_: 1, Align: 1, Integer: true, Name: "uint8"}
	TypeUInt16     = &TypeImpl{Size_: 2, Align: 2, Integer: true, Name: "uint16"}
	TypeUInt32     = &TypeImpl{Size_: 4, Align: 4, Integer: true, Name: "uint32"}
	TypeUInt64     = &TypeImpl{Size_: 8, Align: 8, Integer: true, Name: "uint64"}
	TypeBool       = &TypeImpl{Size_: 1, Align: 1, Boolean: true, Name: "bool"}
	TypeBytePtr    = &TypeImpl{Size_: 8, Align: 8, Ptr: true, Name: "*byte"}
	TypeInt64Ptr   = &TypeImpl{Size_: 8, Align: 8, Ptr: true, Name: "*int64"}
)
