15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_time.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Highest number of microseconds that DateTimeOffset can hold.
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int64 kQuicInfiniteTimeUs = GG_INT64_C(0x7fffffffffffffff) / 10;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime::Delta::Delta(base::TimeDelta delta)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : delta_(delta) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicTime::Delta QuicTime::Delta::Zero() {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return QuicTime::Delta::FromMicroseconds(0);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicTime::Delta QuicTime::Delta::Infinite() {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return QuicTime::Delta::FromMicroseconds(kQuicInfiniteTimeUs);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicTime::Delta QuicTime::Delta::FromSeconds(int64 seconds) {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return QuicTime::Delta(base::TimeDelta::FromSeconds(seconds));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime::Delta QuicTime::Delta::FromMilliseconds(int64 ms) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return QuicTime::Delta(base::TimeDelta::FromMilliseconds(ms));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime::Delta QuicTime::Delta::FromMicroseconds(int64 us) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return QuicTime::Delta(base::TimeDelta::FromMicroseconds(us));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 QuicTime::Delta::ToSeconds() const {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return delta_.InSeconds();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 QuicTime::Delta::ToMilliseconds() const {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delta_.InMilliseconds();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 QuicTime::Delta::ToMicroseconds() const {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return delta_.InMicroseconds();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime::Delta QuicTime::Delta::Add(const Delta& delta) const {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return QuicTime::Delta::FromMicroseconds(ToMicroseconds() +
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           delta.ToMicroseconds());
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime::Delta QuicTime::Delta::Subtract(const Delta& delta) const {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return QuicTime::Delta::FromMicroseconds(ToMicroseconds() -
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           delta.ToMicroseconds());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool QuicTime::Delta::IsZero() const {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return delta_.InMicroseconds() == 0;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool QuicTime::Delta::IsInfinite() const {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return delta_.InMicroseconds() == kQuicInfiniteTimeUs;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicTime QuicTime::Zero() {
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return QuicTime(base::TimeTicks());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicTime::QuicTime(base::TimeTicks ticks)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : ticks_(ticks) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int64 QuicTime::ToDebuggingValue() const {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (ticks_ - base::TimeTicks()).InMicroseconds();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool QuicTime::IsInitialized() const {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ticks_ != base::TimeTicks();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime QuicTime::Add(const Delta& delta) const {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return QuicTime(ticks_ + delta.delta_);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime QuicTime::Subtract(const Delta& delta) const {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return QuicTime(ticks_ - delta.delta_);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime::Delta QuicTime::Subtract(const QuicTime& other) const {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return QuicTime::Delta(ticks_ - other.ticks_);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// static
103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)QuicWallTime QuicWallTime::FromUNIXSeconds(uint64 seconds) {
104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return QuicWallTime(seconds);
105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
106b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// static
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)QuicWallTime QuicWallTime::Zero() {
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return QuicWallTime(0);
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
112b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)uint64 QuicWallTime::ToUNIXSeconds() const {
113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return seconds_;
114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool QuicWallTime::IsAfter(QuicWallTime other) const {
117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return seconds_ > other.seconds_;
118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool QuicWallTime::IsBefore(QuicWallTime other) const {
121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return seconds_ < other.seconds_;
122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool QuicWallTime::IsZero() const {
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return seconds_ == 0;
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
128b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)QuicTime::Delta QuicWallTime::AbsoluteDifference(QuicWallTime other) const {
129b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  uint64 d;
130b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
131b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (seconds_ > other.seconds_) {
132b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    d = seconds_ - other.seconds_;
133b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  } else {
134b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    d = other.seconds_ - seconds_;
135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (d > static_cast<uint64>(kint64max)) {
138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    d = kint64max;
139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return QuicTime::Delta::FromSeconds(d);
141b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
143b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)QuicWallTime QuicWallTime::Add(QuicTime::Delta delta) const {
144b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  uint64 seconds = seconds_ + delta.ToSeconds();
145b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (seconds < seconds_) {
146b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    seconds = kuint64max;
147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
148b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return QuicWallTime(seconds);
149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
150b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)QuicWallTime QuicWallTime::Subtract(QuicTime::Delta delta) const {
152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  uint64 seconds = seconds_ - delta.ToSeconds();
153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (seconds > seconds_) {
154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    seconds = 0;
155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return QuicWallTime(seconds);
157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
158b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)QuicWallTime::QuicWallTime(uint64 seconds)
160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    : seconds_(seconds) {
161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace net
164