Russ Cox | d2cc988 | 2012-02-16 23:50:37 -0500 | [diff] [blame] | 1 | // run |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -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 | |
Rob Pike | eb37b5b | 2012-02-24 16:24:24 +1100 | [diff] [blame] | 7 | // Test general operation using a list implementation. |
| 8 | |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 9 | package main |
| 10 | |
Robert Griesemer | 581530e | 2009-12-10 12:53:23 -0800 | [diff] [blame] | 11 | type Item interface { |
Ian Lance Taylor | f203093 | 2012-01-18 14:31:31 -0800 | [diff] [blame] | 12 | Print() string |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 13 | } |
| 14 | |
Robert Griesemer | 581530e | 2009-12-10 12:53:23 -0800 | [diff] [blame] | 15 | type ListItem struct { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 16 | item Item |
| 17 | next *ListItem |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 18 | } |
| 19 | |
Robert Griesemer | 581530e | 2009-12-10 12:53:23 -0800 | [diff] [blame] | 20 | type List struct { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 21 | head *ListItem |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 22 | } |
| 23 | |
Robert Griesemer | 581530e | 2009-12-10 12:53:23 -0800 | [diff] [blame] | 24 | func (list *List) Init() { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 25 | list.head = nil |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 26 | } |
| 27 | |
Robert Griesemer | 581530e | 2009-12-10 12:53:23 -0800 | [diff] [blame] | 28 | func (list *List) Insert(i Item) { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 29 | item := new(ListItem) |
| 30 | item.item = i |
| 31 | item.next = list.head |
| 32 | list.head = item |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 33 | } |
| 34 | |
Ian Lance Taylor | f203093 | 2012-01-18 14:31:31 -0800 | [diff] [blame] | 35 | func (list *List) Print() string { |
| 36 | r := "" |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 37 | i := list.head |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 38 | for i != nil { |
Ian Lance Taylor | f203093 | 2012-01-18 14:31:31 -0800 | [diff] [blame] | 39 | r += i.item.Print() |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 40 | i = i.next |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 41 | } |
Ian Lance Taylor | f203093 | 2012-01-18 14:31:31 -0800 | [diff] [blame] | 42 | return r |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 43 | } |
| 44 | |
| 45 | // Something to put in a list |
Robert Griesemer | 581530e | 2009-12-10 12:53:23 -0800 | [diff] [blame] | 46 | type Integer struct { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 47 | val int |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 48 | } |
| 49 | |
Robert Griesemer | 581530e | 2009-12-10 12:53:23 -0800 | [diff] [blame] | 50 | func (this *Integer) Init(i int) *Integer { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 51 | this.val = i |
| 52 | return this |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 53 | } |
| 54 | |
Ian Lance Taylor | f203093 | 2012-01-18 14:31:31 -0800 | [diff] [blame] | 55 | func (this *Integer) Print() string { |
| 56 | return string(this.val + '0') |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 57 | } |
| 58 | |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 59 | func main() { |
| 60 | list := new(List) |
| 61 | list.Init() |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 62 | for i := 0; i < 10; i = i + 1 { |
Ian Lance Taylor | 6b34628 | 2012-01-18 13:20:55 -0800 | [diff] [blame] | 63 | integer := new(Integer) |
| 64 | integer.Init(i) |
| 65 | list.Insert(integer) |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 66 | } |
| 67 | |
Ian Lance Taylor | f203093 | 2012-01-18 14:31:31 -0800 | [diff] [blame] | 68 | r := list.Print() |
| 69 | if r != "9876543210" { |
| 70 | panic(r) |
| 71 | } |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 72 | } |