4
// Copyright (C) 2008 Lukas Lipka <lukaslipka@gmail.com>
8
using System.Collections;
9
using System.Collections.Generic;
11
using Beagle.Search.Tiles;
13
namespace Beagle.Search {
15
public class SortedTileList : IEnumerable<Tile> {
17
private List<Tile> tiles = null;
19
private SortType sort_type;
20
private TileComparer comparer = null;
22
public SortedTileList (SortType sort)
24
this.tiles = new List<Tile> ();
28
public SortedTileList (SortType sort, Tile[] tiles_array)
30
this.tiles = new List<Tile> (tiles_array);
34
public int Add (Tile tile)
36
int index = tiles.BinarySearch (tile, comparer);
39
throw new ArgumentException ("duplicate");
41
tiles.Insert (~index, tile);
51
public bool Contains (Tile tile)
53
return tiles.Contains (tile);
56
public int IndexOf (Tile tile)
58
return tiles.IndexOf (tile);
61
public void Remove (Tile tile)
63
int index = tiles.BinarySearch (tile, comparer);
66
tiles.RemoveAt (index);
69
public void RemoveAt (int index)
71
tiles.RemoveAt (index);
74
public Tile this [int index] {
75
get { return tiles[index]; }
79
get { return tiles.Count; }
82
public IEnumerator<Tile> GetEnumerator ()
84
return tiles.GetEnumerator ();
88
IEnumerator IEnumerable.GetEnumerator() {
89
return GetEnumerator();
92
public object Clone ()
94
return new SortedTileList (sort_type, tiles.ToArray ());
97
public IList<Tile> GetRange (int index, int count)
99
return tiles.GetRange (index, count);
102
public SortType SortType {
103
get { return sort_type; }
108
case SortType.Relevance:
110
comparer = new RelevanceComparer ();
113
comparer = new NameComparer ();
115
case SortType.Modified:
116
comparer = new DateComparer ();
120
tiles.Sort (comparer);
124
private abstract class TileComparer : IComparer<Tile> {
126
public int Compare (Tile x, Tile y)
128
int ret = TileCompare (x, y);
131
ret = -x.Timestamp.CompareTo (y.Timestamp);
134
ret = x.GetHashCode ().CompareTo (y.GetHashCode ());
139
public abstract int TileCompare (Tile x, Tile y);
142
private class RelevanceComparer : TileComparer {
144
public override int TileCompare (Tile x, Tile y)
146
return -x.Score.CompareTo (y.Score);
150
private class NameComparer : TileComparer {
152
public override int TileCompare (Tile x, Tile y)
154
return String.Compare (x.Title, y.Title, true);
158
private class DateComparer : TileComparer {
160
public override int TileCompare (Tile x, Tile y)
162
return -x.Timestamp.CompareTo (y.Timestamp);