Free cookie consent management tool by TermsFeed Policy Generator

source: branches/SimulationCore/HeuristicLab.SimulationCore/3.3/DiscreteEvent/CompositeEventQueue.cs @ 10450

Last change on this file since 10450 was 10450, checked in by abeham, 10 years ago

#1610: Added a base infrastructure for discrete event simulation

File size: 1.8 KB
Line 
1using System.Collections.Generic;
2using System.Linq;
3using HeuristicLab.Common;
4using HeuristicLab.Core;
5using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
6
7namespace HeuristicLab.SimulationCore {
8  [StorableClass]
9  public sealed class CompositeEventQueue<TModel> : Item where TModel : IModel {
10    [Storable]
11    private List<IEventQueue<TModel>> queues;
12
13    public bool Empty {
14      get { return queues.All(x => x.Empty); }
15    }
16
17    public int Count {
18      get { return queues.Sum(x => x.Count); }
19    }
20
21    public IEvent<TModel> Peek() {
22      IEvent<TModel> nextEvent = null;
23      foreach (var queue in queues) {
24        if (!queue.Empty && (nextEvent == null || queue.Peek().Time < nextEvent.Time)) {
25          nextEvent = queue.Peek();
26        }
27      }
28      return nextEvent;
29    }
30
31    public IEvent<TModel> Pop() {
32      IEvent<TModel> nextEvent = null;
33      IEventQueue<TModel> minEventQueue = null;
34      foreach (var queue in queues) {
35        if (!queue.Empty && (nextEvent == null || queue.Peek().Time < nextEvent.Time)) {
36          nextEvent = queue.Peek();
37          minEventQueue = queue;
38        }
39      }
40      return minEventQueue.Pop();
41    }
42
43    [StorableConstructor]
44    private CompositeEventQueue(bool deserializing) : base(deserializing) { }
45    private CompositeEventQueue(CompositeEventQueue<TModel> original, Cloner cloner)
46      : base(original, cloner) {
47      this.queues = original.queues.Select(cloner.Clone).ToList();
48    }
49    public CompositeEventQueue(IEnumerable<IEventQueue<TModel>> queues) {
50      this.queues = new List<IEventQueue<TModel>>(queues);
51    }
52
53    public override IDeepCloneable Clone(Cloner cloner) {
54      return new CompositeEventQueue<TModel>(this, cloner);
55    }
56  }
57}
Note: See TracBrowser for help on using the repository browser.