// Copyright 2020 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/containers/checked_iterators.h" #include <algorithm> #include <iterator> #include "base/check_op.h" #include "base/debug/alias.h" #include "base/ranges/algorithm.h" #include "base/test/gtest_util.h" #include "build/build_config.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { TEST(CheckedContiguousIterator, SatisfiesContiguousIteratorConcept) { … } template <class T, size_t N> constexpr CheckedContiguousConstIterator<T> MakeConstIter(T (&arr)[N], size_t cur) { … } template <class T, size_t N> constexpr CheckedContiguousIterator<T> MakeIter(T (&arr)[N], size_t cur) { … } // Checks that constexpr CheckedContiguousConstIterators can be compared at // compile time. TEST(CheckedContiguousIterator, StaticComparisonOperators) { … } // Checks that comparison between iterators and const iterators works in both // directions. TEST(CheckedContiguousIterator, ConvertingComparisonOperators) { … } TEST(CheckedContiguousIteratorDeathTest, OutOfBounds) { … } } // namespace base namespace { // Helper template that wraps an iterator and disables its dereference and // increment operations. template <typename Iterator> struct DisableDerefAndIncr : Iterator { … }; } // namespace // Inherit `pointer_traits` specialization from the base class. pointer_traits<DisableDerefAndIncr<Iter>>; namespace base { // Tests that using std::copy with CheckedContiguousIterator<int> results in an // optimized code-path that does not invoke the iterator's dereference and // increment operations, as expected in libc++. This fails to compile if // std::copy is not optimized. // NOTE: This test relies on implementation details of the STL and thus might // break in the future during a libc++ roll. If this does happen, please reach // out to [email protected] to reevaluate whether this test will // still be needed. #if defined(_LIBCPP_VERSION) TEST(CheckedContiguousIterator, OptimizedCopy) { … } #endif // defined(_LIBCPP_VERSION) } // namespace base