Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/12/19 13:45:11 (5 years ago)
Author:
abeham
Message:

#2975: Updated Sim# to 3.1.1

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  
    11#region License Information
    22/* SimSharp - A .NET port of SimPy, discrete event simulation framework
    3 Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     3Copyright (C) 2019  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
    44
    55This program is free software: you can redistribute it and/or modify
     
    1919using System;
    2020using System.Collections.Generic;
    21 using System.Linq;
    2221
    2322namespace 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>
    2430  public class Store {
     31
     32    public int Capacity { get; protected set; }
     33
    2534    public int Count { get { return Items.Count; } }
    26     public int Capacity { get; protected set; }
    27     protected Environment Environment { get; private set; }
     35
     36    protected Simulation Environment { get; private set; }
    2837
    2938    protected Queue<StorePut> PutQueue { get; private set; }
    3039    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) {
    3448      if (capacity <= 0) throw new ArgumentException("Capacity must be > 0", "capacity");
    3549      Environment = environment;
     
    3751      PutQueue = new Queue<StorePut>();
    3852      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");
    4073    }
    4174
     
    5487    }
    5588
     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
    56122    protected virtual void DoPut(StorePut put) {
    57123      if (Items.Count < Capacity) {
    58         Items.Add(put.Value);
     124        Items.Enqueue(put.Value);
    59125        put.Succeed();
    60126      }
     
    63129    protected virtual void DoGet(StoreGet get) {
    64130      if (Items.Count > 0) {
    65         var item = Items.First();
    66         Items.RemoveAt(0);
     131        var item = Items.Dequeue();
    67132        get.Succeed(item);
    68133      }
     
    75140        if (put.IsTriggered) {
    76141          PutQueue.Dequeue();
     142          TriggerWhenNew();
     143          TriggerWhenAny();
     144          TriggerWhenFull();
     145          TriggerWhenChange();
    77146        } else break;
    78147      }
     
    85154        if (get.IsTriggered) {
    86155          GetQueue.Dequeue();
     156          TriggerWhenEmpty();
     157          TriggerWhenChange();
    87158        } else break;
    88159      }
     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();
    89201    }
    90202  }
Note: See TracChangeset for help on using the changeset viewer.