// 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
}
