// 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/contiguous_iterator.h" #include #include #include #include #include #include #include #include #include #include #include "base/containers/span.h" #include "base/strings/string_piece.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { TEST(ContiguousIteratorTest, ForwardIterator) { using ForwardIterator = std::forward_list::iterator; static_assert(std::is_same::iterator_category>::value, "Error: The iterator_category of ForwardIterator is not " "std::forward_iterator_tag."); static_assert( !IsContiguousIterator::value, "Error: ForwardIterator should not be considered a contiguous iterator."); static_assert(!IsContiguousIterator::value, "Error: const ForwardIterator should not be considered a " "contiguous iterator."); static_assert(!IsContiguousIterator::value, "Error: ForwardIterator& should not be considered a contiguous " "iterator."); static_assert(!IsContiguousIterator::value, "Error: const ForwardIterator& should not be considered a " "contiguous iterator."); } TEST(ContiguousIteratorTest, BidirectionalIterator) { using BidirectionalIterator = std::set::iterator; static_assert( std::is_same::iterator_category>::value, "Error: The iterator_category of BidirectionalIterator is not " "std::bidirectional_iterator_tag."); static_assert(!IsContiguousIterator::value, "Error: BidirectionalIterator should not be considered a " "contiguous iterator."); static_assert(!IsContiguousIterator::value, "Error: const BidirectionalIterator should not be considered a " "contiguous iterator."); static_assert(!IsContiguousIterator::value, "Error: BidirectionalIterator& should not be considered a " "contiguous iterator."); static_assert(!IsContiguousIterator::value, "Error: const BidirectionalIterator& should not be considered " "a contiguous iterator."); static_assert(!IsContiguousIterator< std::reverse_iterator>::value, "Error: A reverse BidirectionalIterator should not be " "considered a contiguous iterator."); } TEST(ContiguousIteratorTest, RandomAccessIterator) { using RandomAccessIterator = std::deque::iterator; static_assert( std::is_same::iterator_category>::value, "Error: The iterator_category of RandomAccessIterator is not " "std::random_access_iterator_tag."); static_assert(!IsContiguousIterator::value, "Error: RandomAccessIterator should not be considered a " "contiguous iterator."); static_assert(!IsContiguousIterator::value, "Error: const RandomAccessIterator should not be considered a " "contiguous iterator."); static_assert(!IsContiguousIterator::value, "Error: RandomAccessIterator& should not be considered a " "contiguous iterator."); static_assert(!IsContiguousIterator::value, "Error: const RandomAccessIterator& should not be considered " "a contiguous iterator."); static_assert( !IsContiguousIterator>::value, "Error: A reverse RandomAccessIterator should not be " "considered a contiguous iterator."); } TEST(ContiguousIterator, Pointer) { static_assert(IsContiguousIterator::value, "Error: int* should be considered a contiguous iterator."); static_assert( IsContiguousIterator::value, "Error: int* const should be considered a contiguous iterator."); static_assert(!IsContiguousIterator::value, "Error: A function pointer should not be considered a " "contiguous iterator."); } TEST(ContiguousIterator, VectorInt) { static_assert(IsContiguousIterator::iterator>::value, "Error: std::vector::iterator should be considered a " "contiguous iterator."); static_assert(IsContiguousIterator::const_iterator>::value, "Error: std::vector::const_iterator should be considered " "a contiguous iterator."); static_assert( !IsContiguousIterator::reverse_iterator>::value, "Error: std::vector::reverse_iterator should not be considered a " "contiguous iterator."); static_assert( !IsContiguousIterator::const_reverse_iterator>::value, "Error: std::vector::const_reverse_iterator should not be " "considered a contiguous iterator."); } TEST(ContiguousIterator, VectorString) { static_assert(IsContiguousIterator::iterator>::value, "Error: std::vector::iterator should be " "considered a contiguous iterator."); static_assert( IsContiguousIterator::const_iterator>::value, "Error: std::vector::const_iterator should be considered a " "contiguous iterator."); static_assert( !IsContiguousIterator::reverse_iterator>::value, "Error: std::vector::reverse_iterator should not be " "considered a contiguous iterator."); static_assert(!IsContiguousIterator< std::vector::const_reverse_iterator>::value, "Error: std::vector::const_reverse_iterator " "should not be considered a contiguous iterator."); } TEST(ContiguousIterator, VectorBool) { static_assert(!IsContiguousIterator::iterator>::value, "Error: std::vector::iterator should not be considered " "a contiguous iterator."); static_assert(!IsContiguousIterator::const_iterator>::value, "Error: std::vector::const_iterator should not be " "considered a contiguous iterator."); static_assert( !IsContiguousIterator::reverse_iterator>::value, "Error: std::vector::reverse_iterator should not be considered a " "contiguous iterator."); static_assert( !IsContiguousIterator::const_reverse_iterator>::value, "Error: std::vector::const_reverse_iterator should not be " "considered a contiguous iterator."); } TEST(ContiguousIterator, ArrayInt) { static_assert(IsContiguousIterator::iterator>::value, "Error: std::array::iterator should be considered a " "contiguous iterator."); static_assert(IsContiguousIterator::const_iterator>::value, "Error: std::array::const_iterator should be " "considered a contiguous iterator."); static_assert( !IsContiguousIterator::reverse_iterator>::value, "Error: std::array::reverse_iterator should not be considered " "a contiguous iterator."); static_assert( !IsContiguousIterator::const_reverse_iterator>::value, "Error: std::array::const_reverse_iterator should not be " "considered a contiguous iterator."); } TEST(ContiguousIterator, ArrayString) { static_assert( IsContiguousIterator::iterator>::value, "Error: std::array::iterator should be considered a " "contiguous iterator."); static_assert( IsContiguousIterator::const_iterator>::value, "Error: std::array::const_iterator should be considered " "a contiguous iterator."); static_assert(!IsContiguousIterator< std::array::reverse_iterator>::value, "Error: std::array::reverse_iterator should " "not be considered a contiguous iterator."); static_assert(!IsContiguousIterator< std::array::const_reverse_iterator>::value, "Error: std::array::const_reverse_iterator " "should not be considered a contiguous iterator."); } TEST(ContiguousIterator, String) { static_assert(IsContiguousIterator::value, "Error: std::string:iterator should be considered a contiguous" "iterator."); static_assert(IsContiguousIterator::value, "Error: std::string::const_iterator should be considered a " "contiguous iterator."); static_assert(!IsContiguousIterator::value, "Error: std::string::reverse_iterator should not be considered " "a contiguous iterator."); static_assert( !IsContiguousIterator::value, "Error: std::string::const_reverse_iterator should not be considered " "a contiguous iterator."); } TEST(ContiguousIterator, String16) { static_assert(IsContiguousIterator::value, "Error: std::u16string:iterator should be considered a " "contiguous iterator."); static_assert(IsContiguousIterator::value, "Error: std::u16string::const_iterator should be considered a " "contiguous iterator."); static_assert(!IsContiguousIterator::value, "Error: std::u16string::reverse_iterator should not be " "considered a contiguous iterator."); static_assert( !IsContiguousIterator::value, "Error: std::u16string::const_reverse_iterator should not be considered a" "contiguous iterator."); } TEST(ContiguousIterator, ValarrayInt) { static_assert(IsContiguousIterator&>()))>::value, "Error: std::valarray::iterator should be considered a " "contiguous iterator."); static_assert( IsContiguousIterator&>()))>::value, "Error: std::valarray::const_iterator should be considered a " "contiguous iterator."); } TEST(ContiguousIterator, ValarrayString) { static_assert(IsContiguousIterator&>()))>::value, "Error: std::valarray::iterator should be " "considered a contiguous iterator."); static_assert(IsContiguousIterator&>()))>::value, "Error: std::valarray::const_iterator should be " "considered a contiguous iterator."); } TEST(ContiguousIterator, StringPiece) { static_assert( IsContiguousIterator::value, "Error: base::StringPiece::const_iterator should be considered a " "contiguous iterator."); static_assert( !IsContiguousIterator::value, "Error: base::StringPiece::const_reverse_iterator should not be " "considered a contiguous iterator."); } TEST(ContiguousIterator, SpanInt) { static_assert(IsContiguousIterator::iterator>::value, "Error: base::span::iterator should be considered a " "contiguous iterator."); static_assert(!IsContiguousIterator::reverse_iterator>::value, "Error: base::span::reverse_iterator should not be " "considered a contiguous iterator."); } TEST(ContiguousIterator, SpanString) { static_assert(IsContiguousIterator::iterator>::value, "Error: base::span::iterator should be considered " "a contiguous iterator."); static_assert( !IsContiguousIterator::reverse_iterator>::value, "Error: base::span::reverse_iterator should not be " "considered a contiguous iterator."); } } // namespace base