| // Copyright 2016 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #pragma once |
| |
| #include <type_traits> |
| #include <utility> |
| |
| namespace fbl { |
| namespace tests { |
| namespace intrusive_containers { |
| |
| // ContainerUtils |
| // |
| // A utility class used by container tests to move a pointer to an object into |
| // an instance of the container being tested. For sequenced containers, the |
| // operation will be push_front(). For associative containers, the operation |
| // will be an insert() by key. |
| template <typename ContainerType, typename Enable = void> |
| struct ContainerUtils; |
| |
| template <typename ContainerType> |
| struct ContainerUtils<ContainerType, |
| typename std::enable_if<ContainerType::IsSequenced, void>::type> { |
| using PtrTraits = typename ContainerType::PtrTraits; |
| using PtrType = typename PtrTraits::PtrType; |
| |
| static void MoveInto(ContainerType& container, PtrType&& ptr) { |
| container.push_front(std::move(ptr)); |
| } |
| }; |
| |
| template <typename ContainerType> |
| struct ContainerUtils<ContainerType, |
| typename std::enable_if<ContainerType::IsAssociative, void>::type> { |
| using PtrTraits = typename ContainerType::PtrTraits; |
| using PtrType = typename PtrTraits::PtrType; |
| |
| static void MoveInto(ContainerType& container, PtrType&& ptr) { |
| container.insert(std::move(ptr)); |
| } |
| }; |
| |
| template <typename ContainerType, typename Enable = void> |
| struct SizeUtils; |
| |
| template <typename ContainerType> |
| struct SizeUtils<ContainerType, typename std::enable_if< |
| ContainerType::SupportsConstantOrderSize == true, void>::type> { |
| static size_t size(const ContainerType& container) { return container.size(); } |
| }; |
| |
| template <typename ContainerType> |
| struct SizeUtils< |
| ContainerType, |
| typename std::enable_if<ContainerType::SupportsConstantOrderSize == false, void>::type> { |
| static size_t size(const ContainerType& container) { return container.size_slow(); } |
| }; |
| |
| } // namespace intrusive_containers |
| } // namespace tests |
| } // namespace fbl |