sled/3party/rxcpp/schedulers/rx-immediate.hpp

85 lines
1.8 KiB
C++
Raw Normal View History

2024-03-14 20:50:17 +08:00
// 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