1
0
mirror of https://github.com/golang/go synced 2024-11-21 18:14:42 -07:00

Change to container/vector interface:

- removed New(len int) in favor of new(Vector).Resize(len, cap)
- removed Init(len int) in favor of Resize(len, cap)
- runs all.bash

Fixes #294.

R=rsc, r, r1
https://golang.org/cl/157143
This commit is contained in:
Robert Griesemer 2009-11-24 13:43:18 -08:00
parent 568465a931
commit 001a8b11ff
25 changed files with 197 additions and 167 deletions

View File

@ -255,7 +255,7 @@ func newFileRun(h0 *RunList, i, j int) interface{} {
// reduce the list of Spots into a list of KindRuns // reduce the list of Spots into a list of KindRuns
var h1 RunList; var h1 RunList;
h1.Vector.Init(j - i); h1.Vector.Resize(j-i, 0);
k := 0; k := 0;
for ; i < j; i++ { for ; i < j; i++ {
h1.Set(k, h0.At(i).(Spot).Info); h1.Set(k, h0.At(i).(Spot).Info);

View File

@ -15,13 +15,6 @@ type myHeap struct {
} }
func newHeap() *myHeap {
var h myHeap;
h.IntVector.Init(0);
return &h;
}
func (h *myHeap) verify(t *testing.T, i int) { func (h *myHeap) verify(t *testing.T, i int) {
n := h.Len(); n := h.Len();
j1 := 2*i + 1; j1 := 2*i + 1;
@ -50,7 +43,7 @@ func (h *myHeap) Pop() interface{} { return h.IntVector.Pop() }
func TestInit(t *testing.T) { func TestInit(t *testing.T) {
h := newHeap(); h := new(myHeap);
for i := 20; i > 0; i-- { for i := 20; i > 0; i-- {
h.Push(i) h.Push(i)
} }
@ -68,7 +61,7 @@ func TestInit(t *testing.T) {
func Test(t *testing.T) { func Test(t *testing.T) {
h := newHeap(); h := new(myHeap);
h.verify(t, 0); h.verify(t, 0);
for i := 20; i > 10; i-- { for i := 20; i > 10; i-- {

View File

@ -11,19 +11,21 @@ type IntVector struct {
} }
// Init initializes a new or resized vector. The initial length may be <= 0 to // Resize changes the length and capacity of a vector.
// request a default length. If initial_len is shorter than the current // If the new length is shorter than the current length, Resize discards
// length of the IntVector, trailing elements of the IntVector will be cleared. // trailing elements. If the new length is longer than the current length,
func (p *IntVector) Init(len int) *IntVector { // Resize adds 0 elements. The capacity parameter is ignored unless the
p.Vector.Init(len); // new length or capacity is longer that the current capacity.
func (p *IntVector) Resize(length, capacity int) *IntVector {
i := p.Len();
p.Vector.Resize(length, capacity);
for a := p.a; i < len(a); i++ {
a[i] = 0
}
return p; return p;
} }
// NewIntVector returns an initialized new IntVector with length at least len.
func NewIntVector(len int) *IntVector { return new(IntVector).Init(len) }
// At returns the i'th element of the vector. // At returns the i'th element of the vector.
func (p *IntVector) At(i int) int { return p.Vector.At(i).(int) } func (p *IntVector) At(i int) int { return p.Vector.At(i).(int) }

View File

@ -10,19 +10,21 @@ type StringVector struct {
} }
// Init initializes a new or resized vector. The initial length may be <= 0 to // Resize changes the length and capacity of a vector.
// request a default length. If initial_len is shorter than the current // If the new length is shorter than the current length, Resize discards
// length of the StringVector, trailing elements of the StringVector will be cleared. // trailing elements. If the new length is longer than the current length,
func (p *StringVector) Init(len int) *StringVector { // Resize adds "" elements. The capacity parameter is ignored unless the
p.Vector.Init(len); // new length or capacity is longer that the current capacity.
func (p *StringVector) Resize(length, capacity int) *StringVector {
i := p.Len();
p.Vector.Resize(length, capacity);
for a := p.a; i < len(a); i++ {
a[i] = ""
}
return p; return p;
} }
// NewStringVector returns an initialized new StringVector with length at least len.
func NewStringVector(len int) *StringVector { return new(StringVector).Init(len) }
// At returns the i'th element of the vector. // At returns the i'th element of the vector.
func (p *StringVector) At(i int) string { return p.Vector.At(i).(string) } func (p *StringVector) At(i int) string { return p.Vector.At(i).(string) }

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// The vector package implements an efficient container for managing // The vector package implements a container for managing sequences
// linear arrays of elements. Unlike arrays, vectors can change size dynamically. // of elements. Vectors grow and shrink dynamically as necessary.
package vector package vector
// Vector is the container itself. // Vector is the container itself.
@ -13,29 +13,22 @@ type Vector struct {
} }
func copy(dst, src []interface{}) {
for i, x := range src {
dst[i] = x
}
}
// Insert n elements at position i. // Insert n elements at position i.
func expand(a []interface{}, i, n int) []interface{} { func expand(a []interface{}, i, n int) []interface{} {
// make sure we have enough space // make sure we have enough space
len0 := len(a); len0 := len(a);
len1 := len0 + n; len1 := len0 + n;
if len1 < cap(a) { if len1 <= cap(a) {
// enough space - just expand // enough space - just expand
a = a[0:len1] a = a[0:len1]
} else { } else {
// not enough space - double capacity // not enough space - double capacity
capb := cap(a) * 2; capb := cap(a) * 2;
if capb < len1 { if capb <= len1 {
// still not enough - use required length // still not enough - use required length
capb = len1 capb = len1
} }
// capb >= len1 // capb > len1
b := make([]interface{}, len1, capb); b := make([]interface{}, len1, capb);
copy(b, a); copy(b, a);
a = b; a = b;
@ -49,42 +42,38 @@ func expand(a []interface{}, i, n int) []interface{} {
} }
// Init initializes a new or resized vector. The initial_len may be <= 0 to // Resize changes the length and capacity of a vector.
// request a default length. If initial_len is shorter than the current // If the new length is shorter than the current length, Resize discards
// length of the Vector, trailing elements of the Vector will be cleared. // trailing elements. If the new length is longer than the current length,
func (p *Vector) Init(initial_len int) *Vector { // Resize adds nil elements. The capacity parameter is ignored unless the
// new length or capacity is longer that the current capacity.
func (p *Vector) Resize(length, capacity int) *Vector {
a := p.a; a := p.a;
if cap(a) == 0 || cap(a) < initial_len { if length > cap(a) || capacity > cap(a) {
n := 8; // initial capacity // not enough space or larger capacity requested explicitly
if initial_len > n { b := make([]interface{}, length, capacity);
n = initial_len copy(b, a);
} a = b;
a = make([]interface{}, n); } else if length < len(a) {
} else { // clear trailing elements
// nil out entries for i := range a[length:] {
for j := len(a) - 1; j >= 0; j-- { a[length+i] = nil
a[j] = nil
} }
} }
p.a = a[0:initial_len]; p.a = a[0:length];
return p; return p;
} }
// New returns an initialized new Vector with length at least len.
func New(len int) *Vector { return new(Vector).Init(len) }
// Len returns the number of elements in the vector. // Len returns the number of elements in the vector.
// Len is 0 if p == nil. func (p *Vector) Len() int { return len(p.a) }
func (p *Vector) Len() int {
if p == nil {
return 0 // Cap returns the capacity of the vector; that is, the
} // maximum length the vector can grow without resizing.
return len(p.a); func (p *Vector) Cap() int { return cap(p.a) }
}
// At returns the i'th element of the vector. // At returns the i'th element of the vector.
@ -155,7 +144,7 @@ func (p *Vector) Cut(i, j int) {
// Slice returns a new Vector by slicing the old one to extract slice [i:j]. // Slice returns a new Vector by slicing the old one to extract slice [i:j].
// The elements are copied. The original vector is unchanged. // The elements are copied. The original vector is unchanged.
func (p *Vector) Slice(i, j int) *Vector { func (p *Vector) Slice(i, j int) *Vector {
s := New(j - i); // will fail in Init() if j < j s := new(Vector).Resize(j-i, 0); // will fail in Init() if j < i
copy(s.a, p.a[i:j]); copy(s.a, p.a[i:j]);
return s; return s;
} }

View File

@ -10,41 +10,100 @@ import "fmt"
func TestZeroLen(t *testing.T) { func TestZeroLen(t *testing.T) {
var a *Vector; a := new(Vector);
if a.Len() != 0 {
t.Errorf("A) expected 0, got %d", a.Len())
}
a = New(0);
if a.Len() != 0 { if a.Len() != 0 {
t.Errorf("B) expected 0, got %d", a.Len()) t.Errorf("B) expected 0, got %d", a.Len())
} }
} }
func TestInit(t *testing.T) { type VectorInterface interface {
var a Vector; Len() int;
if a.Init(0).Len() != 0 { Cap() int;
t.Error("A") }
func checkSize(t *testing.T, v VectorInterface, len, cap int) {
if v.Len() != len {
t.Errorf("expected len = %d; found %d", len, v.Len())
} }
if a.Init(1).Len() != 1 { if v.Cap() != cap {
t.Error("B") t.Errorf("expected cap = %d; found %d", cap, v.Cap())
}
if a.Init(10).Len() != 10 {
t.Error("C")
} }
} }
func TestNew(t *testing.T) { func TestResize(t *testing.T) {
if New(0).Len() != 0 { var a Vector;
t.Error("A") checkSize(t, &a, 0, 0);
checkSize(t, a.Resize(0, 5), 0, 5);
checkSize(t, a.Resize(1, 0), 1, 5);
checkSize(t, a.Resize(10, 0), 10, 10);
checkSize(t, a.Resize(5, 0), 5, 10);
checkSize(t, a.Resize(3, 8), 3, 10);
checkSize(t, a.Resize(0, 100), 0, 100);
checkSize(t, a.Resize(11, 100), 11, 100);
}
func TestIntResize(t *testing.T) {
var a IntVector;
checkSize(t, &a, 0, 0);
a.Push(1);
a.Push(2);
a.Push(3);
a.Push(4);
checkSize(t, &a, 4, 4);
checkSize(t, a.Resize(10, 0), 10, 10);
for i := 4; i < a.Len(); i++ {
if a.At(i) != 0 {
t.Errorf("expected a.At(%d) == 0; found %d", i, a.At(i))
}
} }
if New(1).Len() != 1 { }
t.Error("B")
func TestStringResize(t *testing.T) {
var a StringVector;
checkSize(t, &a, 0, 0);
a.Push("1");
a.Push("2");
a.Push("3");
a.Push("4");
checkSize(t, &a, 4, 4);
checkSize(t, a.Resize(10, 0), 10, 10);
for i := 4; i < a.Len(); i++ {
if a.At(i) != "" {
t.Errorf("expected a.At(%d) == " "; found %s", i, a.At(i))
}
} }
if New(10).Len() != 10 { }
t.Error("C")
func checkNil(t *testing.T, a *Vector, i int) {
for j := 0; j < i; j++ {
if a.At(j) == nil {
t.Errorf("expected a.At(%d) == %d; found %v", j, j, a.At(j))
}
} }
for ; i < a.Len(); i++ {
if a.At(i) != nil {
t.Errorf("expected a.At(%d) == nil; found %v", i, a.At(i))
}
}
}
func TestTrailingElements(t *testing.T) {
var a Vector;
for i := 0; i < 10; i++ {
a.Push(i)
}
checkNil(t, &a, 10);
checkSize(t, &a, 10, 16);
checkSize(t, a.Resize(5, 0), 5, 16);
checkSize(t, a.Resize(10, 0), 10, 16);
checkNil(t, &a, 5);
} }
@ -54,7 +113,7 @@ func val(i int) int { return i*991 - 1234 }
func TestAccess(t *testing.T) { func TestAccess(t *testing.T) {
const n = 100; const n = 100;
var a Vector; var a Vector;
a.Init(n); a.Resize(n, 0);
for i := 0; i < n; i++ { for i := 0; i < n; i++ {
a.Set(i, val(i)) a.Set(i, val(i))
} }
@ -104,7 +163,7 @@ func TestInsertDeleteClear(t *testing.T) {
t.Error("H") t.Error("H")
} }
} }
a.Init(0); a.Resize(0, 0);
if a.Len() != 0 { if a.Len() != 0 {
t.Errorf("I wrong len %d (expected 0)", a.Len()) t.Errorf("I wrong len %d (expected 0)", a.Len())
} }
@ -157,7 +216,7 @@ func verify_pattern(t *testing.T, x *Vector, a, b, c int) {
func make_vector(elt, len int) *Vector { func make_vector(elt, len int) *Vector {
x := New(len); x := new(Vector).Resize(len, 0);
for i := 0; i < len; i++ { for i := 0; i < len; i++ {
x.Set(i, elt) x.Set(i, elt)
} }
@ -193,7 +252,7 @@ func TestInsertVector(t *testing.T) {
func TestSorting(t *testing.T) { func TestSorting(t *testing.T) {
const n = 100; const n = 100;
a := NewIntVector(n); a := new(IntVector).Resize(n, 0);
for i := n - 1; i >= 0; i-- { for i := n - 1; i >= 0; i-- {
a.Set(i, n-1-i) a.Set(i, n-1-i)
} }
@ -201,7 +260,7 @@ func TestSorting(t *testing.T) {
t.Error("int vector not sorted") t.Error("int vector not sorted")
} }
b := NewStringVector(n); b := new(StringVector).Resize(n, 0);
for i := n - 1; i >= 0; i-- { for i := n - 1; i >= 0; i-- {
b.Set(i, fmt.Sprint(n-1-i)) b.Set(i, fmt.Sprint(n-1-i))
} }
@ -214,7 +273,7 @@ func TestSorting(t *testing.T) {
func TestDo(t *testing.T) { func TestDo(t *testing.T) {
const n = 25; const n = 25;
const salt = 17; const salt = 17;
a := NewIntVector(n); a := new(IntVector).Resize(n, 0);
for i := 0; i < n; i++ { for i := 0; i < n; i++ {
a.Set(i, salt*i) a.Set(i, salt*i)
} }
@ -234,7 +293,7 @@ func TestDo(t *testing.T) {
func TestIter(t *testing.T) { func TestIter(t *testing.T) {
const Len = 100; const Len = 100;
x := New(Len); x := new(Vector).Resize(Len, 0);
for i := 0; i < Len; i++ { for i := 0; i < Len; i++ {
x.Set(i, i*i) x.Set(i, i*i)
} }

View File

@ -566,7 +566,7 @@ func ParseCertificate(asn1Data []byte) (*Certificate, os.Error) {
// ParseCertificates parses one or more certificates from the given ASN.1 DER // ParseCertificates parses one or more certificates from the given ASN.1 DER
// data. The certificates must be concatenated with no intermediate padding. // data. The certificates must be concatenated with no intermediate padding.
func ParseCertificates(asn1Data []byte) ([]*Certificate, os.Error) { func ParseCertificates(asn1Data []byte) ([]*Certificate, os.Error) {
v := vector.New(0); v := new(vector.Vector);
for len(asn1Data) > 0 { for len(asn1Data) > 0 {
cert := new(certificate); cert := new(certificate);

View File

@ -472,7 +472,7 @@ func (t *thread) setState(new threadState) {
return return
} }
t.proc.transitionHandlers = vector.New(0); t.proc.transitionHandlers = new(vector.Vector);
for _, h := range handlers.Data() { for _, h := range handlers.Data() {
h := h.(*transitionHandler); h := h.(*transitionHandler);
h.handle(t, old, new); h.handle(t, old, new);
@ -1256,7 +1256,7 @@ func newProcess(pid int) *process {
debugEvents: make(chan *debugEvent), debugEvents: make(chan *debugEvent),
debugReqs: make(chan *debugReq), debugReqs: make(chan *debugReq),
stopReq: make(chan os.Error), stopReq: make(chan os.Error),
transitionHandlers: vector.New(0), transitionHandlers: new(vector.Vector),
}; };
go p.monitor(); go p.monitor();

View File

@ -204,8 +204,8 @@ func (v *verifier) verify(grammar Grammar, start string) {
} }
// initialize verifier // initialize verifier
v.ErrorVector.Init(); v.ErrorVector.Reset();
v.worklist.Init(0); v.worklist.Resize(0, 0);
v.reached = make(Grammar); v.reached = make(Grammar);
v.grammar = grammar; v.grammar = grammar;

View File

@ -117,7 +117,6 @@ func (p *parser) parseTerm() (x Expression) {
func (p *parser) parseSequence() Expression { func (p *parser) parseSequence() Expression {
var list vector.Vector; var list vector.Vector;
list.Init(0);
for x := p.parseTerm(); x != nil; x = p.parseTerm() { for x := p.parseTerm(); x != nil; x = p.parseTerm() {
list.Push(x) list.Push(x)
@ -142,7 +141,6 @@ func (p *parser) parseSequence() Expression {
func (p *parser) parseExpression() Expression { func (p *parser) parseExpression() Expression {
var list vector.Vector; var list vector.Vector;
list.Init(0);
for { for {
x := p.parseSequence(); x := p.parseSequence();
@ -183,7 +181,7 @@ func (p *parser) parseProduction() *Production {
func (p *parser) parse(filename string, src []byte) Grammar { func (p *parser) parse(filename string, src []byte) Grammar {
// initialize parser // initialize parser
p.ErrorVector.Init(); p.ErrorVector.Reset();
p.scanner.Init(filename, src, p, 0); p.scanner.Init(filename, src, p, 0);
p.next(); // initializes pos, tok, lit p.next(); // initializes pos, tok, lit

View File

@ -40,7 +40,7 @@ func (p *parser) next() {
func (p *parser) init(filename string, src []byte) { func (p *parser) init(filename string, src []byte) {
p.ErrorVector.Init(); p.ErrorVector.Reset();
p.scanner.Init(filename, src, p, scanner.AllowIllegalChars); // return '@' as token.ILLEGAL w/o error message p.scanner.Init(filename, src, p, scanner.AllowIllegalChars); // return '@' as token.ILLEGAL w/o error message
p.next(); // initializes pos, tok, lit p.next(); // initializes pos, tok, lit
p.packs = make(map[string]string); p.packs = make(map[string]string);
@ -144,7 +144,6 @@ func (p *parser) parseLiteral() literal {
// that start with "%" possibly followed by a last segment that // that start with "%" possibly followed by a last segment that
// starts with some other character. // starts with some other character.
var list vector.Vector; var list vector.Vector;
list.Init(0);
i0 := 0; i0 := 0;
for i := 0; i < len(s); i++ { for i := 0; i < len(s); i++ {
if s[i] == '%' && i+1 < len(s) { if s[i] == '%' && i+1 < len(s) {
@ -239,7 +238,6 @@ func (p *parser) parseOperand() (x expr) {
func (p *parser) parseSequence() expr { func (p *parser) parseSequence() expr {
var list vector.Vector; var list vector.Vector;
list.Init(0);
for x := p.parseOperand(); x != nil; x = p.parseOperand() { for x := p.parseOperand(); x != nil; x = p.parseOperand() {
list.Push(x) list.Push(x)
@ -264,7 +262,6 @@ func (p *parser) parseSequence() expr {
func (p *parser) parseExpression() expr { func (p *parser) parseExpression() expr {
var list vector.Vector; var list vector.Vector;
list.Init(0);
for { for {
x := p.parseSequence(); x := p.parseSequence();

View File

@ -47,7 +47,7 @@ func (w *World) CompileStmtList(stmts []ast.Stmt) (Code, os.Error) {
return w.CompileExpr(s.X) return w.CompileExpr(s.X)
} }
} }
errors := scanner.NewErrorVector(); errors := new(scanner.ErrorVector);
cc := &compiler{errors, 0, 0}; cc := &compiler{errors, 0, 0};
cb := newCodeBuf(); cb := newCodeBuf();
fc := &funcCompiler{ fc := &funcCompiler{
@ -96,7 +96,7 @@ type exprCode struct {
} }
func (w *World) CompileExpr(e ast.Expr) (Code, os.Error) { func (w *World) CompileExpr(e ast.Expr) (Code, os.Error) {
errors := scanner.NewErrorVector(); errors := new(scanner.ErrorVector);
cc := &compiler{errors, 0, 0}; cc := &compiler{errors, 0, 0};
ec := cc.compileExpr(w.scope.block, false, e); ec := cc.compileExpr(w.scope.block, false, e);

View File

@ -36,7 +36,7 @@ func Any(iter Iterable, f func(interface{}) bool) bool {
// Data returns a slice containing the elements of iter. // Data returns a slice containing the elements of iter.
func Data(iter Iterable) []interface{} { func Data(iter Iterable) []interface{} {
vec := vector.New(0); vec := new(vector.Vector);
for e := range iter.Iter() { for e := range iter.Iter() {
vec.Push(e) vec.Push(e)
} }

View File

@ -63,7 +63,6 @@ func Main() {
func newScanner(input []byte) (*scanner.Scanner, *scanner.ErrorVector) { func newScanner(input []byte) (*scanner.Scanner, *scanner.ErrorVector) {
sc := new(scanner.Scanner); sc := new(scanner.Scanner);
ev := new(scanner.ErrorVector); ev := new(scanner.ErrorVector);
ev.Init();
sc.Init("input", input, ev, 0); sc.Init("input", input, ev, 0);
return sc, ev; return sc, ev;

View File

@ -46,10 +46,10 @@ type docReader struct {
func (doc *docReader) init(pkgName string) { func (doc *docReader) init(pkgName string) {
doc.pkgName = pkgName; doc.pkgName = pkgName;
doc.values = vector.New(0); doc.values = new(vector.Vector);
doc.types = make(map[string]*typeDoc); doc.types = make(map[string]*typeDoc);
doc.funcs = make(map[string]*ast.FuncDecl); doc.funcs = make(map[string]*ast.FuncDecl);
doc.bugs = vector.New(0); doc.bugs = new(vector.Vector);
} }
@ -74,7 +74,7 @@ func (doc *docReader) lookupTypeDoc(name string) *typeDoc {
return tdoc return tdoc
} }
// type wasn't found - add one without declaration // type wasn't found - add one without declaration
tdoc := &typeDoc{nil, vector.New(0), make(map[string]*ast.FuncDecl), make(map[string]*ast.FuncDecl)}; tdoc := &typeDoc{nil, new(vector.Vector), make(map[string]*ast.FuncDecl), make(map[string]*ast.FuncDecl)};
doc.types[name] = tdoc; doc.types[name] = tdoc;
return tdoc; return tdoc;
} }

View File

@ -76,7 +76,6 @@ func scannerMode(mode uint) uint {
func (p *parser) init(filename string, src []byte, mode uint) { func (p *parser) init(filename string, src []byte, mode uint) {
p.ErrorVector.Init();
p.scanner.Init(filename, src, p, scannerMode(mode)); p.scanner.Init(filename, src, p, scannerMode(mode));
p.mode = mode; p.mode = mode;
p.trace = mode&Trace != 0; // for convenience (p.trace is used frequently) p.trace = mode&Trace != 0; // for convenience (p.trace is used frequently)
@ -164,7 +163,7 @@ func (p *parser) consumeComment() (comment *ast.Comment, endline int) {
// a comment group. // a comment group.
// //
func (p *parser) consumeCommentGroup() int { func (p *parser) consumeCommentGroup() int {
list := vector.New(0); list := new(vector.Vector);
endline := p.pos.Line; endline := p.pos.Line;
for p.tok == token.COMMENT && endline+1 >= p.pos.Line { for p.tok == token.COMMENT && endline+1 >= p.pos.Line {
var comment *ast.Comment; var comment *ast.Comment;
@ -309,7 +308,7 @@ func (p *parser) parseIdentList() []*ast.Ident {
defer un(trace(p, "IdentList")) defer un(trace(p, "IdentList"))
} }
list := vector.New(0); list := new(vector.Vector);
list.Push(p.parseIdent()); list.Push(p.parseIdent());
for p.tok == token.COMMA { for p.tok == token.COMMA {
p.next(); p.next();
@ -331,7 +330,7 @@ func (p *parser) parseExprList() []ast.Expr {
defer un(trace(p, "ExpressionList")) defer un(trace(p, "ExpressionList"))
} }
list := vector.New(0); list := new(vector.Vector);
list.Push(p.parseExpr()); list.Push(p.parseExpr());
for p.tok == token.COMMA { for p.tok == token.COMMA {
p.next(); p.next();
@ -436,7 +435,7 @@ func (p *parser) parseFieldDecl() *ast.Field {
doc := p.leadComment; doc := p.leadComment;
// a list of identifiers looks like a list of type names // a list of identifiers looks like a list of type names
list := vector.New(0); list := new(vector.Vector);
for { for {
// TODO(gri): do not allow ()'s here // TODO(gri): do not allow ()'s here
list.Push(p.parseType()); list.Push(p.parseType());
@ -483,7 +482,7 @@ func (p *parser) parseStructType() *ast.StructType {
pos := p.expect(token.STRUCT); pos := p.expect(token.STRUCT);
lbrace := p.expect(token.LBRACE); lbrace := p.expect(token.LBRACE);
list := vector.New(0); list := new(vector.Vector);
for p.tok == token.IDENT || p.tok == token.MUL { for p.tok == token.IDENT || p.tok == token.MUL {
f := p.parseFieldDecl(); f := p.parseFieldDecl();
if p.tok != token.RBRACE { if p.tok != token.RBRACE {
@ -548,7 +547,7 @@ func (p *parser) parseParameterDecl(ellipsisOk bool) (*vector.Vector, ast.Expr)
} }
// a list of identifiers looks like a list of type names // a list of identifiers looks like a list of type names
list := vector.New(0); list := new(vector.Vector);
for { for {
// TODO(gri): do not allow ()'s here // TODO(gri): do not allow ()'s here
list.Push(p.parseParameterType(ellipsisOk)); list.Push(p.parseParameterType(ellipsisOk));
@ -575,7 +574,7 @@ func (p *parser) parseParameterList(ellipsisOk bool) []*ast.Field {
if typ != nil { if typ != nil {
// IdentifierList Type // IdentifierList Type
idents := p.makeIdentList(list); idents := p.makeIdentList(list);
list.Init(0); list.Resize(0, 0);
list.Push(&ast.Field{nil, idents, typ, nil, nil}); list.Push(&ast.Field{nil, idents, typ, nil, nil});
for p.tok == token.COMMA { for p.tok == token.COMMA {
@ -693,7 +692,7 @@ func (p *parser) parseInterfaceType() *ast.InterfaceType {
pos := p.expect(token.INTERFACE); pos := p.expect(token.INTERFACE);
lbrace := p.expect(token.LBRACE); lbrace := p.expect(token.LBRACE);
list := vector.New(0); list := new(vector.Vector);
for p.tok == token.IDENT { for p.tok == token.IDENT {
m := p.parseMethodSpec(); m := p.parseMethodSpec();
if p.tok != token.RBRACE { if p.tok != token.RBRACE {
@ -805,7 +804,7 @@ func (p *parser) parseStmtList() []ast.Stmt {
defer un(trace(p, "StatementList")) defer un(trace(p, "StatementList"))
} }
list := vector.New(0); list := new(vector.Vector);
expectSemi := false; expectSemi := false;
for p.tok != token.CASE && p.tok != token.DEFAULT && p.tok != token.RBRACE && p.tok != token.EOF { for p.tok != token.CASE && p.tok != token.DEFAULT && p.tok != token.RBRACE && p.tok != token.EOF {
if expectSemi { if expectSemi {
@ -850,7 +849,7 @@ func (p *parser) parseStringList(x *ast.BasicLit) []*ast.BasicLit {
defer un(trace(p, "StringList")) defer un(trace(p, "StringList"))
} }
list := vector.New(0); list := new(vector.Vector);
if x != nil { if x != nil {
list.Push(x) list.Push(x)
} }
@ -1024,7 +1023,7 @@ func (p *parser) parseElementList() []ast.Expr {
defer un(trace(p, "ElementList")) defer un(trace(p, "ElementList"))
} }
list := vector.New(0); list := new(vector.Vector);
for p.tok != token.RBRACE && p.tok != token.EOF { for p.tok != token.RBRACE && p.tok != token.EOF {
list.Push(p.parseElement()); list.Push(p.parseElement());
if p.tok == token.COMMA { if p.tok == token.COMMA {
@ -1464,7 +1463,7 @@ func (p *parser) parseTypeList() []ast.Expr {
defer un(trace(p, "TypeList")) defer un(trace(p, "TypeList"))
} }
list := vector.New(0); list := new(vector.Vector);
list.Push(p.parseType()); list.Push(p.parseType());
for p.tok == token.COMMA { for p.tok == token.COMMA {
p.next(); p.next();
@ -1533,7 +1532,7 @@ func (p *parser) parseSwitchStmt() ast.Stmt {
if isExprSwitch(s2) { if isExprSwitch(s2) {
lbrace := p.expect(token.LBRACE); lbrace := p.expect(token.LBRACE);
cases := vector.New(0); cases := new(vector.Vector);
for p.tok == token.CASE || p.tok == token.DEFAULT { for p.tok == token.CASE || p.tok == token.DEFAULT {
cases.Push(p.parseCaseClause()) cases.Push(p.parseCaseClause())
} }
@ -1546,7 +1545,7 @@ func (p *parser) parseSwitchStmt() ast.Stmt {
// type switch // type switch
// TODO(gri): do all the checks! // TODO(gri): do all the checks!
lbrace := p.expect(token.LBRACE); lbrace := p.expect(token.LBRACE);
cases := vector.New(0); cases := new(vector.Vector);
for p.tok == token.CASE || p.tok == token.DEFAULT { for p.tok == token.CASE || p.tok == token.DEFAULT {
cases.Push(p.parseTypeCaseClause()) cases.Push(p.parseTypeCaseClause())
} }
@ -1608,7 +1607,7 @@ func (p *parser) parseSelectStmt() *ast.SelectStmt {
pos := p.expect(token.SELECT); pos := p.expect(token.SELECT);
lbrace := p.expect(token.LBRACE); lbrace := p.expect(token.LBRACE);
cases := vector.New(0); cases := new(vector.Vector);
for p.tok == token.CASE || p.tok == token.DEFAULT { for p.tok == token.CASE || p.tok == token.DEFAULT {
cases.Push(p.parseCommClause()) cases.Push(p.parseCommClause())
} }
@ -1818,7 +1817,7 @@ func (p *parser) parseGenDecl(keyword token.Token, f parseSpecFunction, getSemi
doc := p.leadComment; doc := p.leadComment;
pos := p.expect(keyword); pos := p.expect(keyword);
var lparen, rparen token.Position; var lparen, rparen token.Position;
list := vector.New(0); list := new(vector.Vector);
if p.tok == token.LPAREN { if p.tok == token.LPAREN {
lparen = p.pos; lparen = p.pos;
p.next(); p.next();
@ -1947,7 +1946,7 @@ func (p *parser) parseDeclList() []ast.Decl {
defer un(trace(p, "DeclList")) defer un(trace(p, "DeclList"))
} }
list := vector.New(0); list := new(vector.Vector);
for p.tok != token.EOF { for p.tok != token.EOF {
decl, _ := p.parseDecl(true); // consume optional semicolon decl, _ := p.parseDecl(true); // consume optional semicolon
list.Push(decl); list.Push(decl);
@ -1985,7 +1984,7 @@ func (p *parser) parseFile() *ast.File {
if p.ErrorCount() == 0 && p.mode&PackageClauseOnly == 0 { if p.ErrorCount() == 0 && p.mode&PackageClauseOnly == 0 {
// import decls // import decls
list := vector.New(0); list := new(vector.Vector);
for p.tok == token.IMPORT { for p.tok == token.IMPORT {
decl, _ := p.parseGenDecl(token.IMPORT, parseImportSpec, true); // consume optional semicolon decl, _ := p.parseGenDecl(token.IMPORT, parseImportSpec, true); // consume optional semicolon
list.Push(decl); list.Push(decl);

View File

@ -24,9 +24,9 @@ type ErrorHandler interface {
} }
// ErrorVector implements the ErrorHandler interface. It must be // ErrorVector implements the ErrorHandler interface. It maintains a list
// initialized with Init(). It maintains a list of errors which can // of errors which can be retrieved with GetErrorList and GetError. The
// be retrieved with GetErrorList and GetError. // zero value for an ErrorVector is an empty ErrorVector ready to use.
// //
// A common usage pattern is to embed an ErrorVector alongside a // A common usage pattern is to embed an ErrorVector alongside a
// scanner in a data structure that uses the scanner. By passing a // scanner in a data structure that uses the scanner. By passing a
@ -38,16 +38,8 @@ type ErrorVector struct {
} }
// Init initializes an ErrorVector. // Reset resets an ErrorVector to no errors.
func (h *ErrorVector) Init() { h.errors.Init(0) } func (h *ErrorVector) Reset() { h.errors.Resize(0, 0) }
// NewErrorVector creates a new ErrorVector.
func NewErrorVector() *ErrorVector {
h := new(ErrorVector);
h.Init();
return h;
}
// ErrorCount returns the number of errors collected. // ErrorCount returns the number of errors collected.

View File

@ -355,7 +355,7 @@ func TestStdErrorHander(t *testing.T) {
"@ @ @"; // original file, line 1 again "@ @ @"; // original file, line 1 again
v := NewErrorVector(); v := new(ErrorVector);
nerrors := Tokenize("File1", strings.Bytes(src), v, 0, nerrors := Tokenize("File1", strings.Bytes(src), v, 0,
func(pos token.Position, tok token.Token, litb []byte) bool { func(pos token.Position, tok token.Token, litb []byte) bool {
return tok != token.EOF return tok != token.EOF

View File

@ -593,7 +593,7 @@ func parseForm(m map[string][]string, query string) (err os.Error) {
vec, ok := data[key]; vec, ok := data[key];
if !ok { if !ok {
vec = vector.NewStringVector(0); vec = new(vector.StringVector);
data[key] = vec; data[key] = vec;
} }
vec.Push(value); vec.Push(value);

View File

@ -295,7 +295,7 @@ func (b *_JsonBuilder) Null() { b.Put(Null) }
func (b *_JsonBuilder) String(s string) { b.Put(&_String{s, _Null{}}) } func (b *_JsonBuilder) String(s string) { b.Put(&_String{s, _Null{}}) }
func (b *_JsonBuilder) Array() { b.Put(&_Array{vector.New(0), _Null{}}) } func (b *_JsonBuilder) Array() { b.Put(&_Array{new(vector.Vector), _Null{}}) }
func (b *_JsonBuilder) Map() { b.Put(&_Map{make(map[string]Json), _Null{}}) } func (b *_JsonBuilder) Map() { b.Put(&_Map{make(map[string]Json), _Null{}}) }

View File

@ -188,7 +188,7 @@ func (cclass *_CharClass) matches(c int) bool {
func newCharClass() *_CharClass { func newCharClass() *_CharClass {
c := new(_CharClass); c := new(_CharClass);
c.ranges = vector.NewIntVector(0); c.ranges = new(vector.IntVector);
return c; return c;
} }
@ -661,7 +661,7 @@ Loop:
func Compile(str string) (regexp *Regexp, error os.Error) { func Compile(str string) (regexp *Regexp, error os.Error) {
regexp = new(Regexp); regexp = new(Regexp);
regexp.expr = str; regexp.expr = str;
regexp.inst = vector.New(0); regexp.inst = new(vector.Vector);
error = regexp.doParse(); error = regexp.doParse();
return; return;
} }

View File

@ -93,7 +93,7 @@ type Writer struct {
} }
func (b *Writer) addLine() { b.lines.Push(vector.New(0)) } func (b *Writer) addLine() { b.lines.Push(new(vector.Vector)) }
func (b *Writer) line(i int) *vector.Vector { return b.lines.At(i).(*vector.Vector) } func (b *Writer) line(i int) *vector.Vector { return b.lines.At(i).(*vector.Vector) }
@ -105,8 +105,8 @@ func (b *Writer) reset() {
b.pos = 0; b.pos = 0;
b.cell = cell{}; b.cell = cell{};
b.endChar = 0; b.endChar = 0;
b.lines.Init(0); b.lines.Resize(0, 0);
b.widths.Init(0); b.widths.Resize(0, 0);
b.addLine(); b.addLine();
} }

View File

@ -176,7 +176,7 @@ func New(fmap FormatterMap) *Template {
t.fmap = fmap; t.fmap = fmap;
t.ldelim = lbrace; t.ldelim = lbrace;
t.rdelim = rbrace; t.rdelim = rbrace;
t.elems = vector.New(0); t.elems = new(vector.Vector);
return t; return t;
} }

View File

@ -308,7 +308,7 @@ func TestAll(t *testing.T) {
s.pdata = []*T{&t1, &t2}; s.pdata = []*T{&t1, &t2};
s.empty = []*T{}; s.empty = []*T{};
s.null = nil; s.null = nil;
s.vec = vector.New(0); s.vec = new(vector.Vector);
s.vec.Push("elt1"); s.vec.Push("elt1");
s.vec.Push("elt2"); s.vec.Push("elt2");
s.true = true; s.true = true;

View File

@ -10,7 +10,7 @@ import "container/vector"
type S struct { type S struct {
val int val int;
} }
@ -21,36 +21,36 @@ func (p *S) Init(val int) *S {
func test0() { func test0() {
v := vector.New(0); v := new(vector.Vector);
if v.Len() != 0 { if v.Len() != 0 {
panic("len = ", v.Len(), "\n"); panic("len = ", v.Len(), "\n")
} }
} }
func test1() { func test1() {
var a [1000] *S; var a [1000]*S;
for i := 0; i < len(a); i++ { for i := 0; i < len(a); i++ {
a[i] = new(S).Init(i); a[i] = new(S).Init(i)
} }
v := vector.New(0); v := new(vector.Vector);
for i := 0; i < len(a); i++ { for i := 0; i < len(a); i++ {
v.Insert(0, a[i]); v.Insert(0, a[i]);
if v.Len() != i + 1 { if v.Len() != i+1 {
panic("len = ", v.Len(), "\n"); panic("len = ", v.Len(), "\n")
} }
} }
for i := 0; i < v.Len(); i++ { for i := 0; i < v.Len(); i++ {
x := v.At(i).(*S); x := v.At(i).(*S);
if x.val != v.Len() - i - 1 { if x.val != v.Len()-i-1 {
panic("expected ", i, ", found ", x.val, "\n"); panic("expected ", i, ", found ", x.val, "\n")
} }
} }
for v.Len() > 10 { for v.Len() > 10 {
v.Delete(10); v.Delete(10)
} }
} }