From d190d8a6b3717402744902d060be57195f27d604 Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Tue, 16 Apr 2013 23:04:35 +0200 Subject: Take 2 on polymorphism --- object.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 object.go (limited to 'object.go') diff --git a/object.go b/object.go new file mode 100644 index 0000000..0d55409 --- /dev/null +++ b/object.go @@ -0,0 +1,49 @@ +package git + +/* +#cgo pkg-config: libgit2 +#include +#include +*/ +import "C" +import "runtime" + +type ObjectType int + +var ( + OBJ_ANY ObjectType = C.GIT_OBJ_ANY + OBJ_BAD ObjectType = C.GIT_OBJ_BAD + OBJ_COMMIT ObjectType = C.GIT_OBJ_COMMIT + OBJ_TREE ObjectType = C.GIT_OBJ_TREE + OBJ_BLOB ObjectType = C.GIT_OBJ_BLOB + OBJ_TAG ObjectType = C.GIT_OBJ_TAG +) + +type Object interface { + Free() + Id() *Oid + Type() ObjectType +} + +func allocObject(cobj *C.git_object) Object { + var object Object + + switch ObjectType(C.git_object_type(cobj)) { + case OBJ_COMMIT: + object = &Commit{cobj} + runtime.SetFinalizer(object, (*Commit).Free) + + case OBJ_TREE: + object = &Tree{cobj} + runtime.SetFinalizer(object, (*Tree).Free) + + case OBJ_BLOB: + object = &Blob{cobj} + runtime.SetFinalizer(object, (*Blob).Free) + + default: + return nil + } + + return object +} -- cgit v1.2.3