// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

#ifndef EIGEN_CXX11_THREADPOOL_THREAD_ENVIRONMENT_H
#define EIGEN_CXX11_THREADPOOL_THREAD_ENVIRONMENT_H

namespace Eigen {

struct StlThreadEnvironment
{
    struct Task
    {
        std::function<void()> f;
    };

    // EnvThread constructor must start the thread,
    // destructor must join the thread.
    class EnvThread
    {
      public:
        EnvThread(std::function<void()> f) : thr_(std::move(f)) {}
        ~EnvThread()
        {
            thr_.join();
        }

      private:
        std::thread thr_;
    };

    EnvThread*
    CreateThread(std::function<void()> f)
    {
        return new EnvThread(std::move(f));
    }
    Task
    CreateTask(std::function<void()> f)
    {
        return Task{std::move(f)};
    }
    void
    ExecuteTask(const Task& t)
    {
        t.f();
    }
};

}  // namespace Eigen

#endif  // EIGEN_CXX11_THREADPOOL_THREAD_ENVIRONMENT_H
