Changeset 16779 for trunk/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.1.1/SimSharp-3.1.1/Core/Resources/Store.cs
- Timestamp:
- 04/12/19 13:45:11 (5 years ago)
- Location:
- trunk/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.1.1
- Files:
-
- 1 edited
- 1 copied
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.1.1/SimSharp-3.1.1/Core/Resources/Store.cs
r15972 r16779 1 1 #region License Information 2 2 /* SimSharp - A .NET port of SimPy, discrete event simulation framework 3 Copyright (C) 201 6Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 Copyright (C) 2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 5 5 This program is free software: you can redistribute it and/or modify … … 19 19 using System; 20 20 using System.Collections.Generic; 21 using System.Linq;22 21 23 22 namespace SimSharp { 23 /// <summary> 24 /// The store holds a variable number of individual items. 25 /// The items are removed from the store in FIFO order. 26 /// 27 /// Put are processed in FIFO order. 28 /// Get are processed in FIFO order. 29 /// </summary> 24 30 public class Store { 31 32 public int Capacity { get; protected set; } 33 25 34 public int Count { get { return Items.Count; } } 26 public int Capacity { get; protected set; } 27 protected EnvironmentEnvironment { get; private set; }35 36 protected Simulation Environment { get; private set; } 28 37 29 38 protected Queue<StorePut> PutQueue { get; private set; } 30 39 protected Queue<StoreGet> GetQueue { get; private set; } 31 protected List<object> Items { get; private set; } 32 33 public Store(Environment environment, int capacity = int.MaxValue) { 40 protected Queue<object> Items { get; private set; } 41 protected List<Event> WhenNewQueue { get; private set; } 42 protected List<Event> WhenAnyQueue { get; private set; } 43 protected List<Event> WhenFullQueue { get; private set; } 44 protected List<Event> WhenEmptyQueue { get; private set; } 45 protected List<Event> WhenChangeQueue { get; private set; } 46 47 public Store(Simulation environment, int capacity = int.MaxValue) { 34 48 if (capacity <= 0) throw new ArgumentException("Capacity must be > 0", "capacity"); 35 49 Environment = environment; … … 37 51 PutQueue = new Queue<StorePut>(); 38 52 GetQueue = new Queue<StoreGet>(); 39 Items = new List<object>(); 53 Items = new Queue<object>(); 54 WhenNewQueue = new List<Event>(); 55 WhenAnyQueue = new List<Event>(); 56 WhenFullQueue = new List<Event>(); 57 WhenEmptyQueue = new List<Event>(); 58 WhenChangeQueue = new List<Event>(); 59 } 60 public Store(Simulation environment, IEnumerable<object> items, int capacity = int.MaxValue) { 61 if (capacity <= 0) throw new ArgumentException("Capacity must be > 0", "capacity"); 62 Environment = environment; 63 Capacity = capacity; 64 PutQueue = new Queue<StorePut>(); 65 GetQueue = new Queue<StoreGet>(); 66 Items = new Queue<object>(items); 67 WhenNewQueue = new List<Event>(); 68 WhenAnyQueue = new List<Event>(); 69 WhenFullQueue = new List<Event>(); 70 WhenEmptyQueue = new List<Event>(); 71 WhenChangeQueue = new List<Event>(); 72 if (capacity < Items.Count) throw new ArgumentException("There are more initial items than there is capacity.", "items"); 40 73 } 41 74 … … 54 87 } 55 88 89 public virtual Event WhenNew() { 90 var whenNew = new Event(Environment); 91 WhenNewQueue.Add(whenNew); 92 return whenNew; 93 } 94 95 public virtual Event WhenAny() { 96 var whenAny = new Event(Environment); 97 WhenAnyQueue.Add(whenAny); 98 TriggerWhenAny(); 99 return whenAny; 100 } 101 102 public virtual Event WhenFull() { 103 var whenFull = new Event(Environment); 104 WhenFullQueue.Add(whenFull); 105 TriggerWhenFull(); 106 return whenFull; 107 } 108 109 public virtual Event WhenEmpty() { 110 var whenEmpty = new Event(Environment); 111 WhenEmptyQueue.Add(whenEmpty); 112 TriggerWhenEmpty(); 113 return whenEmpty; 114 } 115 116 public virtual Event WhenChange() { 117 var whenChange = new Event(Environment); 118 WhenChangeQueue.Add(whenChange); 119 return whenChange; 120 } 121 56 122 protected virtual void DoPut(StorePut put) { 57 123 if (Items.Count < Capacity) { 58 Items. Add(put.Value);124 Items.Enqueue(put.Value); 59 125 put.Succeed(); 60 126 } … … 63 129 protected virtual void DoGet(StoreGet get) { 64 130 if (Items.Count > 0) { 65 var item = Items.First(); 66 Items.RemoveAt(0); 131 var item = Items.Dequeue(); 67 132 get.Succeed(item); 68 133 } … … 75 140 if (put.IsTriggered) { 76 141 PutQueue.Dequeue(); 142 TriggerWhenNew(); 143 TriggerWhenAny(); 144 TriggerWhenFull(); 145 TriggerWhenChange(); 77 146 } else break; 78 147 } … … 85 154 if (get.IsTriggered) { 86 155 GetQueue.Dequeue(); 156 TriggerWhenEmpty(); 157 TriggerWhenChange(); 87 158 } else break; 88 159 } 160 } 161 162 protected virtual void TriggerWhenNew() { 163 if (WhenNewQueue.Count == 0) return; 164 foreach (var evt in WhenNewQueue) 165 evt.Succeed(); 166 WhenNewQueue.Clear(); 167 } 168 169 protected virtual void TriggerWhenAny() { 170 if (Count > 0) { 171 if (WhenAnyQueue.Count == 0) return; 172 foreach (var evt in WhenAnyQueue) 173 evt.Succeed(); 174 WhenAnyQueue.Clear(); 175 } 176 } 177 178 protected virtual void TriggerWhenFull() { 179 if (Count == Capacity) { 180 if (WhenFullQueue.Count == 0) return; 181 foreach (var evt in WhenFullQueue) 182 evt.Succeed(); 183 WhenFullQueue.Clear(); 184 } 185 } 186 187 protected virtual void TriggerWhenEmpty() { 188 if (Count == 0) { 189 if (WhenEmptyQueue.Count == 0) return; 190 foreach (var evt in WhenEmptyQueue) 191 evt.Succeed(); 192 WhenEmptyQueue.Clear(); 193 } 194 } 195 196 protected virtual void TriggerWhenChange() { 197 if (WhenChangeQueue.Count == 0) return; 198 foreach (var evt in WhenChangeQueue) 199 evt.Succeed(); 200 WhenChangeQueue.Clear(); 89 201 } 90 202 }
Note: See TracChangeset
for help on using the changeset viewer.