/* Copyright 2016, Ableton AG, Berlin. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* If you would like to incorporate Link into a proprietary software application,
* please contact .
*/
#pragma once
#include
namespace ableton
{
namespace util
{
namespace test
{
struct IoService
{
// Wrapper around the internal util::test::Timer in the list
struct Timer
{
using ErrorCode = test::Timer::ErrorCode;
using TimePoint = test::Timer::TimePoint;
Timer(util::test::Timer* pTimer)
: mpTimer(pTimer)
{
}
void expires_at(std::chrono::system_clock::time_point t)
{
mpTimer->expires_at(t);
}
template
void expires_from_now(std::chrono::duration duration)
{
mpTimer->expires_from_now(duration);
}
ErrorCode cancel()
{
return mpTimer->cancel();
}
template
void async_wait(Handler handler)
{
mpTimer->async_wait(std::move(handler));
}
TimePoint now() const
{
return mpTimer->now();
}
util::test::Timer* mpTimer;
};
IoService() = default;
Timer makeTimer()
{
mTimers.emplace_back();
return Timer{&mTimers.back()};
}
template
void post(Handler handler)
{
mHandlers.emplace_back(std::move(handler));
}
template
void advance(std::chrono::duration duration)
{
runHandlers();
for (auto& timer : mTimers)
{
timer.advance(duration);
}
}
void runHandlers()
{
for (auto& handler : mHandlers)
{
handler();
}
mHandlers.clear();
}
std::vector> mHandlers;
std::vector mTimers;
};
} // namespace test
} // namespace util
} // namespace ableton