Files
ziutek-glib/type.go
Michał Derkacz b1b421e54b Widac jakis sens
2011-07-01 14:59:27 +02:00

121 lines
2.6 KiB
Go

package glib
/*
#include <glib-object.h>
#define _GINT_SIZE sizeof(gint)
#define _GLONG_SIZE sizeof(glong)
*/
import "C"
import (
"strconv"
"unsafe"
)
// A numerical value which represents the unique identifier of a registered type
type Type C.GType
const (
TYPE_INVALID = Type(C.G_TYPE_INVALID)
TYPE_NONE = Type(C.G_TYPE_NONE)
TYPE_INTERFACE = Type(C.G_TYPE_INTERFACE)
TYPE_CHAR = Type(C.G_TYPE_CHAR)
TYPE_UCHAR = Type(C.G_TYPE_UCHAR)
TYPE_BOOLEAN = Type(C.G_TYPE_BOOLEAN)
TYPE_INT = Type(C.G_TYPE_INT)
TYPE_UINT = Type(C.G_TYPE_UINT)
TYPE_LONG = Type(C.G_TYPE_LONG)
TYPE_ULONG = Type(C.G_TYPE_ULONG)
TYPE_INT64 = Type(C.G_TYPE_INT64)
TYPE_UINT64 = Type(C.G_TYPE_UINT64)
TYPE_ENUM = Type(C.G_TYPE_ENUM)
TYPE_FLAGS = Type(C.G_TYPE_FLAGS)
TYPE_FLOAT = Type(C.G_TYPE_FLOAT)
TYPE_DOUBLE = Type(C.G_TYPE_DOUBLE)
TYPE_STRING = Type(C.G_TYPE_STRING)
TYPE_POINTER = Type(C.G_TYPE_POINTER)
TYPE_BOXED = Type(C.G_TYPE_BOXED)
TYPE_PARAM = Type(C.G_TYPE_PARAM)
TYPE_OBJECT = Type(C.G_TYPE_OBJECT)
TYPE_VARIANT = Type(C.G_TYPE_VARIANT)
)
var (
TYPE_GTYPE Type
TYPE_GO_INT Type
TYPE_GO_UINT Type
TYPE_GO_INT32 Type
TYPE_GO_UINT32 Type
)
// Returns the Type of the value in the interface{}.
func TypeOf(i interface{}) Type {
switch i.(type) {
case string:
return TYPE_STRING
case int:
return TYPE_GO_INT
case uint:
return TYPE_GO_UINT
case int8:
return TYPE_CHAR
case uint8:
return TYPE_UCHAR
case int32:
return TYPE_GO_INT32
case uint32:
return TYPE_GO_UINT32
case int64:
return TYPE_INT64
case uint64:
return TYPE_UINT64
case bool:
return TYPE_BOOLEAN
case float32:
return TYPE_FLOAT
case float64:
return TYPE_DOUBLE
case unsafe.Pointer:
return TYPE_POINTER
case *Object:
return TYPE_OBJECT
case Type:
return TYPE_GTYPE
}
return TYPE_INVALID
}
func (t Type) String() string {
return C.GoString((*C.char)(C.g_type_name(C.GType(t))))
}
func init() {
C.g_thread_init(nil)
C.g_type_init()
TYPE_GTYPE = Type(C.g_gtype_get_type())
switch strconv.IntSize / 8 {
case uint(C._GINT_SIZE):
TYPE_GO_INT = TYPE_INT
TYPE_GO_UINT = TYPE_UINT
case uint(C._GLONG_SIZE):
TYPE_GO_INT = TYPE_LONG
TYPE_GO_UINT = TYPE_ULONG
case 64:
TYPE_GO_INT = TYPE_INT64
TYPE_GO_UINT = TYPE_UINT64
default:
panic("Unexpectd size of 'int'")
}
switch C.uint(4) {
case C._GINT_SIZE:
TYPE_GO_INT32 = TYPE_INT
TYPE_GO_UINT32 = TYPE_UINT
case C._GLONG_SIZE:
TYPE_GO_INT32 = TYPE_LONG
TYPE_GO_UINT32 = TYPE_ULONG
default:
panic("Neither gint nor glong are 32 bit numbers")
}
}