85 lines
1.8 KiB
C++
85 lines
1.8 KiB
C++
// 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_IMMEDIATE_HPP)
|
|
#define RXCPP_RX_SCHEDULER_IMMEDIATE_HPP
|
|
|
|
#include "../rx-includes.hpp"
|
|
|
|
namespace rxcpp {
|
|
|
|
namespace schedulers {
|
|
|
|
struct immediate : public scheduler_interface
|
|
{
|
|
private:
|
|
typedef immediate this_type;
|
|
immediate(const this_type&);
|
|
|
|
struct immediate_worker : public worker_interface
|
|
{
|
|
private:
|
|
typedef immediate_worker this_type;
|
|
immediate_worker(const this_type&);
|
|
public:
|
|
virtual ~immediate_worker()
|
|
{
|
|
}
|
|
immediate_worker()
|
|
{
|
|
}
|
|
|
|
virtual clock_type::time_point now() const {
|
|
return clock_type::now();
|
|
}
|
|
|
|
virtual void schedule(const schedulable& scbl) const {
|
|
if (scbl.is_subscribed()) {
|
|
// allow recursion
|
|
recursion r(true);
|
|
scbl(r.get_recurse());
|
|
}
|
|
}
|
|
|
|
virtual void schedule(clock_type::time_point when, const schedulable& scbl) const {
|
|
std::this_thread::sleep_until(when);
|
|
if (scbl.is_subscribed()) {
|
|
// allow recursion
|
|
recursion r(true);
|
|
scbl(r.get_recurse());
|
|
}
|
|
}
|
|
};
|
|
|
|
std::shared_ptr<immediate_worker> wi;
|
|
|
|
public:
|
|
immediate()
|
|
: wi(std::make_shared<immediate_worker>())
|
|
{
|
|
}
|
|
virtual ~immediate()
|
|
{
|
|
}
|
|
|
|
virtual clock_type::time_point now() const {
|
|
return clock_type::now();
|
|
}
|
|
|
|
virtual worker create_worker(composite_subscription cs) const {
|
|
return worker(std::move(cs), wi);
|
|
}
|
|
};
|
|
|
|
inline const scheduler& make_immediate() {
|
|
static scheduler instance = make_scheduler<immediate>();
|
|
return instance;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|