// Copyright (c) 2023 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include <algorithm> #include <cassert> #include <cstdint> #include <functional> #include <initializer_list> #include <limits> #include <type_traits> #include <vector> #ifndef SOURCE_ENUM_SET_H_ #define SOURCE_ENUM_SET_H_ #include "source/latest_version_spirv_header.h" namespace spvtools { // This container is optimized to store and retrieve unsigned enum values. // The base model for this implementation is an open-addressing hashtable with // linear probing. For small enums (max index < 64), all operations are O(1). // // - Enums are stored in buckets (64 contiguous values max per bucket) // - Buckets ranges don't overlap, but don't have to be contiguous. // - Enums are packed into 64-bits buckets, using 1 bit per enum value. // // Example: // - MyEnum { A = 0, B = 1, C = 64, D = 65 } // - 2 buckets are required: // - bucket 0, storing values in the range [ 0; 64[ // - bucket 1, storing values in the range [64; 128[ // // - Buckets are stored in a sorted vector (sorted by bucket range). // - Retrieval is done by computing the theoretical bucket index using the enum // value, and // doing a linear scan from this position. // - Insertion is done by retrieving the bucket and either: // - inserting a new bucket in the sorted vector when no buckets has a // compatible range. // - setting the corresponding bit in the bucket. // This means insertion in the middle/beginning can cause a memmove when no // bucket is available. In our case, this happens at most 23 times for the // largest enum we have (Opcodes). template <typename T> class EnumSet { … }; // A set of spv::Capability. CapabilitySet; } // namespace spvtools #endif // SOURCE_ENUM_SET_H_