// Copyright 2018 The Abseil 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 // // https://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 ABSL_CONTAINER_INTERNAL_COMMON_H_ #define ABSL_CONTAINER_INTERNAL_COMMON_H_ #include <cassert> #include <type_traits> #include "absl/meta/type_traits.h" #include "absl/types/optional.h" namespace absl { ABSL_NAMESPACE_BEGIN namespace container_internal { template <class, class = void> struct IsTransparent : std::false_type { … }; IsTransparent<T, absl::void_t<typename T::is_transparent>>; template <bool is_transparent> struct KeyArg { … }; template <> struct KeyArg<false> { … }; // The node_handle concept from C++17. // We specialize node_handle for sets and maps. node_handle_base holds the // common API of both. template <typename PolicyTraits, typename Alloc> class node_handle_base { … }; // For sets. template <typename Policy, typename PolicyTraits, typename Alloc, typename = void> class node_handle : public node_handle_base<PolicyTraits, Alloc> { … }; // For maps. node_handle<Policy, PolicyTraits, Alloc, absl::void_t<typename Policy::mapped_type>>; // Provide access to non-public node-handle functions. struct CommonAccess { … }; // Implement the insert_return_type<> concept of C++17. template <class Iterator, class NodeType> struct InsertReturnType { … }; } // namespace container_internal ABSL_NAMESPACE_END } // namespace absl #endif // ABSL_CONTAINER_INTERNAL_COMMON_H_