// Copyright 2018 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "platform/api/time.h" #include #include #include #include "util/chrono_helpers.h" #include "util/osp_logging.h" using std::chrono::high_resolution_clock; using std::chrono::steady_clock; using std::chrono::system_clock; namespace openscreen { Clock::time_point Clock::now() noexcept { constexpr bool kSteadyIsGoodEnough = std::ratio_less_equal_v; constexpr bool kHighResIsGoodEnough = std::ratio_less_equal_v && high_resolution_clock::is_steady; static_assert(kSteadyIsGoodEnough || kHighResIsGoodEnough, "No suitable default clock (steady + high enough resolution) " "on this platform"); // 'if constexpr' guarantees compile-time branching. // We prefer steady_clock if it meets the requirements (usually cheaper). if constexpr (kSteadyIsGoodEnough) { return Clock::time_point( Clock::to_duration(steady_clock::now().time_since_epoch())); } else { return Clock::time_point( Clock::to_duration(high_resolution_clock::now().time_since_epoch())); } } std::chrono::seconds GetWallTimeSinceUnixEpoch() noexcept { // C++20 guarantees that system_clock uses the Unix Epoch (1970-01-01). // Use floor to truncate sub-second precision safely. return std::chrono::floor( std::chrono::system_clock::now().time_since_epoch()); } } // namespace openscreen