// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_METRICS_HISTOGRAM_FUNCTIONS_INTERNAL_OVERLOADS_H_ #define BASE_METRICS_HISTOGRAM_FUNCTIONS_INTERNAL_OVERLOADS_H_ #include #include #include #include #include "base/base_export.h" #include "base/check_op.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_base.h" #include "base/time/time.h" // This file provides overloads for the functions defined in // histogram_functions.h. These functions are duplicated to also support both // std::string and char* for the name. This avoids ctor/dtor instantiation for // constant strings to std::string, which makes the call be larger than caching // macros (which do accept char*) in those cases. These overloads are in a // separate header for readability. // See the main header for documentation: // https://chromium.googlesource.com/chromium/src/+/HEAD/base/metrics/histogram_functions.h. namespace base { // LINT.IfChange(UmaHistogramExactLinear) BASE_EXPORT void UmaHistogramExactLinear(const std::string& name, int sample, int exclusive_max); BASE_EXPORT void UmaHistogramExactLinear(const char* name, int sample, int exclusive_max); // LINT.ThenChange(/base/metrics/histogram_functions.h:UmaHistogramExactLinear) // LINT.IfChange(UmaHistogramEnumeration) template void UmaHistogramEnumeration(const std::string& name, T sample) { static_assert(std::is_enum_v, "T is not an enum."); // This also ensures that an enumeration that doesn't define kMaxValue fails // with a semi-useful error ("no member named 'kMaxValue' in ..."). static_assert(static_cast(T::kMaxValue) <= static_cast(INT_MAX) - 1, "Enumeration's kMaxValue is out of range of INT_MAX!"); DCHECK_LE(static_cast(sample), static_cast(T::kMaxValue)); return UmaHistogramExactLinear(name, static_cast(sample), static_cast(T::kMaxValue) + 1); } template void UmaHistogramEnumeration(const char* name, T sample) { static_assert(std::is_enum_v, "T is not an enum."); // This also ensures that an enumeration that doesn't define kMaxValue fails // with a semi-useful error ("no member named 'kMaxValue' in ..."). static_assert(static_cast(T::kMaxValue) <= static_cast(INT_MAX) - 1, "Enumeration's kMaxValue is out of range of INT_MAX!"); DCHECK_LE(static_cast(sample), static_cast(T::kMaxValue)); return UmaHistogramExactLinear(name, static_cast(sample), static_cast(T::kMaxValue) + 1); } template void UmaHistogramEnumeration(const std::string& name, T sample, T enum_size) { static_assert(std::is_enum_v, "T is not an enum."); DCHECK_LE(static_cast(enum_size), static_cast(INT_MAX)); DCHECK_LT(static_cast(sample), static_cast(enum_size)); return UmaHistogramExactLinear(name, static_cast(sample), static_cast(enum_size)); } template void UmaHistogramEnumeration(const char* name, T sample, T enum_size) { static_assert(std::is_enum_v, "T is not an enum."); DCHECK_LE(static_cast(enum_size), static_cast(INT_MAX)); DCHECK_LT(static_cast(sample), static_cast(enum_size)); return UmaHistogramExactLinear(name, static_cast(sample), static_cast(enum_size)); } // LINT.ThenChange(/base/metrics/histogram_functions.h:UmaHistogramEnumeration) // LINT.IfChange(UmaHistogramBoolean) BASE_EXPORT void UmaHistogramBoolean(const std::string& name, bool sample); BASE_EXPORT void UmaHistogramBoolean(const char* name, bool sample); // LINT.ThenChange(/base/metrics/histogram_functions.h:UmaHistogramBoolean) // LINT.IfChange(UmaHistogramPercentage) BASE_EXPORT void UmaHistogramPercentage(const std::string& name, int percent); BASE_EXPORT void UmaHistogramPercentage(const char* name, int percent); BASE_EXPORT void UmaHistogramPercentageObsoleteDoNotUse(const std::string& name, int percent); BASE_EXPORT void UmaHistogramPercentageObsoleteDoNotUse(const char* name, int percent); // LINT.ThenChange(/base/metrics/histogram_functions.h:UmaHistogramPercentage) // LINT.IfChange(UmaHistogramCounts) BASE_EXPORT void UmaHistogramCustomCounts(const std::string& name, int sample, int min, int exclusive_max, size_t buckets); BASE_EXPORT void UmaHistogramCustomCounts(const char* name, int sample, int min, int exclusive_max, size_t buckets); BASE_EXPORT void UmaHistogramCounts100(const std::string& name, int sample); BASE_EXPORT void UmaHistogramCounts100(const char* name, int sample); BASE_EXPORT void UmaHistogramCounts1000(const std::string& name, int sample); BASE_EXPORT void UmaHistogramCounts1000(const char* name, int sample); BASE_EXPORT void UmaHistogramCounts10000(const std::string& name, int sample); BASE_EXPORT void UmaHistogramCounts10000(const char* name, int sample); BASE_EXPORT void UmaHistogramCounts100000(const std::string& name, int sample); BASE_EXPORT void UmaHistogramCounts100000(const char* name, int sample); BASE_EXPORT void UmaHistogramCounts1M(const std::string& name, int sample); BASE_EXPORT void UmaHistogramCounts1M(const char* name, int sample); BASE_EXPORT void UmaHistogramCounts10M(const std::string& name, int sample); BASE_EXPORT void UmaHistogramCounts10M(const char* name, int sample); // LINT.ThenChange(/base/metrics/histogram_functions.h:UmaHistogramCounts) // LINT.IfChange(UmaHistogramTimes) BASE_EXPORT void UmaHistogramCustomTimes(const std::string& name, TimeDelta sample, TimeDelta min, TimeDelta max, size_t buckets); BASE_EXPORT void UmaHistogramCustomTimes(const char* name, TimeDelta sample, TimeDelta min, TimeDelta max, size_t buckets); BASE_EXPORT void UmaHistogramTimes(const std::string& name, TimeDelta sample); BASE_EXPORT void UmaHistogramTimes(const char* name, TimeDelta sample); BASE_EXPORT void UmaHistogramMediumTimes(const std::string& name, TimeDelta sample); BASE_EXPORT void UmaHistogramMediumTimes(const char* name, TimeDelta sample); BASE_EXPORT void UmaHistogramLongTimes(const std::string& name, TimeDelta sample); BASE_EXPORT void UmaHistogramLongTimes(const char* name, TimeDelta sample); BASE_EXPORT void UmaHistogramLongTimes100(const std::string& name, TimeDelta sample); BASE_EXPORT void UmaHistogramLongTimes100(const char* name, TimeDelta sample); // LINT.ThenChange(/base/metrics/histogram_functions.h:UmaHistogramTimes) // LINT.IfChange(UmaHistogramMicrosecondsTimes) BASE_EXPORT void UmaHistogramCustomMicrosecondsTimes(const std::string& name, TimeDelta sample, TimeDelta min, TimeDelta max, size_t buckets); BASE_EXPORT void UmaHistogramCustomMicrosecondsTimes(const char* name, TimeDelta sample, TimeDelta min, TimeDelta max, size_t buckets); BASE_EXPORT void UmaHistogramMicrosecondsTimes(const std::string& name, TimeDelta sample); BASE_EXPORT void UmaHistogramMicrosecondsTimes(const char* name, TimeDelta sample); // LINT.ThenChange(/base/metrics/histogram_functions.h:UmaHistogramMicrosecondsTimes) // LINT.IfChange(UmaHistogramMemory) BASE_EXPORT void UmaHistogramMemoryKB(const std::string& name, int sample); BASE_EXPORT void UmaHistogramMemoryKB(const char* name, int sample); BASE_EXPORT void UmaHistogramMemoryMB(const std::string& name, int sample); BASE_EXPORT void UmaHistogramMemoryMB(const char* name, int sample); BASE_EXPORT void UmaHistogramMemoryLargeMB(const std::string& name, int sample); BASE_EXPORT void UmaHistogramMemoryLargeMB(const char* name, int sample); // LINT.ThenChange(/base/metrics/histogram_functions.h:UmaHistogramMemory) // LINT.IfChange(UmaHistogramSparse) BASE_EXPORT void UmaHistogramSparse(const std::string& name, int sample); BASE_EXPORT void UmaHistogramSparse(const char* name, int sample); // LINT.ThenChange(/base/metrics/histogram_functions.h:UmaHistogramSparse) } // namespace base #endif // BASE_METRICS_HISTOGRAM_FUNCTIONS_INTERNAL_OVERLOADS_H_