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 <optional> 8 9 #include "base/check.h" 10 #include "base/time/tick_clock.h" 11 12 namespace base { 13 LazyNow(TimeTicks now)14LazyNow::LazyNow(TimeTicks now) : now_(now), tick_clock_(nullptr) {} 15 LazyNow(std::optional<TimeTicks> now,const TickClock * tick_clock)16LazyNow::LazyNow(std::optional<TimeTicks> now, const TickClock* tick_clock) 17 : now_(now), tick_clock_(tick_clock) { 18 DCHECK(tick_clock); 19 } 20 LazyNow(const TickClock * tick_clock)21LazyNow::LazyNow(const TickClock* tick_clock) : tick_clock_(tick_clock) { 22 DCHECK(tick_clock); 23 } 24 LazyNow(LazyNow && move_from)25LazyNow::LazyNow(LazyNow&& move_from) noexcept 26 : now_(move_from.now_), tick_clock_(move_from.tick_clock_) { 27 move_from.tick_clock_ = nullptr; 28 move_from.now_ = std::nullopt; 29 } 30 Now()31TimeTicks LazyNow::Now() { 32 // It looks tempting to avoid using Optional and to rely on is_null() instead, 33 // but in some test environments clock intentionally starts from zero. 34 if (!now_) { 35 DCHECK(tick_clock_); // It can fire only on use after std::move. 36 now_ = tick_clock_->NowTicks(); 37 } 38 return *now_; 39 } 40 41 } // namespace base 42