/*
 * Copyright 2009- ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 * In applying this licence, ECMWF does not waive the privileges and immunities
 * granted to it by virtue of its status as an intergovernmental organisation
 * nor does it submit to any jurisdiction.
 */

#ifndef ecflow_core_DurationTimer_HPP
#define ecflow_core_DurationTimer_HPP

///
/// \brief Simple class to report wall clock time duration
///

#include <boost/date_time/posix_time/posix_time_types.hpp>

namespace ecf {

class DurationTimer {
public:
    DurationTimer() : start_time_(boost::posix_time::microsec_clock::universal_time()) {}
    ~DurationTimer() = default;

    int duration() const {
        boost::posix_time::time_duration duration = boost::posix_time::microsec_clock::universal_time() - start_time_;
        return duration.total_seconds();
    }

    boost::posix_time::time_duration elapsed() const {
        return boost::posix_time::microsec_clock::universal_time() - start_time_;
    }

    double elapsed_seconds() const { return (double)elapsed().total_milliseconds() / (double)1000; }

private:
    boost::posix_time::ptime start_time_;
};

class ScopedDurationTimer {
public:
    explicit ScopedDurationTimer(const char* msg)
        : start_time_(boost::posix_time::microsec_clock::universal_time()),
          msg_(msg) {}
    ~ScopedDurationTimer();

    boost::posix_time::time_duration elapsed() const {
        return boost::posix_time::microsec_clock::universal_time() - start_time_;
    }

private:
    boost::posix_time::ptime start_time_;
    const char* msg_;
};

} // namespace ecf

#endif /* ecflow_core_DurationTimer_HPP */
