#pragma once

namespace std {
  enum class future_status {
    ready,
    timeout,
    deferred
  };

  class future_error;

  template<class R> class promise;
  template<class R> class promise<R&>;
  template<> class promise<void>;

  template<class R> class future;
  template<class R> class future<R&>;
  template<> class future<void>;

  template<class R> class shared_future;
  template<class R> class shared_future<R&>;
  template<> class shared_future<void>;

  template<class> class packaged_task;
  template<class R, class... ArgTypes>
    class packaged_task<R(ArgTypes...)>;
}
