]> git.lizzy.rs Git - rust.git/blob - src/test/run-pass/overloaded-index-assoc-list.rs
debuginfo: Make debuginfo source location assignment more stable (Pt. 1)
[rust.git] / src / test / run-pass / overloaded-index-assoc-list.rs
1 // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 // Test overloading of the `[]` operator.  In particular test that it
12 // takes its argument *by reference*.
13
14 use std::ops::Index;
15
16 struct AssociationList<K,V> {
17     pairs: Vec<AssociationPair<K,V>> }
18
19 #[derive(Clone)]
20 struct AssociationPair<K,V> {
21     key: K,
22     value: V
23 }
24
25 impl<K,V> AssociationList<K,V> {
26     fn push(&mut self, key: K, value: V) {
27         self.pairs.push(AssociationPair {key: key, value: value});
28     }
29 }
30
31 impl<K: PartialEq + std::fmt::Show, V:Clone> Index<K> for AssociationList<K,V> {
32     type Output = V;
33
34     fn index<'a>(&'a self, index: &K) -> &'a V {
35         for pair in self.pairs.iter() {
36             if pair.key == *index {
37                 return &pair.value
38             }
39         }
40         panic!("No value found for key: {:?}", index);
41     }
42 }
43
44 pub fn main() {
45     let foo = "foo".to_string();
46     let bar = "bar".to_string();
47
48     let mut list = AssociationList {pairs: Vec::new()};
49     list.push(foo.clone(), 22i);
50     list.push(bar.clone(), 44i);
51
52     assert!(list[foo] == 22);
53     assert!(list[bar] == 44);
54
55     assert!(list[foo] == 22);
56     assert!(list[bar] == 44);
57 }