// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This header provides a type-safe way of storing OR-combinations of enum // values. // // The traditional C++ approach for storing OR-combinations of enum values is to // use an int or unsigned int variable. The inconvenience with this approach is // that there's no type checking at all; any enum value can be OR'd with any // other enum value and passed on to a function that takes an int or unsigned // int. #ifndef PARTITION_ALLOC_FLAGS_H_ #define PARTITION_ALLOC_FLAGS_H_ #include <type_traits> namespace partition_alloc::internal { // Returns `T` if and only if `EnumType` is a scoped enum. IfEnum; // We assume `EnumType` defines `kMaxValue` which has the largest value and all // powers of two are represented in `EnumType`. kAllFlags; template <typename EnumType> constexpr inline IfEnum<EnumType, bool> AreValidFlags(EnumType flags) { … } // Checks `subset` is a subset of `superset` or not. template <typename EnumType> constexpr inline IfEnum<EnumType, bool> ContainsFlags(EnumType superset, EnumType subset) { … } // A macro to define binary arithmetic over `EnumType`. // Use inside `namespace partition_alloc::internal`. #define PA_DEFINE_OPERATORS_FOR_FLAGS(EnumType) … } // namespace partition_alloc::internal #endif // PARTITION_ALLOC_FLAGS_H_