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