// run-pass
#![allow(dead_code)]
#![allow(non_camel_case_types)]

use std::cmp;

#[derive(Copy, Clone, Debug)]
enum cat_type { tuxedo, tabby, tortoiseshell }

impl cmp::PartialEq for cat_type {
    fn eq(&self, other: &cat_type) -> bool {
        ((*self) as usize) == ((*other) as usize)
    }
    fn ne(&self, other: &cat_type) -> bool { !(*self).eq(other) }
}

// Very silly -- this just returns the value of the name field
// for any isize value that's less than the meows field

// ok: T should be in scope when resolving the trait ref for map
struct cat<T> {
    // Yes, you can have negative meows
    meows : isize,

    how_hungry : isize,
    name : T,
}

impl<T> cat<T> {
    pub fn speak(&mut self) { self.meow(); }

    pub fn eat(&mut self) -> bool {
        if self.how_hungry > 0 {
            println!("OM NOM NOM");
            self.how_hungry -= 2;
            return true;
        } else {
            println!("Not hungry!");
            return false;
        }
    }
    fn len(&self) -> usize { self.meows as usize }
    fn is_empty(&self) -> bool { self.meows == 0 }
    fn clear(&mut self) {}
    fn contains_key(&self, k: &isize) -> bool { *k <= self.meows }

    fn find(&self, k: &isize) -> Option<&T> {
        if *k <= self.meows {
            Some(&self.name)
        } else {
            None
        }
    }
    fn insert(&mut self, k: isize, _: T) -> bool {
        self.meows += k;
        true
    }

    fn find_mut(&mut self, _k: &isize) -> Option<&mut T> { panic!() }

    fn remove(&mut self, k: &isize) -> bool {
        if self.find(k).is_some() {
            self.meows -= *k; true
        } else {
            false
        }
    }

    fn pop(&mut self, _k: &isize) -> Option<T> { panic!() }

    fn swap(&mut self, _k: isize, _v: T) -> Option<T> { panic!() }
}

impl<T> cat<T> {
    pub fn get(&self, k: &isize) -> &T {
        match self.find(k) {
          Some(v) => { v }
          None    => { panic!("epic fail"); }
        }
    }

    pub fn new(in_x: isize, in_y: isize, in_name: T) -> cat<T> {
        cat{meows: in_x, how_hungry: in_y, name: in_name }
    }
}

impl<T> cat<T> {
    fn meow(&mut self) {
        self.meows += 1;
        println!("Meow {}", self.meows);
        if self.meows % 5 == 0 {
            self.how_hungry += 1;
        }
    }
}

pub fn main() {
    let mut nyan: cat<String> = cat::new(0, 2, "nyan".to_string());
    for _ in 1_usize..5 { nyan.speak(); }
    assert_eq!(*nyan.find(&1).unwrap(), "nyan".to_string());
    assert_eq!(nyan.find(&10), None);
    let mut spotty: cat<cat_type> = cat::new(2, 57, cat_type::tuxedo);
    for _ in 0_usize..6 { spotty.speak(); }
    assert_eq!(spotty.len(), 8);
    assert!((spotty.contains_key(&2)));
    assert_eq!(spotty.get(&3), &cat_type::tuxedo);
}
