vector.go 1.91 KB
Newer Older
1 2 3 4 5 6
// 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.

package vector

7
//export Vector, New;
8 9 10 11 12 13

/*
	import vector "vector"
	v := vector.New();
	v.Insert(0, new(Foo));
	v.Append(new(Foo));
Rob Pike's avatar
Rob Pike committed
14
	v.Remove(0);
15 16 17 18 19 20
	for i := 0; i < v.Len(); i++ { f(v.At(i)); }
*/

type Element interface {
}

21

22
export type Vector struct {
23 24 25 26
	elem *[]Element;
}


27
export func New() *Vector {
28
	v := new(Vector);
Rob Pike's avatar
Rob Pike committed
29
	v.elem = new([]Element, 8) [0 : 0];  // capacity must be > 0!
30 31 32
	return v;
}

33

34
func (v *Vector) Len() int {
35
	return len(v.elem);
36 37
}

38

39
func (v *Vector) At(i int) Element {
Rob Pike's avatar
Rob Pike committed
40
	// range check unnecessary - done by runtime
41 42 43
	return v.elem[i];
}

44

Rob Pike's avatar
Rob Pike committed
45 46
func (v *Vector) Remove(i int) Element {
	ret := v.elem[i];
47
	n := v.Len();
Rob Pike's avatar
Rob Pike committed
48
	// range check unnecessary - done by runtime
49 50
	for j := i + 1; j < n; j++ {
		v.elem[j - 1] = v.elem[j];
51
	}
52 53 54
	var e Element;
	v.elem[n - 1] = e;  // don't set to nil - may not be legal in the future
	v.elem = v.elem[0 : n - 1];
Rob Pike's avatar
Rob Pike committed
55
	return ret;
56 57
}

58

59
func (v *Vector) Insert(i int, e Element) {
60
	n := v.Len();
Rob Pike's avatar
Rob Pike committed
61
	// range check unnecessary - done by runtime
62 63 64 65 66 67

	// grow array by doubling its capacity
	if n == cap(v.elem) {
		a := new([]Element, n*2);
		for j := 0; j < n; j++ {
			a[j] = v.elem[j];
68
		}
69
		v.elem = a;
70
	}
71

72
	// make a hole
73 74
	v.elem = v.elem[0 : n + 1];
	for j := n; j > i; j-- {
75 76
		v.elem[j] = v.elem[j-1];
	}
77
	
78 79 80
	v.elem[i] = e;
}

81

82
func (v *Vector) Append(e Element) {
83
	v.Insert(len(v.elem), e);
84 85
}

86

87 88 89 90 91 92 93 94 95 96
/*
type I struct { val int; };  // BUG: can't be local;

func Test() {
	i0 := new(I); i0.val = 0;
	i1 := new(I); i1.val = 11;
	i2 := new(I); i2.val = 222;
	i3 := new(I); i3.val = 3333;
	i4 := new(I); i4.val = 44444;
	v := New();
97
	print("hi\n");
98 99 100 101 102 103
	v.Insert(0, i4);
	v.Insert(0, i3);
	v.Insert(0, i2);
	v.Insert(0, i1);
	v.Insert(0, i0);
	for i := 0; i < v.Len(); i++ {
Rob Pike's avatar
Rob Pike committed
104
		x := convert(*I, v.At(i));
105
		print(i, " ", v.At(i).(*I).val, "\n");
106 107 108 109 110
	}
}

export Test;
*/