blob: 2fbceaaefdde5a20fbb88b9e73879b0bc5c6ff03 [file] [log] [blame]
Avi Drissmane4622aa2022-09-08 20:36:061// Copyright 2018 The Chromium Authors
alexclarke1794435f2015-07-23 11:50:352// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Gabriel Charetteaccb9342022-08-03 23:46:265#include "base/task/common/lazy_now.h"
alexclarke1794435f2015-07-23 11:50:356
David Dorwin3f503b82022-04-20 04:07:037#include "base/check.h"
alexclarkef65eb2d2015-11-03 18:24:168#include "base/time/tick_clock.h"
Anton Bikineev7dd58ad2021-05-18 01:01:399#include "third_party/abseil-cpp/absl/types/optional.h"
alexclarke1794435f2015-07-23 11:50:3510
Greg Kraynov8f4784462018-05-14 10:08:2111namespace base {
Greg Kraynov1f358aca2018-04-27 18:51:3312
Alex Attar9fcc01e2022-05-20 14:01:2713LazyNow::LazyNow(TimeTicks now) : now_(now), tick_clock_(nullptr) {}
Greg Kraynov1f358aca2018-04-27 18:51:3314
Alex Attar9fcc01e2022-05-20 14:01:2715LazyNow::LazyNow(absl::optional<TimeTicks> now, const TickClock* tick_clock)
16 : now_(now), tick_clock_(tick_clock) {
17 DCHECK(tick_clock);
18}
19
20LazyNow::LazyNow(const TickClock* tick_clock) : tick_clock_(tick_clock) {
Greg Kraynov1f358aca2018-04-27 18:51:3321 DCHECK(tick_clock);
22}
23
tzik429534e2018-05-28 09:24:5424LazyNow::LazyNow(LazyNow&& move_from) noexcept
Alex Attar9fcc01e2022-05-20 14:01:2725 : now_(move_from.now_), tick_clock_(move_from.tick_clock_) {
Greg Kraynov1f358aca2018-04-27 18:51:3326 move_from.tick_clock_ = nullptr;
Anton Bikineev7dd58ad2021-05-18 01:01:3927 move_from.now_ = absl::nullopt;
Greg Kraynov1f358aca2018-04-27 18:51:3328}
29
Greg Kraynov8f4784462018-05-14 10:08:2130TimeTicks LazyNow::Now() {
Greg Kraynov02e83f92018-05-24 11:22:5231 // 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_) {
Greg Kraynov1f358aca2018-04-27 18:51:3334 DCHECK(tick_clock_); // It can fire only on use after std::move.
alexclarkef65eb2d2015-11-03 18:24:1635 now_ = tick_clock_->NowTicks();
Greg Kraynov1f358aca2018-04-27 18:51:3336 }
Greg Kraynov02e83f92018-05-24 11:22:5237 return *now_;
alexclarke1794435f2015-07-23 11:50:3538}
39
Greg Kraynov8f4784462018-05-14 10:08:2140} // namespace base