| // Copyright (c) 2018 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 BASE_TASK_TEST_TASK_TRAITS_EXTENSION_H_ |
| #define BASE_TASK_TEST_TASK_TRAITS_EXTENSION_H_ |
| |
| #include <utility> |
| |
| #include "base/cpp14oncpp11.h" |
| #include "base/task/task_traits.h" |
| |
| namespace base { |
| |
| enum class TestExtensionEnumTrait { kA, kB, kC }; |
| struct TestExtensionBoolTrait {}; |
| |
| // Example TaskTraits extension for use in tests. |
| class TestTaskTraitsExtension { |
| public: |
| static constexpr uint8_t kExtensionId = |
| TaskTraitsExtensionStorage::kFirstEmbedderExtensionId; |
| |
| struct ValidTrait : public TaskTraits::ValidTrait { |
| using TaskTraits::ValidTrait::ValidTrait; |
| |
| ValidTrait(TestExtensionEnumTrait); |
| ValidTrait(TestExtensionBoolTrait); |
| }; |
| |
| using TestExtensionEnumFilter = |
| trait_helpers::EnumTraitFilter<TestExtensionEnumTrait, |
| TestExtensionEnumTrait::kA>; |
| using TestExtensionBoolFilter = |
| trait_helpers::BooleanTraitFilter<TestExtensionBoolTrait>; |
| |
| template <class... ArgTypes, |
| class CheckArgumentsAreValid = trait_helpers::InitTypes< |
| decltype(ValidTrait(std::declval<ArgTypes>()))...>> |
| constexpr TestTaskTraitsExtension(ArgTypes... args) |
| : enum_trait_(trait_helpers::GetTraitFromArgList<TestExtensionEnumFilter>( |
| args...)), |
| bool_trait_(trait_helpers::GetTraitFromArgList<TestExtensionBoolFilter>( |
| args...)) {} |
| |
| CONSTEXPR TaskTraitsExtensionStorage Serialize() const { |
| return {kExtensionId, {{static_cast<uint8_t>(enum_trait_), bool_trait_}}}; |
| } |
| |
| static const TestTaskTraitsExtension Parse( |
| const TaskTraitsExtensionStorage& extension) { |
| if (extension.data[1]) { |
| return TestTaskTraitsExtension( |
| static_cast<TestExtensionEnumTrait>(extension.data[0]), |
| TestExtensionBoolTrait()); |
| } else { |
| return TestTaskTraitsExtension( |
| static_cast<TestExtensionEnumTrait>(extension.data[0])); |
| } |
| } |
| |
| constexpr TestExtensionEnumTrait enum_trait() const { return enum_trait_; } |
| constexpr bool bool_trait() const { return bool_trait_; } |
| |
| private: |
| TestExtensionEnumTrait enum_trait_; |
| bool bool_trait_; |
| }; |
| |
| template <class... ArgTypes, |
| class CheckArgumentsAreValid = trait_helpers::InitTypes< |
| decltype(ValidTrait(std::declval<ArgTypes>()))...>> |
| constexpr TaskTraitsExtensionStorage MakeTaskTraitsExtension(ArgTypes... args) { |
| return TestTaskTraitsExtension(std::forward<ArgTypes>(args)...).Serialize(); |
| } |
| |
| } // namespace base |
| |
| #endif // BASE_TASK_TEST_TASK_TRAITS_EXTENSION_H_ |