| // 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_ |