/*
 *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_AUDIO_TIME_INTERVAL_H_
#define WEBRTC_AUDIO_TIME_INTERVAL_H_

#include <stdint.h>

#include "webrtc/api/optional.h"

namespace webrtc {

// This class logs the first and last time its Extend() function is called.
//
// This class is not thread-safe; Extend() calls should only be made by a
// single thread at a time, such as within a lock or destructor.
//
// Example usage:
//   // let x < y < z < u < v
//   rtc::TimeInterval interval;
//   ...  //   interval.Extend(); // at time x
//   ...
//   interval.Extend(); // at time y
//   ...
//   interval.Extend(); // at time u
//   ...
//   interval.Extend(z); // at time v
//   ...
//   if (!interval.Empty()) {
//     int64_t active_time = interval.Length(); // returns (u - x)
//   }
class TimeInterval {
 public:
  TimeInterval();
  ~TimeInterval();
  // Extend the interval with the current time.
  void Extend();
  // Extend the interval with a given time.
  void Extend(int64_t time);
  // Take the convex hull with another interval.
  void Extend(const TimeInterval& other_interval);
  // True iff Extend has never been called.
  bool Empty() const;
  // Returns the time between the first and the last tick, in milliseconds.
  int64_t Length() const;

 private:
  struct Interval {
    Interval(int64_t first, int64_t last);

    int64_t first, last;
  };
  rtc::Optional<Interval> interval_;
};

}  // namespace webrtc

#endif  // WEBRTC_AUDIO_TIME_INTERVAL_H_
