/* 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
#include
#include
#include
#include
#include
namespace ableton
{
namespace test
{
namespace serial_io
{
class Context
{
public:
Context(const SchedulerTree::TimePoint& now,
const std::vector<::asio::ip::address>& ifAddrs,
std::shared_ptr pScheduler)
: mNow(now)
, mIfAddrs(ifAddrs)
, mpScheduler(std::move(pScheduler))
, mNextTimerId(0)
{
}
~Context()
{
if (mpScheduler != nullptr)
{
// Finish any pending tasks before shutting down
mpScheduler->run();
}
}
Context(const Context&) = delete;
Context& operator=(const Context&) = delete;
Context(Context&& rhs)
: mNow(rhs.mNow)
, mIfAddrs(rhs.mIfAddrs)
, mpScheduler(std::move(rhs.mpScheduler))
, mLog(std::move(rhs.mLog))
, mNextTimerId(rhs.mNextTimerId)
{
}
template
void async(Handler handler)
{
mpScheduler->async(std::move(handler));
}
Context clone()
{
return {mNow, mIfAddrs, mpScheduler->makeChild()};
}
using Timer = serial_io::Timer;
Timer makeTimer()
{
return {mNextTimerId++, mNow, mpScheduler};
}
using Log = util::NullLog;
Log& log()
{
return mLog;
}
std::vector<::asio::ip::address> scanNetworkInterfaces()
{
return mIfAddrs;
}
private:
const SchedulerTree::TimePoint& mNow;
const std::vector<::asio::ip::address>& mIfAddrs;
std::shared_ptr mpScheduler;
Log mLog;
SchedulerTree::TimerId mNextTimerId;
};
} // namespace serial_io
} // namespace test
} // namespace ableton