public object Clone()
        {
            SimEntity copy = (SimEntity)MemberwiseClone();

            copy.Name        = Name;
            copy.EventBuffer = null;
            return(copy);
        }
 public static void AddEntityDynamically(SimEntity e)
 {
     if (e == null)
     {
         throw new ArgumentException("Adding null entity.");
     }
     else
     {
         WriteMessage($"Adding: {e.Name}");
     }
     e.StartEntity();
 }
        public static void AddEntity(SimEntity e)
        {
            SimEvent evt;

            if (_running)
            {
                evt = new SimEvent(SimEvent.CREATE, _clock, src: 1, dest: 0, tag: 0, edata: e);
                _futureQueue.AddEvent(evt);
            }
            if (e.Id == -1)
            {
                int id = _entities.Count;
                e.Id = id;
                _entities.Add(e);
                _entitiesByName.Add(e.Name, e);
            }
        }
        private static void ProcessEvent(SimEvent e)
        {
            int       dest, src;
            SimEntity destEnt;

            if (e.EventTime < _clock)
            {
                throw new ArgumentException("Past event detected.");
            }

            _clock = e.EventTime;

            switch (e.InternalType)
            {
            case SimEvent.ENULL:
                throw new ArgumentException("Event has a null type.");

            case SimEvent.CREATE:
                SimEntity newEntity = (SimEntity)e.Data;
                AddEntityDynamically(newEntity);
                break;

            case SimEvent.SEND:
                dest = e.Destination;
                if (dest < 0)
                {
                    throw new ArgumentException("Attempt to send to null entity detected.");
                }
                else
                {
                    int tag = e.Tag;
                    destEnt = _entities.Find(ent => ent.Id == dest);
                    if (destEnt.State == SimEntity.WAITING)
                    {
                        Predicate p;
                        if (_waitPredicates.TryGetValue(dest, out p))
                        {
                            if (p == null || tag == 9999 || p.Match(e))
                            {
                                destEnt.EventBuffer = (SimEvent)e.Clone();
                                destEnt.State       = SimEntity.RUNNABLE;
                                _waitPredicates.Remove(dest);
                            }
                            else
                            {
                                _deferedQueue.AddEvent(e);
                            }
                        }
                    }
                    else
                    {
                        _deferedQueue.AddEvent(e);
                    }
                }
                break;

            case SimEvent.HOLD_DONE:
                src = e.Source;
                if (src < 0)
                {
                    throw new ArgumentException("Null entity holding.");
                }
                else
                {
                    _entities.Find(ent => ent.Id == src).State = SimEntity.RUNNABLE;
                }
                break;
            }
        }