// Copyright 2009 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.

/*
 * Runtime type representation.
 *
 * The following files know the exact layout of these
 * data structures and must be kept in sync with this file:
 *
 *	../../cmd/gc/reflect.c
 *	../reflect/type.go
 *	type.h
 */

package runtime

import "unsafe"

// The compiler can only construct empty interface values at
// compile time; non-empty interface values get created
// during initialization.  Type is an empty interface
// so that the compiler can lay out references as data.
type Type interface { }

// All types begin with a few common fields needed for
// the interface runtime.
type commonType struct {
	size uintptr;		// size in bytes
	hash uint32;		// hash of type; avoids computation in hash tables
	alg uint8;		// algorithm for copy+hash+cmp (../runtime/runtime.h:/AMEM)
	align uint8;		// alignment of variable with this type
	fieldAlign uint8;	// alignment of struct field with this type
	string *string;		// string form; unnecessary  but undeniably useful
	*uncommonType;		// (relatively) uncommon fields
}

// Method on non-interface type
type method struct {
	hash uint32;		// hash of name + pkg + typ
	name *string;		// name of method
	pkgPath *string;	// nil for exported Names; otherwise import path
	typ *Type;		// .(*FuncType) underneath
	ifn unsafe.Pointer;	// fn used in interface call (one-word receiver)
	tfn unsafe.Pointer;	// fn used for normal method call
}

// uncommonType is present only for types with names or methods
// (if T is a named type, the uncommonTypes for T and *T have methods).
// Using a pointer to this struct reduces the overall size required
// to describe an unnamed type with no methods.
type uncommonType struct {
	name *string;		// name of type
	pkgPath *string;	// import path; nil for built-in types like int, string
	methods []method;	// methods associated with type
}

// BoolType represents a boolean type.
type BoolType commonType

// Float32Type represents a float32 type.
type Float32Type commonType

// Float64Type represents a float64 type.
type Float64Type commonType

// FloatType represents a float type.
type FloatType commonType

// Int16Type represents an int16 type.
type Int16Type commonType

// Int32Type represents an int32 type.
type Int32Type commonType

// Int64Type represents an int64 type.
type Int64Type commonType

// Int8Type represents an int8 type.
type Int8Type commonType

// IntType represents an int type.
type IntType commonType

// Uint16Type represents a uint16 type.
type Uint16Type commonType

// Uint32Type represents a uint32 type.
type Uint32Type commonType

// Uint64Type represents a uint64 type.
type Uint64Type commonType

// Uint8Type represents a uint8 type.
type Uint8Type commonType

// UintType represents a uint type.
type UintType commonType

// StringType represents a string type.
type StringType commonType

// UintptrType represents a uintptr type.
type UintptrType commonType

// DotDotDotType represents the ... that can
// be used as the type of the final function parameter.
type DotDotDotType commonType

// UnsafePointerType represents an unsafe.Pointer type.
type UnsafePointerType commonType

// ArrayType represents a fixed array type.
type ArrayType struct {
	commonType;
	elem *Type;	// array element type
	len uintptr;
}

// SliceType represents a slice type.
type SliceType struct {
	commonType;
	elem *Type;	// slice element type
}

// ChanDir represents a channel type's direction.
type ChanDir int
const (
	RecvDir ChanDir = 1<<iota;	// <-chan
	SendDir;				// chan<-
	BothDir = RecvDir | SendDir;	// chan
)

// ChanType represents a channel type.
type ChanType struct {
	commonType;
	elem *Type;		// channel element type
	dir uintptr;		// channel direction (ChanDir)
}

// FuncType represents a function type.
type FuncType struct {
	commonType;
	in []*Type;		// input parameter types
	out []*Type;		// output parameter types
}

// Method on interface type
type imethod struct {
	hash uint32;		// hash of name + pkg + typ; same hash as method
	perm uint32;		// index of function pointer in interface map
	name *string;		// name of method
	pkgPath *string;	// nil for exported Names; otherwise import path
	typ *Type;		// .(*FuncType) underneath
}

// InterfaceType represents an interface type.
type InterfaceType struct {
	commonType;
	methods []imethod;	// sorted by hash
}

// MapType represents a map type.
type MapType struct {
	commonType;
	key *Type;		// map key type
	elem *Type;		// map element (value) type
}

// PtrType represents a pointer type.
type PtrType struct {
	commonType;
	elem *Type;		// pointer element (pointed at) type
}

// Struct field
type structField struct {
	name *string;		// nil for embedded fields
	pkgPath *string;	// nil for exported Names; otherwise import path
	typ *Type;		// type of field
	tag *string;		// nil if no tag
	offset uintptr;		// byte offset of field within struct
}

// StructType represents a struct type.
type StructType struct {
	commonType;
	fields []structField;	// sorted by offset
}

/*
 * Must match iface.c:/Itab and compilers.
 */
type Itable struct {
	Itype *Type;	// (*tab.inter).(*InterfaceType) is the interface type
	Type *Type;
	link *Itable;
	bad int32;
	unused int32;
	Fn [100000]uintptr;	// bigger than we'll ever see
}
