1 module common;
2 
3 import std.conv;
4 import std.format;
5 import hunt.util.Common;
6 import hunt.util.Comparator;
7 
8 
9 class Price {
10 
11     private string item;
12     private int price;
13 
14     this(string itm, int pr) {
15         this.item = itm;
16         this.price = pr;
17     }
18 
19     string getItem() {
20         return item;
21     }
22 
23     void setItem(string item) {
24         this.item = item;
25     }
26 
27     int getPrice() nothrow {
28         return price;
29     }
30 
31     void setPrice(int price) {
32         this.price = price;
33     }
34 
35     override size_t toHash() @trusted nothrow {
36         size_t hashcode = 0;
37         hashcode = price * 20;
38         hashcode += hashOf(item);
39         return hashcode;
40     }
41 
42     override bool opEquals(Object obj) {
43         Price pp = cast(Price) obj;
44         if (pp is null)
45             return false;
46         return (pp.item == this.item && pp.price == this.price);
47     }
48 
49     override string toString() {
50         return "item: " ~ item ~ "  price: " ~ price.to!string();
51     }
52 }
53 
54 
55 class Person : Comparable!Person {
56 
57     string name;
58     int age;
59 
60     this(string n, int a) {
61         name = n;
62         age = a;
63     }
64 
65     override string toString() {
66         return format("Name is %s, Age is %d", name, age);
67     }
68 
69     int opCmp(Person o) {
70         int nameComp = compare(this.name, o.name);
71         return (nameComp != 0 ? nameComp : compare(this.age, o.age));
72     }
73 
74     alias opCmp = Object.opCmp;
75 
76 }
77 
78 class ComparatorByPrice : Comparator!Price{
79 
80      int compare(Price v1, Price v2) nothrow {
81         return .compare(v1.getPrice, v2.getPrice);
82     }
83 
84 }