| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_BASE_MEDIA_LOG_TYPE_ENFORCEMENT_H_ |
| #define MEDIA_BASE_MEDIA_LOG_TYPE_ENFORCEMENT_H_ |
| |
| #include "media/base/media_serializers.h" |
| |
| namespace media { |
| |
| namespace internal { |
| enum class UnmatchableType {}; |
| } // namespace internal |
| |
| // Forward declare the enums. |
| enum class MediaLogProperty; |
| enum class MediaLogEvent; |
| |
| // Allow only specific types for an individual property. |
| template <MediaLogProperty PROP, typename T> |
| struct MediaLogPropertyTypeSupport {}; |
| |
| // Allow only specific types for an individual event. |
| // However unlike Property, T is not required, so we default it to some |
| // unmatchable type that will never be passed as an argument accidentally. |
| template <MediaLogEvent EVENT, typename T = internal::UnmatchableType> |
| struct MediaLogEventTypeSupport {}; |
| |
| // Lets us define the supported type in a single line in media_log_properties.h. |
| #define MEDIA_LOG_PROPERTY_SUPPORTS_TYPE(PROPERTY, TYPE) \ |
| template <> \ |
| struct MediaLogPropertyTypeSupport<MediaLogProperty::PROPERTY, TYPE> { \ |
| static base::Value Convert(const TYPE& type) { \ |
| return MediaSerialize<TYPE>(type); \ |
| } \ |
| } |
| |
| #define MEDIA_LOG_EVENT_NAMED_DATA(EVENT, TYPE, DISPLAY) \ |
| template <> \ |
| struct MediaLogEventTypeSupport<MediaLogEvent::EVENT, TYPE> { \ |
| static void AddExtraData(base::Value* params, const TYPE& t) { \ |
| DCHECK(params); \ |
| params->SetKey(DISPLAY, MediaSerialize<TYPE>(t)); \ |
| } \ |
| static std::string TypeName() { return #EVENT; } \ |
| } |
| |
| #define MEDIA_LOG_EVENT_NAMED_DATA_OP(EVENT, TYPE, DISPLAY, OP) \ |
| template <> \ |
| struct MediaLogEventTypeSupport<MediaLogEvent::EVENT, TYPE> { \ |
| static void AddExtraData(base::Value* params, const TYPE& t) { \ |
| DCHECK(params); \ |
| params->SetKey(DISPLAY, MediaSerialize<TYPE>(OP(t))); \ |
| } \ |
| static std::string TypeName() { return #EVENT; } \ |
| } |
| |
| // Specifically do not create the Convert or DisplayName methods |
| #define MEDIA_LOG_EVENT_TYPELESS(EVENT) \ |
| template <> \ |
| struct MediaLogEventTypeSupport<MediaLogEvent::EVENT> { \ |
| static std::string TypeName() { return #EVENT; } \ |
| static void AddExtraData(base::Value* params) {} \ |
| } |
| |
| } // namespace media |
| |
| #endif // MEDIA_BASE_MEDIA_LOG_TYPE_ENFORCEMENT_H_ |