/* Copyright 2018 The MathWorks, Inc. */ #ifndef __MEX_FUTURE_IMPL_HPP__ #define __MEX_FUTURE_IMPL_HPP__ #include #include #include #include #include "../mexFuture.hpp" namespace matlab { namespace engine { template FutureResult::FutureResult() :std::future(), taskReference() {} template FutureResult::~FutureResult() { } template void FutureResult::swap(FutureResult& a_futureresult) { taskReference.swap(a_futureresult.taskReference); std::swap(future, a_futureresult.future); std::swap(*static_cast*>(this), static_cast&>(a_futureresult)); } template FutureResult::FutureResult(std::future&& a_future) : future(std::move(a_future)), taskReference() { } template FutureResult::FutureResult(std::future&& a_future, std::shared_ptr a_taskreference) : std::future(), future(std::move(a_future)), taskReference(a_taskreference), output(), error() { } template FutureResult::FutureResult(std::future&& a_future, const std::shared_ptr& a_taskreference, const std::shared_ptr& outputBuffer, const std::shared_ptr& errorBuffer ) : std::future(), future(std::move(a_future)), taskReference(a_taskreference), output(outputBuffer), error(errorBuffer) { } template FutureResult::FutureResult(FutureResult&& a_futureresult) : std::future(), future(), taskReference() { swap(a_futureresult); } template FutureResult& FutureResult::operator=(FutureResult&& rhs) { this->swap(rhs); return *this; } template T FutureResult::get() { return future.get(); } template SharedFutureResult FutureResult::share() { return SharedFutureResult(std::move(*this)); } template bool FutureResult::valid() const { return future.valid(); } template void FutureResult::wait() const { future.wait(); } template template std::future_status FutureResult::wait_until(const std::chrono::time_point& abs_time) const { return future.wait_until(abs_time); } template template std::future_status FutureResult::wait_for(const std::chrono::duration& rel_time) const { return future.wait_for(rel_time); } template bool FutureResult::cancel(bool allowInterrupt) { return taskReference->cancel(allowInterrupt); } template std::shared_ptr FutureResult::getTaskReference() { return taskReference; } template SharedFutureResult::SharedFutureResult() :std::shared_future() { } template SharedFutureResult::~SharedFutureResult() { } template void SharedFutureResult::swap(SharedFutureResult& a_sharedfuture) { taskReference.swap(a_sharedfuture.taskReference); std::swap(sharedFuture, a_sharedfuture.sharedFuture); std::swap(*static_cast*>(this), static_cast&>(a_sharedfuture)); } template SharedFutureResult::SharedFutureResult(const SharedFutureResult& a_sharedfuture) : std::shared_future(), sharedFuture(a_sharedfuture.sharedFuture), taskReference(a_sharedfuture.taskReference) { } template SharedFutureResult::SharedFutureResult(SharedFutureResult&& a_sharedfuture) : std::shared_future(), sharedFuture(), taskReference() { swap(a_sharedfuture); } template SharedFutureResult::SharedFutureResult(FutureResult&& a_futureresult) : std::shared_future(), sharedFuture(std::move(a_futureresult.future)), taskReference() { taskReference.swap(a_futureresult.taskReference); } template SharedFutureResult& SharedFutureResult::operator=(SharedFutureResult&& rhs) { swap(rhs); return *this; } template SharedFutureResult& SharedFutureResult::operator=(const SharedFutureResult& rhs) { *(static_cast*>(this)) = rhs; sharedFuture = rhs.sharedFuture; taskReference= rhs.taskReference; return *this; } template decltype(std::declval>().get()) SharedFutureResult::get() const { return sharedFuture.get(); } template bool SharedFutureResult::valid() const { return sharedFuture.valid(); } template void SharedFutureResult::wait() const { return sharedFuture.wait(); } template template std::future_status SharedFutureResult::wait_until(const std::chrono::time_point& abs_time) const { return sharedFuture.wait_until(abs_time); } template template std::future_status SharedFutureResult::wait_for(const std::chrono::duration& rel_time) const { return sharedFuture.wait_for(rel_time); } template bool SharedFutureResult::cancel(bool allowInterrupt) { return taskReference->cancel(allowInterrupt); } } } #endif //__MEX_FUTURE_IMPL_HPP__