diff options
Diffstat (limited to 'Rx/v2/src/rxcpp/schedulers/rx-virtualtime.hpp')
-rw-r--r-- | Rx/v2/src/rxcpp/schedulers/rx-virtualtime.hpp | 230 |
1 files changed, 0 insertions, 230 deletions
diff --git a/Rx/v2/src/rxcpp/schedulers/rx-virtualtime.hpp b/Rx/v2/src/rxcpp/schedulers/rx-virtualtime.hpp deleted file mode 100644 index c36ddf3..0000000 --- a/Rx/v2/src/rxcpp/schedulers/rx-virtualtime.hpp +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -#pragma once - -#if !defined(RXCPP_RX_SCHEDULER_VIRTUAL_TIME_HPP) -#define RXCPP_RX_SCHEDULER_VIRTUAL_TIME_HPP - -#include "../rx-includes.hpp" - -namespace rxcpp { - -namespace schedulers { - -namespace detail { - -template<class Absolute, class Relative> -struct virtual_time_base : std::enable_shared_from_this<virtual_time_base<Absolute, Relative>> -{ -private: - typedef virtual_time_base<Absolute, Relative> this_type; - virtual_time_base(const virtual_time_base&); - - mutable bool isenabled; - -public: - typedef Absolute absolute; - typedef Relative relative; - - virtual ~virtual_time_base() - { - } - -protected: - virtual_time_base() - : isenabled(false) - , clock_now(0) - { - } - explicit virtual_time_base(absolute initialClock) - : isenabled(false) - , clock_now(initialClock) - { - } - - mutable absolute clock_now; - - typedef time_schedulable<long> item_type; - - virtual absolute add(absolute, relative) const =0; - - virtual typename scheduler_base::clock_type::time_point to_time_point(absolute) const =0; - virtual relative to_relative(typename scheduler_base::clock_type::duration) const =0; - - virtual item_type top() const =0; - virtual void pop() const =0; - virtual bool empty() const =0; - -public: - - virtual void schedule_absolute(absolute, const schedulable&) const =0; - - virtual void schedule_relative(relative when, const schedulable& a) const { - auto at = add(clock_now, when); - return schedule_absolute(at, a); - } - - bool is_enabled() const {return isenabled;} - absolute clock() const {return clock_now;} - - void start() const - { - if (!isenabled) { - isenabled = true; - rxsc::recursion r; - r.reset(false); - while (!empty() && isenabled) { - auto next = top(); - pop(); - if (next.what.is_subscribed()) { - if (next.when > clock_now) { - clock_now = next.when; - } - next.what(r.get_recurse()); - } - } - isenabled = false; - } - } - - void stop() const - { - isenabled = false; - } - - void advance_to(absolute time) const - { - if (time < clock_now) { - std::terminate(); - } - - if (time == clock_now) { - return; - } - - if (!isenabled) { - isenabled = true; - rxsc::recursion r; - while (!empty() && isenabled) { - auto next = top(); - if (next.when <= time) { - pop(); - if (!next.what.is_subscribed()) { - continue; - } - if (next.when > clock_now) { - clock_now = next.when; - } - next.what(r.get_recurse()); - } - else { - break; - } - } - isenabled = false; - clock_now = time; - } - else { - std::terminate(); - } - } - - void advance_by(relative time) const - { - auto dt = add(clock_now, time); - - if (dt < clock_now) { - std::terminate(); - } - - if (dt == clock_now) { - return; - } - - if (!isenabled) { - advance_to(dt); - } - else { - std::terminate(); - } - } - - void sleep(relative time) const - { - auto dt = add(clock_now, time); - - if (dt < clock_now) { - std::terminate(); - } - - clock_now = dt; - } - -}; - -} - -template<class Absolute, class Relative> -struct virtual_time : public detail::virtual_time_base<Absolute, Relative> -{ - typedef detail::virtual_time_base<Absolute, Relative> base; - - typedef typename base::item_type item_type; - - typedef detail::schedulable_queue< - typename item_type::time_point_type> queue_item_time; - - mutable queue_item_time q; - -public: - virtual ~virtual_time() - { - } - -protected: - virtual_time() - { - } - explicit virtual_time(typename base::absolute initialClock) - : base(initialClock) - { - } - - virtual item_type top() const { - return q.top(); - } - virtual void pop() const { - q.pop(); - } - virtual bool empty() const { - return q.empty(); - } - - using base::schedule_absolute; - using base::schedule_relative; - - virtual void schedule_absolute(typename base::absolute when, const schedulable& a) const - { - // use a separate subscription here so that a's subscription is not affected - auto run = make_schedulable( - a.get_worker(), - composite_subscription(), - [a](const schedulable& scbl) { - rxsc::recursion r; - r.reset(false); - if (scbl.is_subscribed()) { - scbl.unsubscribe(); // unsubscribe() run, not a; - a(r.get_recurse()); - } - }); - q.push(item_type(when, run)); - } -}; - - - -} - -} - -#endif |