diff options
author | Eric Fiselier <eric@efcs.ca> | 2014-12-20 01:40:03 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2014-12-20 01:40:03 +0000 |
commit | 5a83710e371fe68a06e6e3876c6a2c8b820a8976 (patch) | |
tree | afde4c82ad6704681781c5cd49baa3fbd05c85db /libcxx/test/std/iterators/iterator.primitives | |
parent | f11e8eab527fba316c64112f6e05de1a79693a3e (diff) | |
download | bcm5719-llvm-5a83710e371fe68a06e6e3876c6a2c8b820a8976.tar.gz bcm5719-llvm-5a83710e371fe68a06e6e3876c6a2c8b820a8976.zip |
Move test into test/std subdirectory.
llvm-svn: 224658
Diffstat (limited to 'libcxx/test/std/iterators/iterator.primitives')
15 files changed, 536 insertions, 0 deletions
diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp new file mode 100644 index 00000000000..26d5c866028 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp @@ -0,0 +1,82 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template<class Category, class T, class Distance = ptrdiff_t, +// class Pointer = T*, class Reference = T&> +// struct iterator +// { +// typedef T value_type; +// typedef Distance difference_type; +// typedef Pointer pointer; +// typedef Reference reference; +// typedef Category iterator_category; +// }; + +#include <iterator> +#include <type_traits> + +struct A {}; + +template <class T> +void +test2() +{ + typedef std::iterator<std::forward_iterator_tag, T> It; + static_assert((std::is_same<typename It::value_type, T>::value), ""); + static_assert((std::is_same<typename It::difference_type, std::ptrdiff_t>::value), ""); + static_assert((std::is_same<typename It::pointer, T*>::value), ""); + static_assert((std::is_same<typename It::reference, T&>::value), ""); + static_assert((std::is_same<typename It::iterator_category, std::forward_iterator_tag>::value), ""); +} + +template <class T> +void +test3() +{ + typedef std::iterator<std::bidirectional_iterator_tag, T, short> It; + static_assert((std::is_same<typename It::value_type, T>::value), ""); + static_assert((std::is_same<typename It::difference_type, short>::value), ""); + static_assert((std::is_same<typename It::pointer, T*>::value), ""); + static_assert((std::is_same<typename It::reference, T&>::value), ""); + static_assert((std::is_same<typename It::iterator_category, std::bidirectional_iterator_tag>::value), ""); +} + +template <class T> +void +test4() +{ + typedef std::iterator<std::random_access_iterator_tag, T, int, const T*> It; + static_assert((std::is_same<typename It::value_type, T>::value), ""); + static_assert((std::is_same<typename It::difference_type, int>::value), ""); + static_assert((std::is_same<typename It::pointer, const T*>::value), ""); + static_assert((std::is_same<typename It::reference, T&>::value), ""); + static_assert((std::is_same<typename It::iterator_category, std::random_access_iterator_tag>::value), ""); +} + +template <class T> +void +test5() +{ + typedef std::iterator<std::input_iterator_tag, T, long, const T*, const T&> It; + static_assert((std::is_same<typename It::value_type, T>::value), ""); + static_assert((std::is_same<typename It::difference_type, long>::value), ""); + static_assert((std::is_same<typename It::pointer, const T*>::value), ""); + static_assert((std::is_same<typename It::reference, const T&>::value), ""); + static_assert((std::is_same<typename It::iterator_category, std::input_iterator_tag>::value), ""); +} + +int main() +{ + test2<A>(); + test3<A>(); + test4<A>(); + test5<A>(); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp new file mode 100644 index 00000000000..e395da299dc --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <InputIterator Iter> +// void advance(Iter& i, Iter::difference_type n); +// +// template <BidirectionalIterator Iter> +// void advance(Iter& i, Iter::difference_type n); +// +// template <RandomAccessIterator Iter> +// void advance(Iter& i, Iter::difference_type n); + +#include <iterator> +#include <cassert> + +#include "test_iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + std::advance(i, n); + assert(i == x); +} + +int main() +{ + const char* s = "1234567890"; + test(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10)); + test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10)); + test(bidirectional_iterator<const char*>(s+5), 5, bidirectional_iterator<const char*>(s+10)); + test(bidirectional_iterator<const char*>(s+5), -5, bidirectional_iterator<const char*>(s)); + test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10)); + test(random_access_iterator<const char*>(s+5), -5, random_access_iterator<const char*>(s)); + test(s+5, 5, s+10); + test(s+5, -5, s); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/distance.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/distance.pass.cpp new file mode 100644 index 00000000000..7fef635838c --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/distance.pass.cpp @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <InputIterator Iter> +// Iter::difference_type +// distance(Iter first, Iter last); +// +// template <RandomAccessIterator Iter> +// Iter::difference_type +// distance(Iter first, Iter last); + +#include <iterator> +#include <cassert> + +#include "test_iterators.h" + +template <class It> +void +test(It first, It last, typename std::iterator_traits<It>::difference_type x) +{ + assert(std::distance(first, last) == x); +} + +int main() +{ + const char* s = "1234567890"; + test(input_iterator<const char*>(s), input_iterator<const char*>(s+10), 10); + test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+10), 10); + test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+10), 10); + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+10), 10); + test(s, s+10, 10); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp new file mode 100644 index 00000000000..f584110499b --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <InputIterator Iter> +// Iter next(Iter x, Iter::difference_type n = 1); + +#include <iterator> +#include <cassert> + +#include "test_iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + assert(std::next(i, n) == x); +} + +template <class It> +void +test(It i, It x) +{ + assert(std::next(i) == x); +} + +int main() +{ + const char* s = "1234567890"; + test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10)); + test(bidirectional_iterator<const char*>(s), 10, bidirectional_iterator<const char*>(s+10)); + test(random_access_iterator<const char*>(s), 10, random_access_iterator<const char*>(s+10)); + test(s, 10, s+10); + + test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+1)); + test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1)); + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1)); + test(s, s+1); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp new file mode 100644 index 00000000000..0641706c928 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <BidirectionalIterator Iter> +// Iter prev(Iter x, Iter::difference_type n = 1); + +#include <iterator> +#include <cassert> + +#include "test_iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + assert(std::prev(i, n) == x); +} + +template <class It> +void +test(It i, It x) +{ + assert(std::prev(i) == x); +} + +int main() +{ + const char* s = "1234567890"; + test(bidirectional_iterator<const char*>(s+10), 10, bidirectional_iterator<const char*>(s)); + test(random_access_iterator<const char*>(s+10), 10, random_access_iterator<const char*>(s)); + test(s+10, 10, s); + + test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s)); + test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s)); + test(s+1, s); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.traits/const_pointer.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/const_pointer.pass.cpp new file mode 100644 index 00000000000..f40754fd9da --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/const_pointer.pass.cpp @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template<class T> +// struct iterator_traits<const T*> +// { +// typedef ptrdiff_t difference_type; +// typedef T value_type; +// typedef const T* pointer; +// typedef const T& reference; +// typedef random_access_iterator_tag iterator_category; +// }; + +#include <iterator> +#include <type_traits> + +struct A {}; + +int main() +{ + typedef std::iterator_traits<const A*> It; + static_assert((std::is_same<It::difference_type, std::ptrdiff_t>::value), ""); + static_assert((std::is_same<It::value_type, A>::value), ""); + static_assert((std::is_same<It::pointer, const A*>::value), ""); + static_assert((std::is_same<It::reference, const A&>::value), ""); + static_assert((std::is_same<It::iterator_category, std::random_access_iterator_tag>::value), ""); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.traits/empty.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/empty.pass.cpp new file mode 100644 index 00000000000..e48e44b3777 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/empty.pass.cpp @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template<class NotAnIterator> +// struct iterator_traits +// { +// }; + +#include <iterator> + +struct not_an_iterator +{ +}; + +template <class _Tp> +struct has_value_type +{ +private: + struct two {char lx; char lxx;}; + template <class _Up> static two test(...); + template <class _Up> static char test(typename _Up::value_type* = 0); +public: + static const bool value = sizeof(test<_Tp>(0)) == 1; +}; + +int main() +{ + typedef std::iterator_traits<not_an_iterator> It; + static_assert(!(has_value_type<It>::value), ""); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp new file mode 100644 index 00000000000..38f7c0b6b83 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template<class Iter> +// struct iterator_traits +// { +// typedef typename Iter::difference_type difference_type; +// typedef typename Iter::value_type value_type; +// typedef typename Iter::pointer pointer; +// typedef typename Iter::reference reference; +// typedef typename Iter::iterator_category iterator_category; +// }; + +#include <iterator> +#include <type_traits> + +struct A {}; + +struct test_iterator +{ + typedef int difference_type; + typedef A value_type; + typedef A* pointer; + typedef A& reference; + typedef std::forward_iterator_tag iterator_category; +}; + +int main() +{ + typedef std::iterator_traits<test_iterator> It; + static_assert((std::is_same<It::difference_type, int>::value), ""); + static_assert((std::is_same<It::value_type, A>::value), ""); + static_assert((std::is_same<It::pointer, A*>::value), ""); + static_assert((std::is_same<It::iterator_category, std::forward_iterator_tag>::value), ""); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.traits/pointer.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/pointer.pass.cpp new file mode 100644 index 00000000000..5a8fe60774e --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/pointer.pass.cpp @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template<class T> +// struct iterator_traits<T*> +// { +// typedef ptrdiff_t difference_type; +// typedef T value_type; +// typedef T* pointer; +// typedef T& reference; +// typedef random_access_iterator_tag iterator_category; +// }; + +#include <iterator> +#include <type_traits> + +struct A {}; + +int main() +{ + typedef std::iterator_traits<A*> It; + static_assert((std::is_same<It::difference_type, std::ptrdiff_t>::value), ""); + static_assert((std::is_same<It::value_type, A>::value), ""); + static_assert((std::is_same<It::pointer, A*>::value), ""); + static_assert((std::is_same<It::reference, A&>::value), ""); + static_assert((std::is_same<It::iterator_category, std::random_access_iterator_tag>::value), ""); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/nothing_to_do.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..b58f5c55b64 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/bidirectional_iterator_tag.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/bidirectional_iterator_tag.pass.cpp new file mode 100644 index 00000000000..0f368c3b765 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/bidirectional_iterator_tag.pass.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// struct bidirectional_iterator_tag : public forward_iterator_tag {}; + +#include <iterator> +#include <type_traits> + +int main() +{ + std::bidirectional_iterator_tag tag; + static_assert((std::is_base_of<std::forward_iterator_tag, + std::bidirectional_iterator_tag>::value), ""); + static_assert((!std::is_base_of<std::output_iterator_tag, + std::bidirectional_iterator_tag>::value), ""); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/forward_iterator_tag.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/forward_iterator_tag.pass.cpp new file mode 100644 index 00000000000..0936595c85d --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/forward_iterator_tag.pass.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// struct forward_iterator_tag: public input_iterator_tag {}; + +#include <iterator> +#include <type_traits> + +int main() +{ + std::forward_iterator_tag tag; + static_assert((std::is_base_of<std::input_iterator_tag, + std::forward_iterator_tag>::value), ""); + static_assert((!std::is_base_of<std::output_iterator_tag, + std::forward_iterator_tag>::value), ""); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/input_iterator_tag.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/input_iterator_tag.pass.cpp new file mode 100644 index 00000000000..afeac3e91ca --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/input_iterator_tag.pass.cpp @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// struct input_iterator_tag {}; + +#include <iterator> +#include <type_traits> + +int main() +{ + std::input_iterator_tag tag; + static_assert((!std::is_base_of<std::output_iterator_tag, + std::input_iterator_tag>::value), ""); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/output_iterator_tag.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/output_iterator_tag.pass.cpp new file mode 100644 index 00000000000..7f7f66a98f4 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/output_iterator_tag.pass.cpp @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// struct output_iterator_tag {}; + +#include <iterator> +#include <type_traits> + +int main() +{ + std::output_iterator_tag tag; + static_assert((!std::is_base_of<std::input_iterator_tag, + std::output_iterator_tag>::value), ""); +} diff --git a/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/random_access_iterator_tag.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/random_access_iterator_tag.pass.cpp new file mode 100644 index 00000000000..04f830bc310 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/std.iterator.tags/random_access_iterator_tag.pass.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// struct random_access_iterator_tag : public bidirectional_iterator_tag {}; + +#include <iterator> +#include <type_traits> + +int main() +{ + std::random_access_iterator_tag tag; + static_assert((std::is_base_of<std::bidirectional_iterator_tag, + std::random_access_iterator_tag>::value), ""); + static_assert((!std::is_base_of<std::output_iterator_tag, + std::random_access_iterator_tag>::value), ""); +} |