1b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania/* 2b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * Copyright (C) 2009 The Android Open Source Project 3b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * All rights reserved. 4b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * 5b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * Redistribution and use in source and binary forms, with or without 6b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * modification, are permitted provided that the following conditions 7b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * are met: 8b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * * Redistributions of source code must retain the above copyright 9b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * notice, this list of conditions and the following disclaimer. 10b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * * Redistributions in binary form must reproduce the above copyright 11b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * notice, this list of conditions and the following disclaimer in 12b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * the documentation and/or other materials provided with the 13b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * distribution. 14b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * 15b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania * SUCH DAMAGE. 27b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania */ 28b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 29b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania#include "../include/iterator" 30b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania#ifndef ANDROID_ASTL_ITERATOR__ 31b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania#error "Wrong header included!!" 32b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania#endif 33b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania#include "common.h" 34b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 35b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catanianamespace android { 36b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 37b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania// Iterators used in tests. 38b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniastruct Input { 39b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef std::input_iterator_tag iterator_category; 40b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef int value_type; 41b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef ptrdiff_t difference_type; 42b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef int* pointer; 43b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef int& reference; 44b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania}; 45b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 46b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniastruct Forward { 47b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef std::forward_iterator_tag iterator_category; 48b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef int value_type; 49b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef ptrdiff_t difference_type; 50b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef int* pointer; 51b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef int& reference; 52b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania}; 53b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 54b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniastruct Bidirectional { 55b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef std::bidirectional_iterator_tag iterator_category; 56b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef int value_type; 57b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef ptrdiff_t difference_type; 58b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef int* pointer; 59b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef int& reference; 60b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania}; 61b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 62b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniastruct Random { 63b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef std::random_access_iterator_tag iterator_category; 64b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef int value_type; 65b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef ptrdiff_t difference_type; 66b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef int* pointer; 67b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania typedef int& reference; 68b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania}; 69b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 70b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania// Enum and helper functions to map an iterator tag to an int. 71b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniaenum Category {UNKNOWN, INPUT, FORWARD, BIDIRECTIONAL, RANDOM}; 72b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 73b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniatemplate<typename _Category> 74b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas CataniaCategory category(_Category) { 75b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania return UNKNOWN; 76b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania} 77b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 78b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniatemplate<> 79b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas CataniaCategory 80b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniacategory<std::input_iterator_tag>(std::input_iterator_tag) { 81b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania return INPUT; 82b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania} 83b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 84b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniatemplate<> 85b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas CataniaCategory 86b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniacategory<std::forward_iterator_tag>(std::forward_iterator_tag) { 87b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania return FORWARD; 88b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania} 89b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 90b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniatemplate<> 91b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas CataniaCategory 92b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniacategory<std::bidirectional_iterator_tag>(std::bidirectional_iterator_tag) { 93b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania return BIDIRECTIONAL; 94b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania} 95b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 96b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniatemplate<> 97b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas CataniaCategory 98b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniacategory<std::random_access_iterator_tag>(std::random_access_iterator_tag) { 99b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania return RANDOM; 100b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania} 101b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 102b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania// Check if the custom method to get the category works as expected. 103b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniabool testCategory() 104b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania{ 105b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania EXPECT_TRUE(category(android::iterator_category(Input())) == INPUT); 106b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania EXPECT_TRUE(category(android::iterator_category(Forward())) == FORWARD); 107b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania EXPECT_TRUE(category(android::iterator_category(Bidirectional())) == BIDIRECTIONAL); 108b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania EXPECT_TRUE(category(android::iterator_category(Random())) == RANDOM); 109b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania return true; 110b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania} 111b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 1126943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Cataniatypedef std::__wrapper_iterator<int *, int *> WrapperIterator; 1136943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania 1146943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania// Check we can distinguish wrapper iterators. 1156943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Cataniabool testWrapperIterator() 1166943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania{ 1176943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania EXPECT_FALSE(android::is_wrapper_iterator<android::Random>::value); 1186943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania EXPECT_TRUE(android::is_wrapper_iterator<android::WrapperIterator>::value); 1196943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania return true; 1206943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania} 1216943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania 122b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania} // namespace android 123b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania 124b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Cataniaint main(int argc, char **argv) 125b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania{ 126b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania FAIL_UNLESS(testCategory); 1276943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania FAIL_UNLESS(testWrapperIterator); 128b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania return kPassed; 129b6e436eb559cdcf43e21f6617dc0a3d90c7b89b6Nicolas Catania} 130