| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef QUICHE_QUIC_TEST_TOOLS_SIMULATOR_ACTOR_H_ | 
 | #define QUICHE_QUIC_TEST_TOOLS_SIMULATOR_ACTOR_H_ | 
 |  | 
 | #include <string> | 
 |  | 
 | #include "quic/core/quic_clock.h" | 
 | #include "quic/core/quic_time.h" | 
 |  | 
 | namespace quic { | 
 | namespace simulator { | 
 |  | 
 | class Simulator; | 
 |  | 
 | // Actor is the base class for all participants of the simulation which can | 
 | // schedule events to be triggered at the specified time.  Every actor has a | 
 | // name assigned to it, which can be used for debugging and addressing purposes. | 
 | // | 
 | // The Actor object is scheduled as follows: | 
 | // 1. Every Actor object appears at most once in the event queue, for one | 
 | //    specific time. | 
 | // 2. Actor is scheduled by calling Schedule() method. | 
 | // 3. If Schedule() method is called with multiple different times specified, | 
 | //    Act() method will be called at the earliest time specified. | 
 | // 4. Before Act() is called, the Actor is removed from the event queue.  Act() | 
 | //    will not be called again unless Schedule() is called. | 
 | class Actor { | 
 |  public: | 
 |   Actor(Simulator* simulator, std::string name); | 
 |   virtual ~Actor(); | 
 |  | 
 |   // Trigger all the events the actor can potentially handle at this point. | 
 |   // Before Act() is called, the actor is removed from the event queue, and has | 
 |   // to schedule the next call manually. | 
 |   virtual void Act() = 0; | 
 |  | 
 |   inline std::string name() const { return name_; } | 
 |   inline Simulator* simulator() const { return simulator_; } | 
 |  | 
 |  protected: | 
 |   // Calls Schedule() on the associated simulator. | 
 |   void Schedule(QuicTime next_tick); | 
 |  | 
 |   // Calls Unschedule() on the associated simulator. | 
 |   void Unschedule(); | 
 |  | 
 |   Simulator* simulator_; | 
 |   const QuicClock* clock_; | 
 |   std::string name_; | 
 |  | 
 |  private: | 
 |   // Since the Actor object registers itself with a simulator using a pointer to | 
 |   // itself, do not allow it to be moved. | 
 |   Actor(Actor&&) = delete; | 
 |   Actor(const Actor&) = delete; | 
 |   Actor& operator=(const Actor&) = delete; | 
 |   Actor& operator=(Actor&&) = delete; | 
 | }; | 
 |  | 
 | }  // namespace simulator | 
 | }  // namespace quic | 
 |  | 
 | #endif  // QUICHE_QUIC_TEST_TOOLS_SIMULATOR_ACTOR_H_ |