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)13LazyNow::LazyNow(TimeTicks now) : now_(now), tick_clock_(nullptr) {} 14 LazyNow(absl::optional<TimeTicks> now,const TickClock * tick_clock)15LazyNow::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)20LazyNow::LazyNow(const TickClock* tick_clock) : tick_clock_(tick_clock) { 21 DCHECK(tick_clock); 22 } 23 LazyNow(LazyNow && move_from)24LazyNow::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()30TimeTicks 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