DYTSrouce/Tool/matlab/include/MatlabEngine/engine_future.hpp
2024-11-22 23:19:31 +08:00

262 lines
8.1 KiB
C++

/* Copyright 2017 The MathWorks, Inc. */
#ifndef ENGINE_FUTURE_HPP
#define ENGINE_FUTURE_HPP
#include <vector>
#include <streambuf>
#include <memory>
#include <future>
namespace matlab {
namespace execution {
using namespace matlab::engine;
/**
* @class FutureResult<std::unique_ptr<MATLABEngine>>
* This class is a specialization of FutureResult<T>.
* matlab::engine::startMATLABAsync and matlab::engine::connectMATLABAsync return instances of this type.
*/
template <>
class FutureResult<std::unique_ptr<MATLABEngine>>: public std::future<std::unique_ptr<MATLABEngine>>{
public:
/**
* A constructor of FutureResult that accepts a standard future
*
* @param a_future - A standard future
*
* @throw none
*/
FutureResult(std::future<std::unique_ptr<MATLABEngine>>&& a_future);
/**
* Move constructor of FutureResult
*
* @param a_futureresult - A future result
*
* @throw none
*/
FutureResult(FutureResult<std::unique_ptr<MATLABEngine>>&& a_futureresult);
/**
* Assignment operator
*
* @param rhs - A future result
*
* @throw none
*/
FutureResult<std::unique_ptr<MATLABEngine>>& operator=(FutureResult<std::unique_ptr<MATLABEngine>>&& rhs);
FutureResult();
~FutureResult();
/**
* Swap the contents of this FutureResult with another FutureResult
*
* @param a_futureresult - A FutureResult
* @return void
*
* @throw none
*/
void swap(FutureResult<std::unique_ptr<MATLABEngine>>& a_futureresult);
/**
* Get the MATLAB Engine
*
* @return the MATLABEngine unique pointer
*
* @throw InterruptedException, EngineException
*/
std::unique_ptr<MATLABEngine> get();
/**
* Create a shared copy of this future result
*
* @return a SharedFutureResult
*
* @throw none
*/
SharedFutureResult<std::unique_ptr<MATLABEngine>> share();
/**
* Check the future result is valid or not
*
* @return true if valid; false otherwise
*
* @throw none
*/
bool valid() const;
/**
* Wait until the result is ready
*
* @throw none
*/
void wait() const;
/**
* Wait until certain time point
*
* @param abs_time - A time point
* @return the status of the future result
*
* @throw none
*/
template<class Clock, class Duration>
std::future_status wait_until(const std::chrono::time_point<Clock, Duration>& abs_time) const;
template<class Rep, class Period>
/**
* Wait for certain amount of time
*
* @param rel_time - Time during to wait
* @return the status of the future result
*
* @throw none
*/
std::future_status wait_for(const std::chrono::duration<Rep, Period>& rel_time) const;
/**
* Cancel the launch or connect of MATLAB
* In R2017b, the startAMTLAB and connectMATLAB cannot be canceled.
*
* @param allowInterrupt - Interrupt the command or not if it is being processed
* @return the request is cancel-able or not
*
* @throw none
*/
bool cancel(bool allowInterrupt = true);
private:
FutureResult(std::future<std::unique_ptr<MATLABEngine>>&) = delete;
FutureResult(FutureResult&) = delete;
FutureResult& operator= (FutureResult&) = delete;
std::future<std::unique_ptr<MATLABEngine>> future;
friend SharedFutureResult<std::unique_ptr<MATLABEngine>>;
};
/**
* @class SharedFutureResult<std::unique_ptr<MATLABEngine>>
* This class is a specialization of SharedFutureResult<T>.
* It can be created by calling FutureResult<std::unique_ptr<MATLABEngine>>.shared()
*/
template <>
class SharedFutureResult<std::unique_ptr<MATLABEngine>>: public std::shared_future<std::unique_ptr<MATLABEngine>>{
public:
SharedFutureResult();
~SharedFutureResult();
/**
* Swap the contents of this SharedFutureResult with another SharedFutureResult
*
* @param a_sharedfuture - A SharedFutureResult
* @return void
*
* @throw none
*/
void swap(SharedFutureResult<std::unique_ptr<MATLABEngine>>& a_sharedfuture);
/**
* Copy constructor
*/
SharedFutureResult(const SharedFutureResult& a_sharedfuture);
/**
* Move constructor
*/
SharedFutureResult(SharedFutureResult&& a_sharedfuture);
/**
* Move constructor that accepts a FutureResult
*/
SharedFutureResult(FutureResult<std::unique_ptr<MATLABEngine>>&& a_futureresult);
/**
* Move assignment operator
*
* @param rhs - A shared future result
*
* @throw none
*/
SharedFutureResult<std::unique_ptr<MATLABEngine>>& operator=(SharedFutureResult<std::unique_ptr<MATLABEngine>>&& rhs);
/**
* Assignment operator
*
* @param rhs - A shared future result
*
* @throw none
*/
SharedFutureResult<std::unique_ptr<MATLABEngine>>& operator=(const SharedFutureResult<std::unique_ptr<MATLABEngine>>& rhs);
/**
* Get the MATLAB Engine
*
* @return the MATLABEngine unique pointer
*
* @throw InterruptedException, EngineException
*/
const std::unique_ptr<MATLABEngine>& get() const;
/**
* Check the future result is valid or not
*
* @return true if valid; false otherwise
*
* @throw none
*/
bool valid() const;
/**
* Wait until the result is ready
*
* @throw none
*/
void wait() const;
/**
* Wait until certain time point
*
* @param abs_time - A time point
* @return the status of the future result
*
* @throw none
*/
template<class Clock, class Duration>
std::future_status wait_until(const std::chrono::time_point<Clock, Duration>& abs_time) const;
/**
* Wait for certain amount of time
*
* @param rel_time - Time during to wait
* @return the status of the future result
*
* @throw none
*/
template<class Rep, class Period>
std::future_status wait_for(const std::chrono::duration<Rep, Period>& rel_time) const;
/**
* Cancel the execution of a MATLAB command
* In R2017b, the startAMTLAB and connectMATLAB cannot be canceled.
*
* @param allowInterrupt - Interrupt the command or not if it is being processed
* @return the request is cancel-able or not
*
* @throw none
*/
bool cancel(bool allowInterrupt = true);
private:
std::shared_future<std::unique_ptr<MATLABEngine>> sharedFuture;
};
}
}
#endif /* ENGINE_FUTURE_HPP */