• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/task/common/lazy_now.h"
6 
7 #include "base/check.h"
8 #include "base/time/tick_clock.h"
9 #include "third_party/abseil-cpp/absl/types/optional.h"
10 
11 namespace base {
12 
LazyNow(TimeTicks now)13 LazyNow::LazyNow(TimeTicks now) : now_(now), tick_clock_(nullptr) {}
14 
LazyNow(absl::optional<TimeTicks> now,const TickClock * tick_clock)15 LazyNow::LazyNow(absl::optional<TimeTicks> now, const TickClock* tick_clock)
16     : now_(now), tick_clock_(tick_clock) {
17   DCHECK(tick_clock);
18 }
19 
LazyNow(const TickClock * tick_clock)20 LazyNow::LazyNow(const TickClock* tick_clock) : tick_clock_(tick_clock) {
21   DCHECK(tick_clock);
22 }
23 
LazyNow(LazyNow && move_from)24 LazyNow::LazyNow(LazyNow&& move_from) noexcept
25     : now_(move_from.now_), tick_clock_(move_from.tick_clock_) {
26   move_from.tick_clock_ = nullptr;
27   move_from.now_ = absl::nullopt;
28 }
29 
Now()30 TimeTicks LazyNow::Now() {
31   // It looks tempting to avoid using Optional and to rely on is_null() instead,
32   // but in some test environments clock intentionally starts from zero.
33   if (!now_) {
34     DCHECK(tick_clock_);  // It can fire only on use after std::move.
35     now_ = tick_clock_->NowTicks();
36   }
37   return *now_;
38 }
39 
40 }  // namespace base
41