Program Listing for File Counter.hpp

Return to documentation for file (include/uitsl/countdown/Counter.hpp)

#pragma once
#ifndef UITSL_COUNTDOWN_COUNTER_HPP_INCLUDE
#define UITSL_COUNTDOWN_COUNTER_HPP_INCLUDE

#include <algorithm>
#include <chrono>
#include <limits>
#include <stddef.h>

#include "../chrono/chrono_utils.hpp"

#include "impl/CountdownIterator.hpp"

namespace uitsl {

class Counter {

  const size_t duration;

  size_t elapsed{};

public:

  using iterator = uitsl::CountdownIterator<Counter>;
  using elapsed_t = size_t;

  explicit Counter(
    const size_t duration_=std::numeric_limits<size_t>::max()
  ) : duration{duration_}
  { ; }

  bool IsComplete() const {
    return GetElapsed() >= duration;
  }

  void Step() { ++elapsed; }

  size_t GetElapsed() const {
    return elapsed;
  }

  size_t GetRemaining() const {
    return GetElapsed() > duration
      ? duration - GetElapsed()
      : 0
    ;
  }

  double GetFractionComplete() const {
    return static_cast<double>(GetElapsed()) / static_cast<double>(duration);
  }

  Counter& operator++() { Step(); return *this; }

  iterator begin() { return iterator{ *this }; }

  iterator end() { return iterator{}; }

};

} // namespace uitsl

#endif // #ifndef UITSL_COUNTDOWN_COUNTER_HPP_INCLUDE