167 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //---------------------------------------------------------------------------//
 | |
| // Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com>
 | |
| //
 | |
| // Distributed under the Boost Software License, Version 1.0
 | |
| // See accompanying file LICENSE_1_0.txt or copy at
 | |
| // http://www.boost.org/LICENSE_1_0.txt
 | |
| //
 | |
| // See http://boostorg.github.com/compute for more information.
 | |
| //---------------------------------------------------------------------------//
 | |
| 
 | |
| #ifndef BOOST_COMPUTE_ASYNC_FUTURE_HPP
 | |
| #define BOOST_COMPUTE_ASYNC_FUTURE_HPP
 | |
| 
 | |
| #include <boost/compute/event.hpp>
 | |
| 
 | |
| namespace boost {
 | |
| namespace compute {
 | |
| 
 | |
| /// \class future
 | |
| /// \brief Holds the result of an asynchronous computation.
 | |
| ///
 | |
| /// \see event, wait_list
 | |
| template<class T>
 | |
| class future
 | |
| {
 | |
| public:
 | |
|     future()
 | |
|         : m_event(0)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     future(const T &result, const event &event)
 | |
|         : m_result(result),
 | |
|           m_event(event)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     future(const future<T> &other)
 | |
|         : m_result(other.m_result),
 | |
|           m_event(other.m_event)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     future& operator=(const future<T> &other)
 | |
|     {
 | |
|         if(this != &other){
 | |
|             m_result = other.m_result;
 | |
|             m_event = other.m_event;
 | |
|         }
 | |
| 
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     ~future()
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     /// Returns the result of the computation. This will block until
 | |
|     /// the result is ready.
 | |
|     T get()
 | |
|     {
 | |
|         wait();
 | |
| 
 | |
|         return m_result;
 | |
|     }
 | |
| 
 | |
|     /// Returns \c true if the future is valid.
 | |
|     bool valid() const
 | |
|     {
 | |
|         return m_event != 0;
 | |
|     }
 | |
| 
 | |
|     /// Blocks until the computation is complete.
 | |
|     void wait() const
 | |
|     {
 | |
|         m_event.wait();
 | |
|     }
 | |
| 
 | |
|     /// Returns the underlying event object.
 | |
|     event get_event() const
 | |
|     {
 | |
|         return m_event;
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     T m_result;
 | |
|     event m_event;
 | |
| };
 | |
| 
 | |
| /// \internal_
 | |
| template<>
 | |
| class future<void>
 | |
| {
 | |
| public:
 | |
|     future()
 | |
|         : m_event(0)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     template<class T>
 | |
|     future(const future<T> &other)
 | |
|         : m_event(other.get_event())
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     explicit future(const event &event)
 | |
|         : m_event(event)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     template<class T>
 | |
|     future<void> &operator=(const future<T> &other)
 | |
|     {
 | |
|         m_event = other.get_event();
 | |
| 
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     future<void> &operator=(const future<void> &other)
 | |
|     {
 | |
|         if(this != &other){
 | |
|             m_event = other.m_event;
 | |
|         }
 | |
| 
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     ~future()
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     void get()
 | |
|     {
 | |
|         wait();
 | |
|     }
 | |
| 
 | |
|     bool valid() const
 | |
|     {
 | |
|         return m_event != 0;
 | |
|     }
 | |
| 
 | |
|     void wait() const
 | |
|     {
 | |
|         m_event.wait();
 | |
|     }
 | |
| 
 | |
|     event get_event() const
 | |
|     {
 | |
|         return m_event;
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     event m_event;
 | |
| };
 | |
| 
 | |
| /// \internal_
 | |
| template<class Result>
 | |
| inline future<Result> make_future(const Result &result, const event &event)
 | |
| {
 | |
|     return future<Result>(result, event);
 | |
| }
 | |
| 
 | |
| } // end compute namespace
 | |
| } // end boost namespace
 | |
| 
 | |
| #endif // BOOST_COMPUTE_ASYNC_FUTURE_HPP
 | 
