/* 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