/*
 *  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 AUDIO_TIME_INTERVAL_H_
#define AUDIO_TIME_INTERVAL_H_

#include <stdint.h>

#include "absl/types/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;
  };
  absl::optional<Interval> interval_;
};

}  // namespace webrtc

#endif  // AUDIO_TIME_INTERVAL_H_
