xref: /aosp_15_r20/external/webrtc/api/units/frequency.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker #ifndef API_UNITS_FREQUENCY_H_
11*d9f75844SAndroid Build Coastguard Worker #define API_UNITS_FREQUENCY_H_
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #ifdef WEBRTC_UNIT_TEST
14*d9f75844SAndroid Build Coastguard Worker #include <ostream>  // no-presubmit-check TODO(webrtc:8982)
15*d9f75844SAndroid Build Coastguard Worker #endif              // WEBRTC_UNIT_TEST
16*d9f75844SAndroid Build Coastguard Worker 
17*d9f75844SAndroid Build Coastguard Worker #include <cstdlib>
18*d9f75844SAndroid Build Coastguard Worker #include <limits>
19*d9f75844SAndroid Build Coastguard Worker #include <string>
20*d9f75844SAndroid Build Coastguard Worker #include <type_traits>
21*d9f75844SAndroid Build Coastguard Worker 
22*d9f75844SAndroid Build Coastguard Worker #include "api/units/time_delta.h"
23*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/units/unit_base.h"  // IWYU pragma: export
24*d9f75844SAndroid Build Coastguard Worker 
25*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
26*d9f75844SAndroid Build Coastguard Worker 
27*d9f75844SAndroid Build Coastguard Worker class Frequency final : public rtc_units_impl::RelativeUnit<Frequency> {
28*d9f75844SAndroid Build Coastguard Worker  public:
29*d9f75844SAndroid Build Coastguard Worker   template <typename T>
MilliHertz(T value)30*d9f75844SAndroid Build Coastguard Worker   static constexpr Frequency MilliHertz(T value) {
31*d9f75844SAndroid Build Coastguard Worker     static_assert(std::is_arithmetic<T>::value, "");
32*d9f75844SAndroid Build Coastguard Worker     return FromValue(value);
33*d9f75844SAndroid Build Coastguard Worker   }
34*d9f75844SAndroid Build Coastguard Worker   template <typename T>
Hertz(T value)35*d9f75844SAndroid Build Coastguard Worker   static constexpr Frequency Hertz(T value) {
36*d9f75844SAndroid Build Coastguard Worker     static_assert(std::is_arithmetic<T>::value, "");
37*d9f75844SAndroid Build Coastguard Worker     return FromFraction(1'000, value);
38*d9f75844SAndroid Build Coastguard Worker   }
39*d9f75844SAndroid Build Coastguard Worker   template <typename T>
40*d9f75844SAndroid Build Coastguard Worker   static constexpr Frequency KiloHertz(T value) {
41*d9f75844SAndroid Build Coastguard Worker     static_assert(std::is_arithmetic<T>::value, "");
42*d9f75844SAndroid Build Coastguard Worker     return FromFraction(1'000'000, value);
43*d9f75844SAndroid Build Coastguard Worker   }
44*d9f75844SAndroid Build Coastguard Worker 
45*d9f75844SAndroid Build Coastguard Worker   Frequency() = delete;
46*d9f75844SAndroid Build Coastguard Worker 
47*d9f75844SAndroid Build Coastguard Worker   template <typename T = int64_t>
48*d9f75844SAndroid Build Coastguard Worker   constexpr T hertz() const {
49*d9f75844SAndroid Build Coastguard Worker     return ToFraction<1000, T>();
50*d9f75844SAndroid Build Coastguard Worker   }
51*d9f75844SAndroid Build Coastguard Worker   template <typename T = int64_t>
52*d9f75844SAndroid Build Coastguard Worker   constexpr T millihertz() const {
53*d9f75844SAndroid Build Coastguard Worker     return ToValue<T>();
54*d9f75844SAndroid Build Coastguard Worker   }
55*d9f75844SAndroid Build Coastguard Worker 
56*d9f75844SAndroid Build Coastguard Worker  private:
57*d9f75844SAndroid Build Coastguard Worker   friend class rtc_units_impl::UnitBase<Frequency>;
58*d9f75844SAndroid Build Coastguard Worker   using RelativeUnit::RelativeUnit;
59*d9f75844SAndroid Build Coastguard Worker   static constexpr bool one_sided = true;
60*d9f75844SAndroid Build Coastguard Worker };
61*d9f75844SAndroid Build Coastguard Worker 
62*d9f75844SAndroid Build Coastguard Worker inline constexpr Frequency operator/(int64_t nominator,
63*d9f75844SAndroid Build Coastguard Worker                                      const TimeDelta& interval) {
64*d9f75844SAndroid Build Coastguard Worker   constexpr int64_t kKiloPerMicro = 1000 * 1000000;
65*d9f75844SAndroid Build Coastguard Worker   RTC_DCHECK_LE(nominator, std::numeric_limits<int64_t>::max() / kKiloPerMicro);
66*d9f75844SAndroid Build Coastguard Worker   RTC_CHECK(interval.IsFinite());
67*d9f75844SAndroid Build Coastguard Worker   RTC_CHECK(!interval.IsZero());
68*d9f75844SAndroid Build Coastguard Worker   return Frequency::MilliHertz(nominator * kKiloPerMicro / interval.us());
69*d9f75844SAndroid Build Coastguard Worker }
70*d9f75844SAndroid Build Coastguard Worker 
71*d9f75844SAndroid Build Coastguard Worker inline constexpr TimeDelta operator/(int64_t nominator,
72*d9f75844SAndroid Build Coastguard Worker                                      const Frequency& frequency) {
73*d9f75844SAndroid Build Coastguard Worker   constexpr int64_t kMegaPerMilli = 1000000 * 1000;
74*d9f75844SAndroid Build Coastguard Worker   RTC_DCHECK_LE(nominator, std::numeric_limits<int64_t>::max() / kMegaPerMilli);
75*d9f75844SAndroid Build Coastguard Worker   RTC_CHECK(frequency.IsFinite());
76*d9f75844SAndroid Build Coastguard Worker   RTC_CHECK(!frequency.IsZero());
77*d9f75844SAndroid Build Coastguard Worker   return TimeDelta::Micros(nominator * kMegaPerMilli / frequency.millihertz());
78*d9f75844SAndroid Build Coastguard Worker }
79*d9f75844SAndroid Build Coastguard Worker 
80*d9f75844SAndroid Build Coastguard Worker inline constexpr double operator*(Frequency frequency, TimeDelta time_delta) {
81*d9f75844SAndroid Build Coastguard Worker   return frequency.hertz<double>() * time_delta.seconds<double>();
82*d9f75844SAndroid Build Coastguard Worker }
83*d9f75844SAndroid Build Coastguard Worker inline constexpr double operator*(TimeDelta time_delta, Frequency frequency) {
84*d9f75844SAndroid Build Coastguard Worker   return frequency * time_delta;
85*d9f75844SAndroid Build Coastguard Worker }
86*d9f75844SAndroid Build Coastguard Worker 
87*d9f75844SAndroid Build Coastguard Worker std::string ToString(Frequency value);
88*d9f75844SAndroid Build Coastguard Worker inline std::string ToLogString(Frequency value) {
89*d9f75844SAndroid Build Coastguard Worker   return ToString(value);
90*d9f75844SAndroid Build Coastguard Worker }
91*d9f75844SAndroid Build Coastguard Worker 
92*d9f75844SAndroid Build Coastguard Worker #ifdef WEBRTC_UNIT_TEST
93*d9f75844SAndroid Build Coastguard Worker inline std::ostream& operator<<(  // no-presubmit-check TODO(webrtc:8982)
94*d9f75844SAndroid Build Coastguard Worker     std::ostream& stream,         // no-presubmit-check TODO(webrtc:8982)
95*d9f75844SAndroid Build Coastguard Worker     Frequency value) {
96*d9f75844SAndroid Build Coastguard Worker   return stream << ToString(value);
97*d9f75844SAndroid Build Coastguard Worker }
98*d9f75844SAndroid Build Coastguard Worker #endif  // WEBRTC_UNIT_TEST
99*d9f75844SAndroid Build Coastguard Worker 
100*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
101*d9f75844SAndroid Build Coastguard Worker #endif  // API_UNITS_FREQUENCY_H_
102