// Copyright 2020 The Dawn Authors // // 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. #ifndef COMMON_UNDERLYINGTYPE_H_ #define COMMON_UNDERLYINGTYPE_H_ #include // UnderlyingType is similar to std::underlying_type_t. It is a passthrough for already // integer types which simplifies getting the underlying primitive type for an arbitrary // template parameter. It includes a specialization for detail::TypedIntegerImpl which yields // the wrapped integer type. namespace detail { template struct UnderlyingTypeImpl; template struct UnderlyingTypeImpl::value>> { using type = I; }; template struct UnderlyingTypeImpl::value>> { using type = std::underlying_type_t; }; // Forward declare the TypedInteger impl. template class TypedIntegerImpl; template struct UnderlyingTypeImpl> { using type = typename UnderlyingTypeImpl::type; }; } // namespace detail template using UnderlyingType = typename detail::UnderlyingTypeImpl::type; #endif // COMMON_UNDERLYINGTYPE_H_