Russ Cox | 0b477ef | 2012-02-16 23:48:57 -0500 | [diff] [blame] | 1 | // run |
Rob Pike | 094ee44 | 2008-06-06 16:56:18 -0700 | [diff] [blame] | 2 | |
| 3 | // Copyright 2009 The Go Authors. All rights reserved. |
| 4 | // Use of this source code is governed by a BSD-style |
| 5 | // license that can be found in the LICENSE file. |
| 6 | |
| 7 | package main |
| 8 | |
Ian Lance Taylor | f203093 | 2012-01-18 14:31:31 -0800 | [diff] [blame] | 9 | import "fmt" |
| 10 | |
Russ Cox | 839a684 | 2009-01-20 14:40:40 -0800 | [diff] [blame] | 11 | type Element interface { |
Rob Pike | 094ee44 | 2008-06-06 16:56:18 -0700 | [diff] [blame] | 12 | } |
| 13 | |
Russ Cox | 839a684 | 2009-01-20 14:40:40 -0800 | [diff] [blame] | 14 | type Vector struct { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 15 | nelem int |
| 16 | elem []Element |
Rob Pike | 094ee44 | 2008-06-06 16:56:18 -0700 | [diff] [blame] | 17 | } |
| 18 | |
Russ Cox | 839a684 | 2009-01-20 14:40:40 -0800 | [diff] [blame] | 19 | func New() *Vector { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 20 | v := new(Vector) |
| 21 | v.nelem = 0 |
| 22 | v.elem = make([]Element, 10) |
| 23 | return v |
Rob Pike | 094ee44 | 2008-06-06 16:56:18 -0700 | [diff] [blame] | 24 | } |
| 25 | |
| 26 | func (v *Vector) At(i int) Element { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 27 | return v.elem[i] |
Rob Pike | 094ee44 | 2008-06-06 16:56:18 -0700 | [diff] [blame] | 28 | } |
| 29 | |
| 30 | func (v *Vector) Insert(e Element) { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 31 | v.elem[v.nelem] = e |
| 32 | v.nelem++ |
Rob Pike | 094ee44 | 2008-06-06 16:56:18 -0700 | [diff] [blame] | 33 | } |
| 34 | |
Rob Pike | 094ee44 | 2008-06-06 16:56:18 -0700 | [diff] [blame] | 35 | func main() { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 36 | type I struct{ val int } |
| 37 | i0 := new(I) |
| 38 | i0.val = 0 |
| 39 | i1 := new(I) |
| 40 | i1.val = 11 |
| 41 | i2 := new(I) |
| 42 | i2.val = 222 |
| 43 | i3 := new(I) |
| 44 | i3.val = 3333 |
| 45 | i4 := new(I) |
| 46 | i4.val = 44444 |
| 47 | v := New() |
Ian Lance Taylor | f203093 | 2012-01-18 14:31:31 -0800 | [diff] [blame] | 48 | r := "hi\n" |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 49 | v.Insert(i4) |
| 50 | v.Insert(i3) |
| 51 | v.Insert(i2) |
| 52 | v.Insert(i1) |
| 53 | v.Insert(i0) |
Rob Pike | 094ee44 | 2008-06-06 16:56:18 -0700 | [diff] [blame] | 54 | for i := 0; i < v.nelem; i++ { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 55 | var x *I |
| 56 | x = v.At(i).(*I) |
Ian Lance Taylor | f203093 | 2012-01-18 14:31:31 -0800 | [diff] [blame] | 57 | r += fmt.Sprintln(i, x.val) // prints correct list |
Rob Pike | 094ee44 | 2008-06-06 16:56:18 -0700 | [diff] [blame] | 58 | } |
| 59 | for i := 0; i < v.nelem; i++ { |
Ian Lance Taylor | f203093 | 2012-01-18 14:31:31 -0800 | [diff] [blame] | 60 | r += fmt.Sprintln(i, v.At(i).(*I).val) |
| 61 | } |
| 62 | expect := `hi |
| 63 | 0 44444 |
| 64 | 1 3333 |
| 65 | 2 222 |
| 66 | 3 11 |
| 67 | 4 0 |
| 68 | 0 44444 |
| 69 | 1 3333 |
| 70 | 2 222 |
| 71 | 3 11 |
| 72 | 4 0 |
| 73 | ` |
| 74 | if r != expect { |
| 75 | panic(r) |
Rob Pike | 094ee44 | 2008-06-06 16:56:18 -0700 | [diff] [blame] | 76 | } |
| 77 | } |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 78 | |
Rob Pike | 094ee44 | 2008-06-06 16:56:18 -0700 | [diff] [blame] | 79 | /* |
| 80 | bug027.go:50: illegal types for operand |
| 81 | (<Element>I{}) CONV (<I>{}) |
| 82 | bug027.go:50: illegal types for operand |
| 83 | (<Element>I{}) CONV (<I>{}) |
| 84 | */ |