OSDN Git Service

無条件先制対潜可能艦にFletcherとJanus改を加える
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Model / Inventry.cs
1 // Copyright (C) 2018 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 //\r
3 // Licensed under the Apache License, Version 2.0 (the "License");\r
4 // you may not use this file except in compliance with the License.\r
5 // You may obtain a copy of the License at\r
6 //\r
7 //    http://www.apache.org/licenses/LICENSE-2.0\r
8 //\r
9 // Unless required by applicable law or agreed to in writing, software\r
10 // distributed under the License is distributed on an "AS IS" BASIS,\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 // See the License for the specific language governing permissions and\r
13 // limitations under the License.\r
14 \r
15 using System;\r
16 using System.Collections.Generic;\r
17 using System.Linq;\r
18 \r
19 namespace KancolleSniffer.Model\r
20 {\r
21     public class ShipInventory : Inventory<ShipStatus>\r
22     {\r
23         public ShipInventory() : base(new ShipStatus())\r
24         {\r
25         }\r
26 \r
27         protected override ShipStatus CreateDummy(int id) => new ShipStatus();\r
28 \r
29         protected override int GetId(ShipStatus ship) => ship.Id;\r
30 \r
31         public IEnumerable<ShipStatus> AllShips => AllItems;\r
32     }\r
33 \r
34     public class ItemInventory : Inventory<ItemStatus>\r
35     {\r
36         public ItemInventory() : base(new ItemStatus())\r
37         {\r
38         }\r
39 \r
40         protected override ItemStatus CreateDummy(int id) => new ItemStatus(id);\r
41 \r
42         protected override int GetId(ItemStatus item) => item.Id;\r
43     }\r
44 \r
45     public abstract class Inventory<T>\r
46     {\r
47         private readonly Dictionary<int, T> _dict = new Dictionary<int, T>();\r
48         private int _inflated;\r
49 \r
50         protected abstract T CreateDummy(int id);\r
51 \r
52         protected Inventory(T dummy)\r
53         {\r
54             _dict[-1] = dummy;\r
55         }\r
56 \r
57         public void Clear()\r
58         {\r
59             _dict.Clear();\r
60             _dict[-1] = CreateDummy(-1);\r
61             _inflated = 0;\r
62         }\r
63 \r
64         public virtual T this[int id]\r
65         {\r
66             get => _dict.TryGetValue(id, out var item) ? item : CreateDummy(id);\r
67             set => _dict[id] = value;\r
68         }\r
69 \r
70         protected abstract int GetId(T item);\r
71 \r
72         public void Add(T item)\r
73         {\r
74             _dict[GetId(item)] = item;\r
75         }\r
76 \r
77         public void Add(IEnumerable<T> items)\r
78         {\r
79             foreach (var item in items)\r
80                 Add(item);\r
81         }\r
82 \r
83         public void Remove(int id)\r
84         {\r
85             if (id != -1)\r
86                 _dict.Remove(id);\r
87         }\r
88 \r
89         public void Remove(IEnumerable<int> ids)\r
90         {\r
91             foreach (var id in ids)\r
92                 Remove(id);\r
93         }\r
94 \r
95         public void Remove(T item)\r
96         {\r
97             Remove(GetId(item));\r
98         }\r
99 \r
100         public void Remove(IEnumerable<T> items)\r
101         {\r
102             foreach (var item in items)\r
103                 Remove(item);\r
104         }\r
105 \r
106         public bool Contains(int id) => _dict.ContainsKey(id);\r
107 \r
108         // ReSharper disable once UnusedMember.Global\r
109         public bool Contains(T item) => Contains(GetId(item));\r
110 \r
111         public IEnumerable<T> AllItems =>\r
112             from kv in _dict where kv.Key != -1 select kv.Value;\r
113 \r
114         public void InflateCount(int count) => _inflated += count;\r
115 \r
116         public int Count => _dict.Count + _inflated - 1;\r
117 \r
118         public int MaxId => Math.Max(_dict.Keys.Max(), 0);\r
119     }\r
120 }