/* go-type.h -- basic information for a Go type.

   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.  */

#ifndef LIBGO_GO_TYPE_H
#define LIBGO_GO_TYPE_H

#include <stddef.h>
#include <stdint.h>

#include "array.h"

struct String;

/* Many of the types in this file must match the data structures
   generated by the compiler, and must also match the Go types which
   appear in go/runtime/type.go and go/reflect/type.go.  */

/* Type kinds.  These are used to get the type descriptor to use for
   the type itself, when using unsafe.Typeof or unsafe.Reflect.  The
   values here must match the values generated by the compiler (the
   RUNTIME_TYPE_KIND_xxx values in gcc/go/types.h).  These are macros
   rather than an enum to make it easy to change values in the future
   and hard to get confused about it.

   These correspond to the kind values used by the gc compiler.  */

#define GO_BOOL 1
#define GO_INT 2
#define GO_INT8 3
#define GO_INT16 4
#define GO_INT32 5
#define GO_INT64 6
#define GO_UINT 7
#define GO_UINT8 8
#define GO_UINT16 9
#define GO_UINT32 10
#define GO_UINT64 11
#define GO_UINTPTR 12
#define GO_FLOAT32 13
#define GO_FLOAT64 14
#define GO_COMPLEX64 15
#define GO_COMPLEX128 16
#define GO_ARRAY 17
#define GO_CHAN 18
#define GO_FUNC 19
#define GO_INTERFACE 20
#define GO_MAP 21
#define GO_PTR 22
#define GO_SLICE 23
#define GO_STRING 24
#define GO_STRUCT 25
#define GO_UNSAFE_POINTER 26

#define GO_NO_POINTERS (1 << 7)

#define GO_CODE_MASK 0x7f

/* For each Go type the compiler constructs one of these structures.
   This is used for type reflectin, interfaces, maps, and reference
   counting.  */

struct __go_type_descriptor
{
  /* The type code for this type, one of the type kind values above.
     This is used by unsafe.Reflect and unsafe.Typeof to determine the
     type descriptor to return for this type itself.  It is also used
     by reflect.toType when mapping to a reflect Type structure.  */
  unsigned char __code;

  /* The alignment in bytes of a variable with this type.  */
  unsigned char __align;

  /* The alignment in bytes of a struct field with this type.  */
  unsigned char __field_align;

  /* The size in bytes of a value of this type.  Note that all types
     in Go have a fixed size.  */
  uintptr_t __size;

  /* The type's hash code.  */
  uint32_t __hash;

  /* This function takes a pointer to a value of this type, and the
     size of this type, and returns a hash code.  We pass the size
     explicitly becaues it means that we can share a single instance
     of this function for various different types.  */
  uintptr_t (*__hashfn) (const void *, uintptr_t);

  /* This function takes two pointers to values of this type, and the
     size of this type, and returns whether the values are equal.  */
  _Bool (*__equalfn) (const void *, const void *, uintptr_t);

  /* A string describing this type.  This is only used for
     debugging.  */
  const struct String *__reflection;

  /* A pointer to fields which are only used for some types.  */
  const struct __go_uncommon_type *__uncommon;

  /* The descriptor for the type which is a pointer to this type.
     This may be NULL.  */
  const struct __go_type_descriptor *__pointer_to_this;
};

/* The information we store for each method of a type.  */

struct __go_method
{
  /* The name of the method.  */
  const struct String *__name;

  /* This is NULL for an exported method, or the name of the package
     where it lives.  */
  const struct String *__pkg_path;

  /* The type of the method, without the receiver.  This will be a
     function type.  */
  const struct __go_type_descriptor *__mtype;

  /* The type of the method, with the receiver.  This will be a
     function type.  */
  const struct __go_type_descriptor *__type;

  /* A pointer to the code which implements the method.  This is
     really a function pointer.  */
  const void *__function;
};

/* Additional information that we keep for named types and for types
   with methods.  */

struct __go_uncommon_type
{
  /* The name of the type.  */
  const struct String *__name;

  /* The type's package.  This is NULL for builtin types.  */
  const struct String *__pkg_path;

  /* The type's methods.  This is an array of struct __go_method.  */
  struct __go_open_array __methods;
};

/* The type descriptor for a fixed array type.  */

struct __go_array_type
{
  /* Starts like all type descriptors.  */
  struct __go_type_descriptor __common;

  /* The element type.  */
  struct __go_type_descriptor *__element_type;

  /* The type of a slice of the same element type.  */
  struct __go_type_descriptor *__slice_type;

  /* The length of the array.  */
  uintptr_t __len;
};

/* The type descriptor for a slice.  */

struct __go_slice_type
{
  /* Starts like all other type descriptors.  */
  struct __go_type_descriptor __common;

  /* The element type.  */
  struct __go_type_descriptor *__element_type;
};

/* The direction of a channel.  */
#define CHANNEL_RECV_DIR 1
#define CHANNEL_SEND_DIR 2
#define CHANNEL_BOTH_DIR (CHANNEL_RECV_DIR | CHANNEL_SEND_DIR)

/* The type descriptor for a channel.  */

struct __go_channel_type
{
  /* Starts like all other type descriptors.  */
  struct __go_type_descriptor __common;

  /* The element type.  */
  const struct __go_type_descriptor *__element_type;

  /* The direction.  */
  uintptr_t __dir;
};

/* The type descriptor for a function.  */

struct __go_func_type
{
  /* Starts like all other type descriptors.  */
  struct __go_type_descriptor __common;

  /* Whether this is a varargs function.  If this is true, there will
     be at least one parameter.  For "..." the last parameter type is
     "interface{}".  For "... T" the last parameter type is "[]T".  */
  _Bool __dotdotdot;

  /* The input parameter types.  This is an array of pointers to
     struct __go_type_descriptor.  */
  struct __go_open_array __in;

  /* The output parameter types.  This is an array of pointers to
     struct __go_type_descriptor.  */
  struct __go_open_array __out;
};

/* A method on an interface type.  */

struct __go_interface_method
{
  /* The name of the method.  */
  const struct String *__name;

  /* This is NULL for an exported method, or the name of the package
     where it lives.  */
  const struct String *__pkg_path;

  /* The real type of the method.  */
  struct __go_type_descriptor *__type;
};

/* An interface type.  */

struct __go_interface_type
{
  /* Starts like all other type descriptors.  */
  struct __go_type_descriptor __common;

  /* Array of __go_interface_method .  The methods are sorted in the
     same order that they appear in the definition of the
     interface.  */
  struct __go_open_array __methods;
};

/* A map type.  */

struct __go_map_type
{
  /* Starts like all other type descriptors.  */
  struct __go_type_descriptor __common;

  /* The map key type.  */
  const struct __go_type_descriptor *__key_type;

  /* The map value type.  */
  const struct __go_type_descriptor *__val_type;
};

/* A pointer type.  */

struct __go_ptr_type
{
  /* Starts like all other type descriptors.  */
  struct __go_type_descriptor __common;

  /* The type to which this points.  */
  const struct __go_type_descriptor *__element_type;
};

/* A field in a structure.  */

struct __go_struct_field
{
  /* The name of the field--NULL for an anonymous field.  */
  const struct String *__name;

  /* This is NULL for an exported method, or the name of the package
     where it lives.  */
  const struct String *__pkg_path;

  /* The type of the field.  */
  const struct __go_type_descriptor *__type;

  /* The field tag, or NULL.  */
  const struct String *__tag;

  /* The offset of the field in the struct.  */
  uintptr_t __offset;
};

/* A struct type.  */

struct __go_struct_type
{
  /* Starts like all other type descriptors.  */
  struct __go_type_descriptor __common;

  /* An array of struct __go_struct_field.  */
  struct __go_open_array __fields;
};

/* If an empty interface has these bits set in its type pointer, it
   was copied from a reflect.Value and is not a valid empty
   interface.  */

enum 
{
  reflectFlags = 3,
};

/* Whether a type descriptor is a pointer.  */

static inline _Bool
__go_is_pointer_type (const struct __go_type_descriptor *td)
{
  return td->__code == GO_PTR || td->__code == GO_UNSAFE_POINTER;
}

extern _Bool
__go_type_descriptors_equal(const struct __go_type_descriptor*,
			    const struct __go_type_descriptor*);

extern uintptr_t __go_type_hash_identity (const void *, uintptr_t);
extern _Bool __go_type_equal_identity (const void *, const void *, uintptr_t);
extern uintptr_t __go_type_hash_string (const void *, uintptr_t);
extern _Bool __go_type_equal_string (const void *, const void *, uintptr_t);
extern uintptr_t __go_type_hash_float (const void *, uintptr_t);
extern _Bool __go_type_equal_float (const void *, const void *, uintptr_t);
extern uintptr_t __go_type_hash_complex (const void *, uintptr_t);
extern _Bool __go_type_equal_complex (const void *, const void *, uintptr_t);
extern uintptr_t __go_type_hash_interface (const void *, uintptr_t);
extern _Bool __go_type_equal_interface (const void *, const void *, uintptr_t);
extern uintptr_t __go_type_hash_error (const void *, uintptr_t);
extern _Bool __go_type_equal_error (const void *, const void *, uintptr_t);

#endif /* !defined(LIBGO_GO_TYPE_H) */
