diff options
Diffstat (limited to 'libcxx/test/iterators')
164 files changed, 5966 insertions, 0 deletions
diff --git a/libcxx/test/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp new file mode 100644 index 00000000000..848992b3f8e --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp @@ -0,0 +1,82 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. 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/iterators/iterator.primitives/iterator.operations/advance.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.operations/advance.pass.cpp new file mode 100644 index 00000000000..9b5e30c1405 --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/iterator.operations/advance.pass.cpp @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. 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 "../../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/iterators/iterator.primitives/iterator.operations/distance.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.operations/distance.pass.cpp new file mode 100644 index 00000000000..5b7b0cb2941 --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/iterator.operations/distance.pass.cpp @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. 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 "../../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/iterators/iterator.primitives/iterator.operations/next.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.operations/next.pass.cpp new file mode 100644 index 00000000000..4e36eab501b --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/iterator.operations/next.pass.cpp @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <InputIterator Iter> +// Iter next(Iter x, Iter::difference_type n = 1); + +#include <iterator> +#include <cassert> + +#include "../../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/iterators/iterator.primitives/iterator.operations/prev.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.operations/prev.pass.cpp new file mode 100644 index 00000000000..9938a999a76 --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/iterator.operations/prev.pass.cpp @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <BidirectionalIterator Iter> +// Iter prev(Iter x, Iter::difference_type n = 1); + +#include <iterator> +#include <cassert> + +#include "../../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/iterators/iterator.primitives/iterator.traits/const_pointer.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.traits/const_pointer.pass.cpp new file mode 100644 index 00000000000..037db9961c5 --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/iterator.traits/const_pointer.pass.cpp @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. 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/iterators/iterator.primitives/iterator.traits/empty.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.traits/empty.pass.cpp new file mode 100644 index 00000000000..d3bbe5a9158 --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/iterator.traits/empty.pass.cpp @@ -0,0 +1,26 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template<class NotAnIterator> +// struct iterator_traits +// { +// }; + +#include <iterator> + +struct not_an_iterator +{ +}; + +int main() +{ + typedef std::iterator_traits<not_an_iterator> It; +} diff --git a/libcxx/test/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp new file mode 100644 index 00000000000..841b17e0f4d --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. 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/iterators/iterator.primitives/iterator.traits/pointer.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.traits/pointer.pass.cpp new file mode 100644 index 00000000000..9680f46d9f5 --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/iterator.traits/pointer.pass.cpp @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. 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/iterators/iterator.primitives/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.primitives/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/iterator.primitives/std.iterator.tags/bidirectional_iterator_tag.pass.cpp b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/bidirectional_iterator_tag.pass.cpp new file mode 100644 index 00000000000..3d343e38e2b --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/bidirectional_iterator_tag.pass.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. 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/iterators/iterator.primitives/std.iterator.tags/forward_iterator_tag.pass.cpp b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/forward_iterator_tag.pass.cpp new file mode 100644 index 00000000000..bb1b5b78f36 --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/forward_iterator_tag.pass.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. 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/iterators/iterator.primitives/std.iterator.tags/input_iterator_tag.pass.cpp b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/input_iterator_tag.pass.cpp new file mode 100644 index 00000000000..ddbe1b288aa --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/input_iterator_tag.pass.cpp @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. 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/iterators/iterator.primitives/std.iterator.tags/output_iterator_tag.pass.cpp b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/output_iterator_tag.pass.cpp new file mode 100644 index 00000000000..5d75f5b703f --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/output_iterator_tag.pass.cpp @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. 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/iterators/iterator.primitives/std.iterator.tags/random_access_iterator_tag.pass.cpp b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/random_access_iterator_tag.pass.cpp new file mode 100644 index 00000000000..a6ec848ecb6 --- /dev/null +++ b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/random_access_iterator_tag.pass.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. 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), ""); +} diff --git a/libcxx/test/iterators/iterator.requirements/bidirectional.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/bidirectional.iterators/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/iterator.requirements/bidirectional.iterators/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/iterator.requirements/forward.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/forward.iterators/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/iterator.requirements/forward.iterators/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/iterator.requirements/input.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/input.iterators/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/iterator.requirements/input.iterators/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/iterator.requirements/iterator.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/iterator.iterators/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/iterator.requirements/iterator.iterators/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/iterator.requirements/iterator.requirements.general/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/iterator.requirements.general/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/iterator.requirements/iterator.requirements.general/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/iterator.requirements/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/iterator.requirements/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/iterator.requirements/output.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/output.iterators/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/iterator.requirements/output.iterators/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/iterator.requirements/random.access.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/random.access.iterators/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/iterator.requirements/random.access.iterators/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/iterator.synopsis/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.synopsis/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/iterator.synopsis/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/iterators.general/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterators.general/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/iterators.general/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/iterators.h b/libcxx/test/iterators/iterators.h new file mode 100644 index 00000000000..85332ac725d --- /dev/null +++ b/libcxx/test/iterators/iterators.h @@ -0,0 +1,251 @@ +#ifndef ITERATORS_H +#define ITERATORS_H + +#include <iterator> + +template <class It> +class input_iterator +{ + It it_; + + template <class U> friend class input_iterator; +public: + typedef std::input_iterator_tag iterator_category; + typedef typename std::iterator_traits<It>::value_type value_type; + typedef typename std::iterator_traits<It>::difference_type difference_type; + typedef It pointer; + typedef typename std::iterator_traits<It>::reference reference; + + It base() const {return it_;} + + input_iterator() : it_() {} + explicit input_iterator(It it) : it_(it) {} + template <class U> + input_iterator(const input_iterator<U>& u) :it_(u.it_) {} + + reference operator*() const {return *it_;} + pointer operator->() const {return it_;} + + input_iterator& operator++() {++it_; return *this;} + input_iterator operator++(int) + {input_iterator tmp(*this); ++(*this); return tmp;} + + friend bool operator==(const input_iterator& x, const input_iterator& y) + {return x.it_ == y.it_;} + friend bool operator!=(const input_iterator& x, const input_iterator& y) + {return !(x == y);} +}; + +template <class T, class U> +inline +bool +operator==(const input_iterator<T>& x, const input_iterator<U>& y) +{ + return x.base() == y.base(); +} + +template <class T, class U> +inline +bool +operator!=(const input_iterator<T>& x, const input_iterator<U>& y) +{ + return !(x == y); +} + +template <class It> +class forward_iterator +{ + It it_; + + template <class U> friend class forward_iterator; +public: + typedef std::forward_iterator_tag iterator_category; + typedef typename std::iterator_traits<It>::value_type value_type; + typedef typename std::iterator_traits<It>::difference_type difference_type; + typedef It pointer; + typedef typename std::iterator_traits<It>::reference reference; + + It base() const {return it_;} + + forward_iterator() : it_() {} + explicit forward_iterator(It it) : it_(it) {} + template <class U> + forward_iterator(const forward_iterator<U>& u) :it_(u.it_) {} + + reference operator*() const {return *it_;} + pointer operator->() const {return it_;} + + forward_iterator& operator++() {++it_; return *this;} + forward_iterator operator++(int) + {forward_iterator tmp(*this); ++(*this); return tmp;} + + friend bool operator==(const forward_iterator& x, const forward_iterator& y) + {return x.it_ == y.it_;} + friend bool operator!=(const forward_iterator& x, const forward_iterator& y) + {return !(x == y);} +}; + +template <class T, class U> +inline +bool +operator==(const forward_iterator<T>& x, const forward_iterator<U>& y) +{ + return x.base() == y.base(); +} + +template <class T, class U> +inline +bool +operator!=(const forward_iterator<T>& x, const forward_iterator<U>& y) +{ + return !(x == y); +} + +template <class It> +class bidirectional_iterator +{ + It it_; + + template <class U> friend class bidirectional_iterator; +public: + typedef std::bidirectional_iterator_tag iterator_category; + typedef typename std::iterator_traits<It>::value_type value_type; + typedef typename std::iterator_traits<It>::difference_type difference_type; + typedef It pointer; + typedef typename std::iterator_traits<It>::reference reference; + + It base() const {return it_;} + + bidirectional_iterator() : it_() {} + explicit bidirectional_iterator(It it) : it_(it) {} + template <class U> + bidirectional_iterator(const bidirectional_iterator<U>& u) :it_(u.it_) {} + + reference operator*() const {return *it_;} + pointer operator->() const {return it_;} + + bidirectional_iterator& operator++() {++it_; return *this;} + bidirectional_iterator operator++(int) + {bidirectional_iterator tmp(*this); ++(*this); return tmp;} + + bidirectional_iterator& operator--() {--it_; return *this;} + bidirectional_iterator operator--(int) + {bidirectional_iterator tmp(*this); --(*this); return tmp;} +}; + +template <class T, class U> +inline +bool +operator==(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y) +{ + return x.base() == y.base(); +} + +template <class T, class U> +inline +bool +operator!=(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y) +{ + return !(x == y); +} + +template <class It> +class random_access_iterator +{ + It it_; + + template <class U> friend class random_access_iterator; +public: + typedef std::random_access_iterator_tag iterator_category; + typedef typename std::iterator_traits<It>::value_type value_type; + typedef typename std::iterator_traits<It>::difference_type difference_type; + typedef It pointer; + typedef typename std::iterator_traits<It>::reference reference; + + It base() const {return it_;} + + random_access_iterator() : it_() {} + explicit random_access_iterator(It it) : it_(it) {} + template <class U> + random_access_iterator(const random_access_iterator<U>& u) :it_(u.it_) {} + + reference operator*() const {return *it_;} + pointer operator->() const {return it_;} + + random_access_iterator& operator++() {++it_; return *this;} + random_access_iterator operator++(int) + {random_access_iterator tmp(*this); ++(*this); return tmp;} + + random_access_iterator& operator--() {--it_; return *this;} + random_access_iterator operator--(int) + {random_access_iterator tmp(*this); --(*this); return tmp;} + + random_access_iterator& operator+=(difference_type n) {it_ += n; return *this;} + random_access_iterator operator+(difference_type n) const + {random_access_iterator tmp(*this); tmp += n; return tmp;} + friend random_access_iterator operator+(difference_type n, random_access_iterator x) + {x += n; return x;} + random_access_iterator& operator-=(difference_type n) {return *this += -n;} + random_access_iterator operator-(difference_type n) const + {random_access_iterator tmp(*this); tmp -= n; return tmp;} + + reference operator[](difference_type n) const {return it_[n];} +}; + +template <class T, class U> +inline +bool +operator==(const random_access_iterator<T>& x, const random_access_iterator<U>& y) +{ + return x.base() == y.base(); +} + +template <class T, class U> +inline +bool +operator!=(const random_access_iterator<T>& x, const random_access_iterator<U>& y) +{ + return !(x == y); +} + +template <class T, class U> +inline +bool +operator<(const random_access_iterator<T>& x, const random_access_iterator<U>& y) +{ + return x.base() < y.base(); +} + +template <class T, class U> +inline +bool +operator<=(const random_access_iterator<T>& x, const random_access_iterator<U>& y) +{ + return !(y < x); +} + +template <class T, class U> +inline +bool +operator>(const random_access_iterator<T>& x, const random_access_iterator<U>& y) +{ + return y < x; +} + +template <class T, class U> +inline +bool +operator>=(const random_access_iterator<T>& x, const random_access_iterator<U>& y) +{ + return !(x < y); +} + +template <class T, class U> +inline +typename std::iterator_traits<T>::difference_type +operator-(const random_access_iterator<T>& x, const random_access_iterator<U>& y) +{ + return x.base() - y.base(); +} + +#endif diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.fail.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.fail.cpp new file mode 100644 index 00000000000..2e7a56cd1e7 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.fail.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// back_insert_iterator + +// explicit back_insert_iterator(Cont& x); + +// test for explicit + +#include <iterator> +#include <vector> + +int main() +{ + std::back_insert_iterator<std::vector<int> > i = std::vector<int>(); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.pass.cpp new file mode 100644 index 00000000000..f213484141a --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.pass.cpp @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// back_insert_iterator + +// explicit back_insert_iterator(Cont& x); + +#include <iterator> +#include <vector> + +template <class C> +void +test(C c) +{ + std::back_insert_iterator<C> i(c); +} + +int main() +{ + test(std::vector<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/post.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/post.pass.cpp new file mode 100644 index 00000000000..ff95280d024 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/post.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// back_insert_iterator + +// back_insert_iterator<Cont> operator++(int); + +#include <iterator> +#include <vector> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::back_insert_iterator<C> i(c); + std::back_insert_iterator<C> r = i++; + r = 0; + assert(c.size() == 1); + assert(c.back() == 0); +} + +int main() +{ + test(std::vector<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/pre.pass.cpp new file mode 100644 index 00000000000..3e80c6cdc23 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/pre.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// back_insert_iterator + +// back_insert_iterator<Cont>& operator++(); + +#include <iterator> +#include <vector> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::back_insert_iterator<C> i(c); + std::back_insert_iterator<C>& r = ++i; + assert(&r == &i); +} + +int main() +{ + test(std::vector<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/lv_value.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/lv_value.pass.cpp new file mode 100644 index 00000000000..eea220cd870 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/lv_value.pass.cpp @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// back_insert_iterator + +// requires CopyConstructible<Cont::value_type> +// back_insert_iterator<Cont>& +// operator=(const Cont::value_type& value); + +#include <iterator> +#include <vector> +#include <cassert> + +template <class C> +void +test(C c) +{ + const typename C::value_type v = typename C::value_type(); + std::back_insert_iterator<C> i(c); + i = v; + assert(c.back() == v); +} + +class Copyable +{ + int data_; +public: + Copyable() : data_(0) {} + ~Copyable() {data_ = -1;} + + friend bool operator==(const Copyable& x, const Copyable& y) + {return x.data_ == y.data_;} +}; + +int main() +{ + test(std::vector<Copyable>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/rv_value.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/rv_value.pass.cpp new file mode 100644 index 00000000000..8b0035472a3 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/rv_value.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// back_insert_iterator + +// requires CopyConstructible<Cont::value_type> +// back_insert_iterator<Cont>& +// operator=(Cont::value_type&& value); + +#include <iterator> + +#ifdef _LIBCPP_MOVE + +#include <vector> +#include <memory> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::back_insert_iterator<C> i(c); + i = typename C::value_type(); + assert(c.back() == typename C::value_type()); +} + +#endif + +int main() +{ +#ifdef _LIBCPP_MOVE + test(std::vector<std::unique_ptr<int> >()); +#endif +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op_astrk/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op_astrk/test.pass.cpp new file mode 100644 index 00000000000..437d500eb2b --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op_astrk/test.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// back_insert_iterator + +// back_insert_iterator<Cont>& operator*(); + +#include <iterator> +#include <vector> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::back_insert_iterator<C> i(c); + std::back_insert_iterator<C>& r = *i; + assert(&r == &i); +} + +int main() +{ + test(std::vector<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.inserter/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.inserter/test.pass.cpp new file mode 100644 index 00000000000..ec568aaaa50 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.inserter/test.pass.cpp @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <BackInsertionContainer Cont> +// back_insert_iterator<Cont> +// back_inserter(Cont& x); + +#include <iterator> +#include <vector> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::back_insert_iterator<C> i = std::back_inserter(c); + i = 0; + assert(c.size() == 1); + assert(c.back() == 0); +} + +int main() +{ + test(std::vector<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iterator/types.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iterator/types.pass.cpp new file mode 100644 index 00000000000..4efd53e0cf0 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iterator/types.pass.cpp @@ -0,0 +1,59 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// back_insert_iterator + +// Test nested types and data member: + +// template <BackInsertionContainer Cont> +// class back_insert_iterator { +// protected: +// Cont* container; +// public: +// typedef Cont container_type; +// typedef void value_type; +// typedef void difference_type; +// typedef back_insert_iterator<Cont>& reference; +// typedef void pointer; +// }; + +#include <iterator> +#include <type_traits> +#include <vector> + +template <class C> +struct find_container + : private std::back_insert_iterator<C> +{ + explicit find_container(C& c) : std::back_insert_iterator<C>(c) {} + void test() {this->container = 0;} +}; + +template <class C> +void +test() +{ + typedef std::back_insert_iterator<C> R; + C c; + find_container<C> q(c); + q.test(); + static_assert((std::is_same<typename R::container_type, C>::value), ""); + static_assert((std::is_same<typename R::value_type, void>::value), ""); + static_assert((std::is_same<typename R::difference_type, void>::value), ""); + static_assert((std::is_same<typename R::reference, R&>::value), ""); + static_assert((std::is_same<typename R::pointer, void>::value), ""); + static_assert((std::is_same<typename R::iterator_category, std::output_iterator_tag>::value), ""); +} + +int main() +{ + test<std::vector<int> >(); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.fail.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.fail.cpp new file mode 100644 index 00000000000..a9cf087d387 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.fail.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// front_insert_iterator + +// explicit front_insert_iterator(Cont& x); + +// test for explicit + +#include <iterator> +#include <list> + +int main() +{ + std::front_insert_iterator<std::list<int> > i = std::list<int>(); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.pass.cpp new file mode 100644 index 00000000000..5b36b20dc18 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.pass.cpp @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// front_insert_iterator + +// explicit front_insert_iterator(Cont& x); + +#include <iterator> +#include <list> + +template <class C> +void +test(C c) +{ + std::front_insert_iterator<C> i(c); +} + +int main() +{ + test(std::list<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/post.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/post.pass.cpp new file mode 100644 index 00000000000..922789c0593 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/post.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// front_insert_iterator + +// front_insert_iterator<Cont> operator++(int); + +#include <iterator> +#include <list> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::front_insert_iterator<C> i(c); + std::front_insert_iterator<C> r = i++; + r = 0; + assert(c.size() == 1); + assert(c.back() == 0); +} + +int main() +{ + test(std::list<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/pre.pass.cpp new file mode 100644 index 00000000000..bf582a8f189 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/pre.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// front_insert_iterator + +// front_insert_iterator<Cont>& operator++(); + +#include <iterator> +#include <list> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::front_insert_iterator<C> i(c); + std::front_insert_iterator<C>& r = ++i; + assert(&r == &i); +} + +int main() +{ + test(std::list<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/lv_value.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/lv_value.pass.cpp new file mode 100644 index 00000000000..968a171e5d7 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/lv_value.pass.cpp @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// front_insert_iterator + +// front_insert_iterator<Cont>& +// operator=(const Cont::value_type& value); + +#include <iterator> +#include <list> +#include <cassert> + +template <class C> +void +test(C c) +{ + const typename C::value_type v = typename C::value_type(); + std::front_insert_iterator<C> i(c); + i = v; + assert(c.front() == v); +} + +class Copyable +{ + int data_; +public: + Copyable() : data_(0) {} + ~Copyable() {data_ = -1;} + + friend bool operator==(const Copyable& x, const Copyable& y) + {return x.data_ == y.data_;} +}; + +int main() +{ + test(std::list<Copyable>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/rv_value.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/rv_value.pass.cpp new file mode 100644 index 00000000000..48e54b5a221 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/rv_value.pass.cpp @@ -0,0 +1,41 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// front_insert_iterator + +// front_insert_iterator<Cont>& +// operator=(Cont::value_type&& value); + +#include <iterator> + +#ifdef _LIBCPP_MOVE + +#include <list> +#include <memory> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::front_insert_iterator<C> i(c); + i = typename C::value_type(); + assert(c.front() == typename C::value_type()); +} + +#endif + +int main() +{ +#ifdef _LIBCPP_MOVE + test(std::list<std::unique_ptr<int> >()); +#endif +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op_astrk/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op_astrk/test.pass.cpp new file mode 100644 index 00000000000..8d886c55619 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op_astrk/test.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// front_insert_iterator + +// front_insert_iterator<Cont>& operator*(); + +#include <iterator> +#include <list> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::front_insert_iterator<C> i(c); + std::front_insert_iterator<C>& r = *i; + assert(&r == &i); +} + +int main() +{ + test(std::list<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.inserter/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.inserter/test.pass.cpp new file mode 100644 index 00000000000..a218d02fd49 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.inserter/test.pass.cpp @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <BackInsertionContainer Cont> +// front_insert_iterator<Cont> +// front_inserter(Cont& x); + +#include <iterator> +#include <list> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::front_insert_iterator<C> i = std::front_inserter(c); + i = 0; + assert(c.size() == 1); + assert(c.front() == 0); +} + +int main() +{ + test(std::list<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iterator/types.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iterator/types.pass.cpp new file mode 100644 index 00000000000..ebbc4ab85d4 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iterator/types.pass.cpp @@ -0,0 +1,60 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// front_insert_iterator + +// Test nested types and data member: + +// template <class Container> +// class front_insert_iterator { +// protected: +// Container* container; +// public: +// typedef Container container_type; +// typedef void value_type; +// typedef void difference_type; +// typedef front_insert_iterator<Cont>& reference; +// typedef void pointer; +// typedef output_iterator_tag iterator_category; +// }; + +#include <iterator> +#include <type_traits> +#include <vector> + +template <class C> +struct find_container + : private std::front_insert_iterator<C> +{ + explicit find_container(C& c) : std::front_insert_iterator<C>(c) {} + void test() {this->container = 0;} +}; + +template <class C> +void +test() +{ + typedef std::front_insert_iterator<C> R; + C c; + find_container<C> q(c); + q.test(); + static_assert((std::is_same<typename R::container_type, C>::value), ""); + static_assert((std::is_same<typename R::value_type, void>::value), ""); + static_assert((std::is_same<typename R::difference_type, void>::value), ""); + static_assert((std::is_same<typename R::reference, R&>::value), ""); + static_assert((std::is_same<typename R::pointer, void>::value), ""); + static_assert((std::is_same<typename R::iterator_category, std::output_iterator_tag>::value), ""); +} + +int main() +{ + test<std::vector<int> >(); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/test.pass.cpp new file mode 100644 index 00000000000..7c803df4395 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/test.pass.cpp @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// insert_iterator + +// insert_iterator(Cont& x, Cont::iterator i); + +#include <iterator> +#include <vector> + +template <class C> +void +test(C c) +{ + std::insert_iterator<C> i(c, c.begin()); +} + +int main() +{ + test(std::vector<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/post.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/post.pass.cpp new file mode 100644 index 00000000000..0b00c9103e8 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/post.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// insert_iterator + +// insert_iterator<Cont> operator++(int); + +#include <iterator> +#include <vector> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::insert_iterator<C> i(c, c.end()); + std::insert_iterator<C> r = i++; + r = 0; + assert(c.size() == 1); + assert(c.back() == 0); +} + +int main() +{ + test(std::vector<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/pre.pass.cpp new file mode 100644 index 00000000000..2838af5e794 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/pre.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// insert_iterator + +// insert_iterator<Cont>& operator++(); + +#include <iterator> +#include <vector> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::insert_iterator<C> i(c, c.end()); + std::insert_iterator<C>& r = ++i; + assert(&r == &i); +} + +int main() +{ + test(std::vector<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/lv_value.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/lv_value.pass.cpp new file mode 100644 index 00000000000..87ca88a9027 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/lv_value.pass.cpp @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// insert_iterator + +// requires CopyConstructible<Cont::value_type> +// insert_iterator<Cont>& +// operator=(const Cont::value_type& value); + +#include <iterator> +#include <vector> +#include <cassert> + +template <class C> +void +test(C c1, typename C::difference_type j, + typename C::value_type x1, typename C::value_type x2, + typename C::value_type x3, const C& c2) +{ + std::insert_iterator<C> q(c1, c1.begin() + j); + q = x1; + q = x2; + q = x3; + assert(c1 == c2); +} + +template <class C> +void +insert3at(C& c, typename C::iterator i, + typename C::value_type x1, typename C::value_type x2, + typename C::value_type x3) +{ + i = c.insert(i, x1); + i = c.insert(++i, x2); + c.insert(++i, x3); +} + +int main() +{ + typedef std::vector<int> C; + C c1; + for (int i = 0; i < 3; ++i) + c1.push_back(i); + C c2 = c1; + insert3at(c2, c2.begin(), 'a', 'b', 'c'); + test(c1, 0, 'a', 'b', 'c', c2); + c2 = c1; + insert3at(c2, c2.begin()+1, 'a', 'b', 'c'); + test(c1, 1, 'a', 'b', 'c', c2); + c2 = c1; + insert3at(c2, c2.begin()+2, 'a', 'b', 'c'); + test(c1, 2, 'a', 'b', 'c', c2); + c2 = c1; + insert3at(c2, c2.begin()+3, 'a', 'b', 'c'); + test(c1, 3, 'a', 'b', 'c', c2); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/rv_value.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/rv_value.pass.cpp new file mode 100644 index 00000000000..d4f63307a8f --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/rv_value.pass.cpp @@ -0,0 +1,95 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// insert_iterator + +// requires CopyConstructible<Cont::value_type> +// insert_iterator<Cont>& +// operator=(const Cont::value_type& value); + +#include <iterator> + +#ifdef _LIBCPP_MOVE +#include <vector> +#include <memory> +#include <cassert> + +template <class C> +void +test(C c1, typename C::difference_type j, + typename C::value_type x1, typename C::value_type x2, + typename C::value_type x3, const C& c2) +{ + std::insert_iterator<C> q(c1, c1.begin() + j); + q = std::move(x1); + q = std::move(x2); + q = std::move(x3); + assert(c1 == c2); +} + +template <class C> +void +insert3at(C& c, typename C::iterator i, + typename C::value_type x1, typename C::value_type x2, + typename C::value_type x3) +{ + i = c.insert(i, std::move(x1)); + i = c.insert(++i, std::move(x2)); + c.insert(++i, std::move(x3)); +} + +struct do_nothing +{ + void operator()(void*) const {} +}; + +#endif + +int main() +{ +#ifdef _LIBCPP_MOVE + typedef std::unique_ptr<int, do_nothing> Ptr; + typedef std::vector<Ptr> C; + C c1; + int x[6] = {0}; + for (int i = 0; i < 3; ++i) + c1.push_back(Ptr(x+i)); + C c2; + for (int i = 0; i < 3; ++i) + c2.push_back(Ptr(x+i)); + insert3at(c2, c2.begin(), Ptr(x+3), Ptr(x+4), Ptr(x+5)); + test(std::move(c1), 0, Ptr(x+3), Ptr(x+4), Ptr(x+5), c2); + c1.clear(); + for (int i = 0; i < 3; ++i) + c1.push_back(Ptr(x+i)); + c2.clear(); + for (int i = 0; i < 3; ++i) + c2.push_back(Ptr(x+i)); + insert3at(c2, c2.begin()+1, Ptr(x+3), Ptr(x+4), Ptr(x+5)); + test(std::move(c1), 1, Ptr(x+3), Ptr(x+4), Ptr(x+5), c2); + c1.clear(); + for (int i = 0; i < 3; ++i) + c1.push_back(Ptr(x+i)); + c2.clear(); + for (int i = 0; i < 3; ++i) + c2.push_back(Ptr(x+i)); + insert3at(c2, c2.begin()+2, Ptr(x+3), Ptr(x+4), Ptr(x+5)); + test(std::move(c1), 2, Ptr(x+3), Ptr(x+4), Ptr(x+5), c2); + c1.clear(); + for (int i = 0; i < 3; ++i) + c1.push_back(Ptr(x+i)); + c2.clear(); + for (int i = 0; i < 3; ++i) + c2.push_back(Ptr(x+i)); + insert3at(c2, c2.begin()+3, Ptr(x+3), Ptr(x+4), Ptr(x+5)); + test(std::move(c1), 3, Ptr(x+3), Ptr(x+4), Ptr(x+5), c2); +#endif +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op_astrk/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op_astrk/test.pass.cpp new file mode 100644 index 00000000000..e6dd4925175 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op_astrk/test.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// insert_iterator + +// insert_iterator<Cont>& operator*(); + +#include <iterator> +#include <vector> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::insert_iterator<C> i(c, c.end()); + std::insert_iterator<C>& r = *i; + assert(&r == &i); +} + +int main() +{ + test(std::vector<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/inserter/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/inserter/test.pass.cpp new file mode 100644 index 00000000000..96bd3740f5c --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/inserter/test.pass.cpp @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <InsertionContainer Cont> +// insert_iterator<Cont> +// inserter(Cont& x, Cont::iterator i); + +#include <iterator> +#include <vector> +#include <cassert> + +template <class C> +void +test(C c) +{ + std::insert_iterator<C> i = std::inserter(c, c.end()); + i = 0; + assert(c.size() == 1); + assert(c.back() == 0); +} + +int main() +{ + test(std::vector<int>()); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iterator/types.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iterator/types.pass.cpp new file mode 100644 index 00000000000..1c2dec01181 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iterator/types.pass.cpp @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// insert_iterator + +// Test nested types and data members: + +// template <InsertionContainer Cont> +// class insert_iterator { +// protected: +// Cont* container; +// Cont::iterator iter; +// public: +// typedef Cont container_type; +// typedef void value_type; +// typedef void difference_type; +// typedef insert_iterator<Cont>& reference; +// typedef void pointer; +// }; + +#include <iterator> +#include <type_traits> +#include <vector> + +template <class C> +struct find_members + : private std::insert_iterator<C> +{ + explicit find_members(C& c) : std::insert_iterator<C>(c, c.begin()) {} + void test() + { + this->container = 0; + this->iter == this->iter; + } +}; + +template <class C> +void +test() +{ + typedef std::insert_iterator<C> R; + C c; + find_members<C> q(c); + q.test(); + static_assert((std::is_same<typename R::container_type, C>::value), ""); + static_assert((std::is_same<typename R::value_type, void>::value), ""); + static_assert((std::is_same<typename R::difference_type, void>::value), ""); + static_assert((std::is_same<typename R::reference, R&>::value), ""); + static_assert((std::is_same<typename R::pointer, void>::value), ""); + static_assert((std::is_same<typename R::iterator_category, std::output_iterator_tag>::value), ""); +} + +int main() +{ + test<std::vector<int> >(); +} diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/insert.iterators/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/make_move_iterator.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/make_move_iterator.pass.cpp new file mode 100644 index 00000000000..4c4c4fa857d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/make_move_iterator.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <InputIterator Iter> +// move_iterator<Iter> +// make_move_iterator(const Iter& i); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i) +{ + const std::move_iterator<It> r(i); + assert(std::make_move_iterator(i) == r); +} + +int main() +{ + char s[] = "1234567890"; + test(input_iterator<char*>(s+5)); + test(forward_iterator<char*>(s+5)); + test(bidirectional_iterator<char*>(s+5)); + test(random_access_iterator<char*>(s+5)); + test(s+5); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/minus.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/minus.pass.cpp new file mode 100644 index 00000000000..7ab223e3277 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/minus.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> +// requires HasMinus<Iter1, Iter2> +// auto +// operator-(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y) +// -> decltype(x.base() - y.base()); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, typename std::iterator_traits<It>::difference_type x) +{ + const std::move_iterator<It> r1(l); + const std::move_iterator<It> r2(r); + assert(r1 - r2 == x); +} + +int main() +{ + char s[] = "1234567890"; + test(random_access_iterator<char*>(s+5), random_access_iterator<char*>(s), 5); + test(s+5, s, 5); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/plus.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/plus.pass.cpp new file mode 100644 index 00000000000..8203e02d367 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/plus.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <RandomAccessIterator Iter> +// move_iterator<Iter> +// operator+(Iter::difference_type n, const move_iterator<Iter>& x); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + const std::move_iterator<It> r(i); + std::move_iterator<It> rr = n + r; + assert(rr.base() == x); +} + +int main() +{ + char s[] = "1234567890"; + test(random_access_iterator<char*>(s+5), 5, random_access_iterator<char*>(s+10)); + test(s+5, 5, s+10); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+/difference_type.pass.cpp new file mode 100644 index 00000000000..c1e6e8bf42e --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+/difference_type.pass.cpp @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// requires RandomAccessIterator<Iter> +// move_iterator operator+(difference_type n) const; + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + const std::move_iterator<It> r(i); + std::move_iterator<It> rr = r + n; + assert(rr.base() == x); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10)); + test(s+5, 5, s+10); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+=/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+=/difference_type.pass.cpp new file mode 100644 index 00000000000..4a6f16541cc --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+=/difference_type.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// requires RandomAccessIterator<Iter> +// move_iterator& operator+=(difference_type n); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + std::move_iterator<It> r(i); + std::move_iterator<It>& rr = r += n; + assert(r.base() == x); + assert(&rr == &r); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10)); + test(s+5, 5, s+10); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-/difference_type.pass.cpp new file mode 100644 index 00000000000..9ba7f8af63e --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-/difference_type.pass.cpp @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// requires RandomAccessIterator<Iter> +// move_iterator operator-(difference_type n) const; + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + const std::move_iterator<It> r(i); + std::move_iterator<It> rr = r - n; + assert(rr.base() == x); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s)); + test(s+5, 5, s); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-=/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-=/difference_type.pass.cpp new file mode 100644 index 00000000000..8d6b473ef44 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-=/difference_type.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// requires RandomAccessIterator<Iter> +// move_iterator& operator-=(difference_type n); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + std::move_iterator<It> r(i); + std::move_iterator<It>& rr = r -= n; + assert(r.base() == x); + assert(&rr == &r); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s)); + test(s+5, 5, s); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_eq.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_eq.pass.cpp new file mode 100644 index 00000000000..4fd8560a87b --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_eq.pass.cpp @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <InputIterator Iter1, InputIterator Iter2> +// requires HasEqualTo<Iter1, Iter2> +// bool +// operator==(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, bool x) +{ + const std::move_iterator<It> r1(l); + const std::move_iterator<It> r2(r); + assert((r1 == r2) == x); +} + +int main() +{ + char s[] = "1234567890"; + test(input_iterator<char*>(s), input_iterator<char*>(s), true); + test(input_iterator<char*>(s), input_iterator<char*>(s+1), false); + test(forward_iterator<char*>(s), forward_iterator<char*>(s), true); + test(forward_iterator<char*>(s), forward_iterator<char*>(s+1), false); + test(bidirectional_iterator<char*>(s), bidirectional_iterator<char*>(s), true); + test(bidirectional_iterator<char*>(s), bidirectional_iterator<char*>(s+1), false); + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s), true); + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1), false); + test(s, s, true); + test(s, s+1, false); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gt.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gt.pass.cpp new file mode 100644 index 00000000000..5875265a6ae --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gt.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> +// requires HasLess<Iter2, Iter1> +// bool +// operator>(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, bool x) +{ + const std::move_iterator<It> r1(l); + const std::move_iterator<It> r2(r); + assert((r1 > r2) == x); +} + +int main() +{ + char s[] = "1234567890"; + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s), false); + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1), false); + test(random_access_iterator<char*>(s+1), random_access_iterator<char*>(s), true); + test(s, s, false); + test(s, s+1, false); + test(s+1, s, true); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gte.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gte.pass.cpp new file mode 100644 index 00000000000..87b604077db --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gte.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> +// requires HasLess<Iter1, Iter2> +// bool +// operator>=(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, bool x) +{ + const std::move_iterator<It> r1(l); + const std::move_iterator<It> r2(r); + assert((r1 >= r2) == x); +} + +int main() +{ + char s[] = "1234567890"; + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s), true); + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1), false); + test(random_access_iterator<char*>(s+1), random_access_iterator<char*>(s), true); + test(s, s, true); + test(s, s+1, false); + test(s+1, s, true); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lt.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lt.pass.cpp new file mode 100644 index 00000000000..12f3feb62a6 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lt.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> +// requires HasLess<Iter1, Iter2> +// bool +// operator<(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, bool x) +{ + const std::move_iterator<It> r1(l); + const std::move_iterator<It> r2(r); + assert((r1 < r2) == x); +} + +int main() +{ + char s[] = "1234567890"; + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s), false); + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1), true); + test(random_access_iterator<char*>(s+1), random_access_iterator<char*>(s), false); + test(s, s, false); + test(s, s+1, true); + test(s+1, s, false); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lte.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lte.pass.cpp new file mode 100644 index 00000000000..8be470570e3 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lte.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> +// requires HasLess<Iter2, Iter1> +// bool +// operator<=(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, bool x) +{ + const std::move_iterator<It> r1(l); + const std::move_iterator<It> r2(r); + assert((r1 <= r2) == x); +} + +int main() +{ + char s[] = "1234567890"; + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s), true); + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1), true); + test(random_access_iterator<char*>(s+1), random_access_iterator<char*>(s), false); + test(s, s, true); + test(s, s+1, true); + test(s+1, s, false); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_neq.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_neq.pass.cpp new file mode 100644 index 00000000000..1d4669a4f3d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_neq.pass.cpp @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <InputIterator Iter1, InputIterator Iter2> +// requires HasEqualTo<Iter1, Iter2> +// bool +// operator!=(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, bool x) +{ + const std::move_iterator<It> r1(l); + const std::move_iterator<It> r2(r); + assert((r1 != r2) == x); +} + +int main() +{ + char s[] = "1234567890"; + test(input_iterator<char*>(s), input_iterator<char*>(s), false); + test(input_iterator<char*>(s), input_iterator<char*>(s+1), true); + test(forward_iterator<char*>(s), forward_iterator<char*>(s), false); + test(forward_iterator<char*>(s), forward_iterator<char*>(s+1), true); + test(bidirectional_iterator<char*>(s), bidirectional_iterator<char*>(s), false); + test(bidirectional_iterator<char*>(s), bidirectional_iterator<char*>(s+1), true); + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s), false); + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1), true); + test(s, s, false); + test(s, s+1, true); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.fail.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.fail.cpp new file mode 100644 index 00000000000..b1eeb0a4fd5 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.fail.cpp @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <class U> +// requires HasConstructor<Iter, const U&> +// move_iterator(const move_iterator<U> &u); + +// test requires + +#include <iterator> + +template <class It, class U> +void +test(U u) +{ + std::move_iterator<U> r2(u); + std::move_iterator<It> r1 = r2; +} + +struct base {}; +struct derived {}; + +int main() +{ + derived d; + + test<base*>(&d); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.pass.cpp new file mode 100644 index 00000000000..c49697b315e --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.pass.cpp @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <class U> +// requires HasConstructor<Iter, const U&> +// move_iterator(const move_iterator<U> &u); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It, class U> +void +test(U u) +{ + const std::move_iterator<U> r2(u); + std::move_iterator<It> r1 = r2; + assert(r1.base() == u); +} + +struct base {}; +struct derived : base {}; + +int main() +{ + derived d; + + test<input_iterator<base*> >(input_iterator<derived*>(&d)); + test<forward_iterator<base*> >(forward_iterator<derived*>(&d)); + test<bidirectional_iterator<base*> >(bidirectional_iterator<derived*>(&d)); + test<random_access_iterator<const base*> >(random_access_iterator<derived*>(&d)); + test<base*>(&d); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp new file mode 100644 index 00000000000..dcebbe75e14 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// move_iterator(); + +#include <iterator> + +#include "../../../../iterators.h" + +template <class It> +void +test() +{ + std::move_iterator<It> r; +} + +int main() +{ + test<input_iterator<char*> >(); + test<forward_iterator<char*> >(); + test<bidirectional_iterator<char*> >(); + test<random_access_iterator<char*> >(); + test<char*>(); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.fail.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.fail.cpp new file mode 100644 index 00000000000..9759a744596 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.fail.cpp @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// explicit move_iterator(Iter ); + +// test explicit + +#include <iterator> + +template <class It> +void +test(It i) +{ + std::move_iterator<It> r = i; +} + +int main() +{ + char s[] = "123"; + test(s); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp new file mode 100644 index 00000000000..67a9d4cabef --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// explicit move_iterator(Iter i); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i) +{ + std::move_iterator<It> r(i); + assert(r.base() == i); +} + +int main() +{ + char s[] = "123"; + test(input_iterator<char*>(s)); + test(forward_iterator<char*>(s)); + test(bidirectional_iterator<char*>(s)); + test(random_access_iterator<char*>(s)); + test(s); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.conv/tested_elsewhere.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.conv/tested_elsewhere.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.conv/tested_elsewhere.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/post.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/post.pass.cpp new file mode 100644 index 00000000000..3f46f882ad0 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/post.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// move_iterator operator--(int); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, It x) +{ + std::move_iterator<It> r(i); + std::move_iterator<It> rr = r--; + assert(r.base() == x); + assert(rr.base() == i); +} + +int main() +{ + char s[] = "123"; + test(bidirectional_iterator<char*>(s+1), bidirectional_iterator<char*>(s)); + test(random_access_iterator<char*>(s+1), random_access_iterator<char*>(s)); + test(s+1, s); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/pre.pass.cpp new file mode 100644 index 00000000000..6f09436d718 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/pre.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// move_iterator& operator--(); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, It x) +{ + std::move_iterator<It> r(i); + std::move_iterator<It>& rr = --r; + assert(r.base() == x); + assert(&rr == &r); +} + +int main() +{ + char s[] = "123"; + test(bidirectional_iterator<char*>(s+1), bidirectional_iterator<char*>(s)); + test(random_access_iterator<char*>(s+1), random_access_iterator<char*>(s)); + test(s+1, s); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/post.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/post.pass.cpp new file mode 100644 index 00000000000..6b7dcaa84d3 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/post.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// move_iterator operator++(int); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, It x) +{ + std::move_iterator<It> r(i); + std::move_iterator<It> rr = r++; + assert(r.base() == x); + assert(rr.base() == i); +} + +int main() +{ + char s[] = "123"; + test(input_iterator<char*>(s), input_iterator<char*>(s+1)); + test(forward_iterator<char*>(s), forward_iterator<char*>(s+1)); + test(bidirectional_iterator<char*>(s), bidirectional_iterator<char*>(s+1)); + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1)); + test(s, s+1); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/pre.pass.cpp new file mode 100644 index 00000000000..a65b57961c6 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/pre.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// move_iterator& operator++(); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, It x) +{ + std::move_iterator<It> r(i); + std::move_iterator<It>& rr = ++r; + assert(r.base() == x); + assert(&rr == &r); +} + +int main() +{ + char s[] = "123"; + test(input_iterator<char*>(s), input_iterator<char*>(s+1)); + test(forward_iterator<char*>(s), forward_iterator<char*>(s+1)); + test(bidirectional_iterator<char*>(s), bidirectional_iterator<char*>(s+1)); + test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1)); + test(s, s+1); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.index/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.index/difference_type.pass.cpp new file mode 100644 index 00000000000..9afbeb70f41 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.index/difference_type.pass.cpp @@ -0,0 +1,58 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// requires RandomAccessIterator<Iter> +// unspecified operator[](difference_type n) const; + +#include <iterator> +#include <cassert> +#ifdef _LIBCPP_MOVE +#include <memory> +#endif + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, + typename std::iterator_traits<It>::value_type x) +{ + typedef typename std::iterator_traits<It>::value_type value_type; + const std::move_iterator<It> r(i); + value_type rr = r[n]; + assert(rr == x); +} + +#ifdef _LIBCPP_MOVE + +struct do_nothing +{ + void operator()(void*) const {} +}; + +#endif + +int main() +{ + char s[] = "1234567890"; + test(random_access_iterator<char*>(s+5), 4, '0'); + test(s+5, 4, '0'); +#ifdef _LIBCPP_MOVE + int i[5]; + typedef std::unique_ptr<int, do_nothing> Ptr; + Ptr p[5]; + for (unsigned j = 0; j < 5; ++j) + p[j].reset(i+j); + test(p, 3, Ptr(i+3)); +#endif +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.ref/op_arrow.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.ref/op_arrow.pass.cpp new file mode 100644 index 00000000000..382f7ba5728 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.ref/op_arrow.pass.cpp @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// pointer operator->() const; + +#include <iterator> +#include <cassert> + +template <class It> +void +test(It i) +{ + std::move_iterator<It> r(i); + assert(r.operator->() == i); +} + +int main() +{ + char s[] = "123"; + test(s); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.star/op_star.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.star/op_star.pass.cpp new file mode 100644 index 00000000000..7ffac7f56a9 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.star/op_star.pass.cpp @@ -0,0 +1,61 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// reference operator*() const; + +#include <iterator> +#include <cassert> +#ifdef _LIBCPP_MOVE +#include <memory> +#endif + +class A +{ + int data_; +public: + A() : data_(1) {} + ~A() {data_ = -1;} + + friend bool operator==(const A& x, const A& y) + {return x.data_ == y.data_;} +}; + +template <class It> +void +test(It i, typename std::iterator_traits<It>::value_type x) +{ + std::move_iterator<It> r(i); + assert(*r == x); + typename std::iterator_traits<It>::value_type x2 = *r; + assert(x2 == x); +} + +#ifdef _LIBCPP_MOVE + +struct do_nothing +{ + void operator()(void*) const {} +}; + +#endif + +int main() +{ + A a; + test(&a, A()); +#ifdef _LIBCPP_MOVE + int i; + std::unique_ptr<int, do_nothing> p(&i); + test(&p, std::unique_ptr<int, do_nothing>(&i)); +#endif +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.fail.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.fail.cpp new file mode 100644 index 00000000000..2c3a0172dc4 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.fail.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <class U> +// requires HasAssign<Iter, const U&> +// move_iterator& +// operator=(const move_iterator<U>& u); + +// test requires + +#include <iterator> + +template <class It, class U> +void +test(U u) +{ + const std::move_iterator<U> r2(u); + std::move_iterator<It> r1; + r1 = r2; +} + +struct base {}; +struct derived {}; + +int main() +{ + derived d; + test<base*>(&d); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp new file mode 100644 index 00000000000..7a434299497 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp @@ -0,0 +1,47 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// template <class U> +// requires HasAssign<Iter, const U&> +// move_iterator& +// operator=(const move_iterator<U>& u); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It, class U> +void +test(U u) +{ + const std::move_iterator<U> r2(u); + std::move_iterator<It> r1; + std::move_iterator<It>& rr = r1 = r2; + assert(r1.base() == u); + assert(&rr == &r1); +} + +struct base {}; +struct derived : base {}; + +int main() +{ + derived d; + + test<input_iterator<base*> >(input_iterator<derived*>(&d)); + test<forward_iterator<base*> >(forward_iterator<derived*>(&d)); + test<bidirectional_iterator<base*> >(bidirectional_iterator<derived*>(&d)); + test<random_access_iterator<const base*> >(random_access_iterator<derived*>(&d)); + test<base*>(&d); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.requirements/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.requirements/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.requirements/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iterator/types.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iterator/types.pass.cpp new file mode 100644 index 00000000000..a9e4fe8a29b --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iterator/types.pass.cpp @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// move_iterator + +// Test nested types: + +// template <InputIterator Iter> +// class move_iterator { +// public: +// typedef Iter iterator_type; +// typedef Iter::difference_type difference_type; +// typedef Iterator pointer; +// typedef Iter::value_type value_type; +// typedef value_type&& reference; +// }; + +#include <iterator> +#include <type_traits> + +#include "../../../iterators.h" + +template <class It> +void +test() +{ + typedef std::move_iterator<It> R; + typedef std::iterator_traits<It> T; + static_assert((std::is_same<typename R::iterator_type, It>::value), ""); + static_assert((std::is_same<typename R::difference_type, typename T::difference_type>::value), ""); + static_assert((std::is_same<typename R::pointer, typename T::pointer>::value), ""); + static_assert((std::is_same<typename R::value_type, typename T::value_type>::value), ""); +#ifdef _LIBCPP_MOVE + static_assert((std::is_same<typename R::reference, typename R::value_type&&>::value), ""); +#else + static_assert((std::is_same<typename R::reference, typename T::reference>::value), ""); +#endif + static_assert((std::is_same<typename R::iterator_category, typename T::iterator_category>::value), ""); +} + +int main() +{ + test<input_iterator<char*> >(); + test<forward_iterator<char*> >(); + test<bidirectional_iterator<char*> >(); + test<random_access_iterator<char*> >(); + test<char*>(); +} diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/move.iterators/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp new file mode 100644 index 00000000000..7dd8fb1e6ca --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// reverse_iterator(); + +#include <iterator> + +#include "../../../../iterators.h" + +template <class It> +void +test() +{ + std::reverse_iterator<It> r; +} + +int main() +{ + test<bidirectional_iterator<const char*> >(); + test<random_access_iterator<char*> >(); + test<char*>(); + test<const char*>(); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.fail.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.fail.cpp new file mode 100644 index 00000000000..9ed84d275ed --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.fail.cpp @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// explicit reverse_iterator(Iter x); + +// test explicit + +#include <iterator> + +template <class It> +void +test(It i) +{ + std::reverse_iterator<It> r = i; +} + +int main() +{ + const char s[] = "123"; + test(s); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp new file mode 100644 index 00000000000..e2633f05da4 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// explicit reverse_iterator(Iter x); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i) +{ + std::reverse_iterator<It> r(i); + assert(r.base() == i); +} + +int main() +{ + const char s[] = "123"; + test(bidirectional_iterator<const char*>(s)); + test(random_access_iterator<const char*>(s)); + test(s); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.fail.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.fail.cpp new file mode 100644 index 00000000000..376932eb1a2 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.fail.cpp @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// template <class U> +// requires HasConstructor<Iter, const U&> +// reverse_iterator(const reverse_iterator<U> &u); + +// test requires + +#include <iterator> + +template <class It, class U> +void +test(U u) +{ + std::reverse_iterator<U> r2(u); + std::reverse_iterator<It> r1 = r2; +} + +struct base {}; +struct derived {}; + +int main() +{ + derived d; + + test<base*>(&d); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp new file mode 100644 index 00000000000..923a594649c --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// template <class U> +// requires HasConstructor<Iter, const U&> +// reverse_iterator(const reverse_iterator<U> &u); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It, class U> +void +test(U u) +{ + const std::reverse_iterator<U> r2(u); + std::reverse_iterator<It> r1 = r2; + assert(r1.base() == u); +} + +struct base {}; +struct derived : base {}; + +int main() +{ + derived d; + + test<bidirectional_iterator<base*> >(bidirectional_iterator<derived*>(&d)); + test<random_access_iterator<const base*> >(random_access_iterator<derived*>(&d)); + test<base*>(&d); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.conv/tested_elsewhere.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.conv/tested_elsewhere.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.conv/tested_elsewhere.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp new file mode 100644 index 00000000000..1990f0e450b --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// template <BidirectionalIterator Iter1, BidirectionalIterator Iter2> +// requires HasEqualTo<Iter1, Iter2> +// bool +// operator!=(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, bool x) +{ + const std::reverse_iterator<It> r1(l); + const std::reverse_iterator<It> r2(r); + assert((r1 != r2) == x); +} + +int main() +{ + const char* s = "1234567890"; + test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s), false); + test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1), true); + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), false); + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), true); + test(s, s, false); + test(s, s+1, true); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp new file mode 100644 index 00000000000..a29b82ad4e7 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// reverse_iterator operator++(int); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, It x) +{ + std::reverse_iterator<It> r(i); + std::reverse_iterator<It> rr = r++; + assert(r.base() == x); + assert(rr.base() == i); +} + +int main() +{ + const char* s = "123"; + 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/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp new file mode 100644 index 00000000000..1bce56923d5 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// reverse_iterator& operator++(); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, It x) +{ + std::reverse_iterator<It> r(i); + std::reverse_iterator<It>& rr = ++r; + assert(r.base() == x); + assert(&rr == &r); +} + +int main() +{ + const char* s = "123"; + 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/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp new file mode 100644 index 00000000000..bfda849897b --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// requires RandomAccessIterator<Iter> +// reverse_iterator operator+(difference_type n) const; + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + const std::reverse_iterator<It> r(i); + std::reverse_iterator<It> rr = r + n; + assert(rr.base() == x); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s)); + test(s+5, 5, s); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp new file mode 100644 index 00000000000..dcd2d6e3f5f --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// requires RandomAccessIterator<Iter> +// reverse_iterator& operator+=(difference_type n); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + std::reverse_iterator<It> r(i); + std::reverse_iterator<It>& rr = r += n; + assert(r.base() == x); + assert(&rr == &r); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s)); + test(s+5, 5, s); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp new file mode 100644 index 00000000000..322a288442a --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// reverse_iterator operator--(int); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, It x) +{ + std::reverse_iterator<It> r(i); + std::reverse_iterator<It> rr = r--; + assert(r.base() == x); + assert(rr.base() == i); +} + +int main() +{ + const char* s = "123"; + test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s+2)); + test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s+2)); + test(s+1, s+2); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp new file mode 100644 index 00000000000..ec26ab2b2ad --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// reverse_iterator& operator--(); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, It x) +{ + std::reverse_iterator<It> r(i); + std::reverse_iterator<It>& rr = --r; + assert(r.base() == x); + assert(&rr == &r); +} + +int main() +{ + const char* s = "123"; + test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s+2)); + test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s+2)); + test(s+1, s+2); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp new file mode 100644 index 00000000000..a2a4e7aa994 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// requires RandomAccessIterator<Iter> +// reverse_iterator operator-(difference_type n) const; + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + const std::reverse_iterator<It> r(i); + std::reverse_iterator<It> rr = r - n; + assert(rr.base() == x); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10)); + test(s+5, 5, s+10); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp new file mode 100644 index 00000000000..641ce3fbc1c --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// requires RandomAccessIterator<Iter> +// reverse_iterator& operator-=(difference_type n); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + std::reverse_iterator<It> r(i); + std::reverse_iterator<It>& rr = r -= n; + assert(r.base() == x); + assert(&rr == &r); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10)); + test(s+5, 5, s+10); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp new file mode 100644 index 00000000000..334b5daae8f --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// reference operator*() const; + +// Be sure to respect LWG 198: +// http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198 + +#include <iterator> +#include <cassert> + +class A +{ + int data_; +public: + A() : data_(1) {} + ~A() {data_ = -1;} + + friend bool operator==(const A& x, const A& y) + {return x.data_ == y.data_;} +}; + +template <class It> +class weird_iterator +{ + It it_; +public: + typedef It value_type; + typedef std::bidirectional_iterator_tag iterator_category; + typedef std::ptrdiff_t difference_type; + typedef It* pointer; + typedef It& reference; + + weird_iterator() {} + explicit weird_iterator(It it) : it_(it) {} + ~weird_iterator() {it_ = It();} + + reference operator*() {return it_;} + + weird_iterator& operator--() {return *this;} +}; + +template <class It> +void +test(It i, typename std::iterator_traits<It>::value_type x) +{ + std::reverse_iterator<It> r(i); + assert(*r == x); +} + +int main() +{ + test(weird_iterator<A>(A()), A()); + A a; + test(&a+1, A()); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.fail.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.fail.cpp new file mode 100644 index 00000000000..7fc6948cff4 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.fail.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// template <class U> +// requires HasAssign<Iter, const U&> +// reverse_iterator& +// operator=(const reverse_iterator<U>& u); + +// test requires + +#include <iterator> + +template <class It, class U> +void +test(U u) +{ + const std::reverse_iterator<U> r2(u); + std::reverse_iterator<It> r1; + r1 = r2; +} + +struct base {}; +struct derived {}; + +int main() +{ + derived d; + test<base*>(&d); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp new file mode 100644 index 00000000000..a83a43a91a0 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// template <class U> +// requires HasAssign<Iter, const U&> +// reverse_iterator& +// operator=(const reverse_iterator<U>& u); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It, class U> +void +test(U u) +{ + const std::reverse_iterator<U> r2(u); + std::reverse_iterator<It> r1; + std::reverse_iterator<It>& rr = r1 = r2; + assert(r1.base() == u); + assert(&rr == &r1); +} + +struct base {}; +struct derived : base {}; + +int main() +{ + derived d; + + test<bidirectional_iterator<base*> >(bidirectional_iterator<derived*>(&d)); + test<random_access_iterator<const base*> >(random_access_iterator<derived*>(&d)); + test<base*>(&d); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp new file mode 100644 index 00000000000..0abc1d9aaf3 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// template <BidirectionalIterator Iter1, BidirectionalIterator Iter2> +// requires HasEqualTo<Iter1, Iter2> +// bool +// operator==(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, bool x) +{ + const std::reverse_iterator<It> r1(l); + const std::reverse_iterator<It> r2(r); + assert((r1 == r2) == x); +} + +int main() +{ + const char* s = "1234567890"; + test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s), true); + test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1), false); + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), true); + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), false); + test(s, s, true); + test(s, s+1, false); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp new file mode 100644 index 00000000000..3c08e33d6ec --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> +// requires HasMinus<Iter2, Iter1> +// auto operator-(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y) +// -> decltype(y.base() - x.base()); + +#include <iterator> +#include <cstddef> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It1, class It2> +void +test(It1 l, It2 r, std::ptrdiff_t x) +{ + const std::reverse_iterator<It1> r1(l); + const std::reverse_iterator<It2> r2(r); + assert((r1 - r2) == x); +} + +int main() +{ + char s[3] = {0}; + test(random_access_iterator<const char*>(s), random_access_iterator<char*>(s), 0); + test(random_access_iterator<char*>(s), random_access_iterator<const char*>(s+1), 1); + test(random_access_iterator<const char*>(s+1), random_access_iterator<char*>(s), -1); + test(s, s, 0); + test(s, s+1, 1); + test(s+1, s, -1); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp new file mode 100644 index 00000000000..c1367eca94d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> +// requires HasGreater<Iter1, Iter2> +// bool +// operator>(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, bool x) +{ + const std::reverse_iterator<It> r1(l); + const std::reverse_iterator<It> r2(r); + assert((r1 > r2) == x); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), false); + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), true); + test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s), false); + test(s, s, false); + test(s, s+1, true); + test(s+1, s, false); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp new file mode 100644 index 00000000000..7dfcae89ea1 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> +// requires HasGreater<Iter1, Iter2> +// bool +// operator>=(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, bool x) +{ + const std::reverse_iterator<It> r1(l); + const std::reverse_iterator<It> r2(r); + assert((r1 >= r2) == x); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), true); + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), true); + test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s), false); + test(s, s, true); + test(s, s+1, true); + test(s+1, s, false); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opindex/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opindex/difference_type.pass.cpp new file mode 100644 index 00000000000..541d1e5093b --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opindex/difference_type.pass.cpp @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// requires RandomAccessIterator<Iter> +// unspecified operator[](difference_type n) const; + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, + typename std::iterator_traits<It>::value_type x) +{ + typedef typename std::iterator_traits<It>::value_type value_type; + const std::reverse_iterator<It> r(i); + value_type rr = r[n]; + assert(rr == x); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s+5), 4, '1'); + test(s+5, 4, '1'); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp new file mode 100644 index 00000000000..6594c25d5f7 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> +// requires HasGreater<Iter1, Iter2> +// bool +// operator<(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, bool x) +{ + const std::reverse_iterator<It> r1(l); + const std::reverse_iterator<It> r2(r); + assert((r1 < r2) == x); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), false); + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), false); + test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s), true); + test(s, s, false); + test(s, s+1, false); + test(s+1, s, true); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp new file mode 100644 index 00000000000..123d2edf1aa --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2> +// requires HasGreater<Iter1, Iter2> +// bool +// operator<=(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It l, It r, bool x) +{ + const std::reverse_iterator<It> r1(l); + const std::reverse_iterator<It> r2(r); + assert((r1 <= r2) == x); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), true); + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), false); + test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s), true); + test(s, s, true); + test(s, s+1, false); + test(s+1, s, true); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp new file mode 100644 index 00000000000..0eddb2b4c52 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp @@ -0,0 +1,69 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// pointer operator->() const; + +// Be sure to respect LWG 198: +// http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198 + +#include <iterator> +#include <cassert> + +class A +{ + int data_; +public: + A() : data_(1) {} + ~A() {data_ = -1;} + + int get() const {return data_;} + + friend bool operator==(const A& x, const A& y) + {return x.data_ == y.data_;} +}; + +template <class It> +class weird_iterator +{ + It it_; +public: + typedef It value_type; + typedef std::bidirectional_iterator_tag iterator_category; + typedef std::ptrdiff_t difference_type; + typedef It* pointer; + typedef It& reference; + + weird_iterator() {} + explicit weird_iterator(It it) : it_(it) {} + ~weird_iterator() {it_ = It();} + + reference operator*() {return it_;} + pointer operator->() {return &it_;} + + weird_iterator& operator--() {return *this;} +}; + +template <class It> +void +test(It i, typename std::iterator_traits<It>::value_type x) +{ + std::reverse_iterator<It> r(i); + assert(r->get() == x.get()); +} + +int main() +{ + test(weird_iterator<A>(A()), A()); + A a; + test(&a+1, A()); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp new file mode 100644 index 00000000000..f1915d3dfd8 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// template <RandomAccessIterator Iterator> +// reverse_iterator<Iter> +// operator+(Iter::difference_type n, const reverse_iterator<Iter>& x); + +#include <iterator> +#include <cassert> + +#include "../../../../iterators.h" + +template <class It> +void +test(It i, typename std::iterator_traits<It>::difference_type n, It x) +{ + const std::reverse_iterator<It> r(i); + std::reverse_iterator<It> rr = n + r; + assert(rr.base() == x); +} + +int main() +{ + const char* s = "1234567890"; + test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s)); + test(s+5, 5, s); +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.requirements/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.requirements/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.requirements/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iterator/types.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iterator/types.pass.cpp new file mode 100644 index 00000000000..a2c5b85d187 --- /dev/null +++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iterator/types.pass.cpp @@ -0,0 +1,61 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// reverse_iterator + +// Test nested types and data member: + +// template <BidirectionalIterator Iter> +// class reverse_iterator { +// protected: +// Iter current; +// public: +// typedef Iter iterator_type; +// typedef Iter::value_type value_type; +// typedef Iter::difference_type difference_type; +// typedef Iter::reference reference; +// typedef Iter::pointer pointer; +// }; + +#include <iterator> +#include <type_traits> + +#include "../../../iterators.h" + +template <class It> +struct find_current + : private std::reverse_iterator<It> +{ + void test() {++(this->current);} +}; + +template <class It> +void +test() +{ + typedef std::reverse_iterator<It> R; + typedef std::iterator_traits<It> T; + find_current<It> q; + q.test(); + static_assert((std::is_same<typename R::iterator_type, It>::value), ""); + static_assert((std::is_same<typename R::value_type, typename T::value_type>::value), ""); + static_assert((std::is_same<typename R::difference_type, typename T::difference_type>::value), ""); + static_assert((std::is_same<typename R::reference, typename T::reference>::value), ""); + static_assert((std::is_same<typename R::pointer, It>::value), ""); + static_assert((std::is_same<typename R::iterator_category, typename T::iterator_category>::value), ""); +} + +int main() +{ + test<bidirectional_iterator<char*> >(); + test<random_access_iterator<char*> >(); + test<char*>(); +} diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/copy.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/copy.pass.cpp new file mode 100644 index 00000000000..cf988f22c07 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/copy.pass.cpp @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class istream_iterator + +// istream_iterator(const istream_iterator& x); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::istream_iterator<int> io; + std::istream_iterator<int> i = io; + assert(i == std::istream_iterator<int>()); + } + { + std::istringstream inf(" 1 23"); + std::istream_iterator<int> io(inf); + std::istream_iterator<int> i = io; + assert(i != std::istream_iterator<int>()); + int j = 0; + j = *i; + assert(j == 1); + } +} diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.pass.cpp new file mode 100644 index 00000000000..e0fa4525d13 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.pass.cpp @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class istream_iterator + +// istream_iterator(); + +#include <iterator> +#include <cassert> + +int main() +{ + std::istream_iterator<int> i; + assert(i == std::istream_iterator<int>()); +} diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/istream.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/istream.pass.cpp new file mode 100644 index 00000000000..d40edc548dc --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/istream.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class istream_iterator + +// istream_iterator(istream_type& s); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + std::istringstream inf(" 1 23"); + std::istream_iterator<int> i(inf); + assert(i != std::istream_iterator<int>()); + assert(inf.peek() == ' '); + assert(inf.good()); + int j = 0; + inf >> j; + assert(j == 23); +} diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/arrow.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/arrow.pass.cpp new file mode 100644 index 00000000000..6c79e54d16b --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/arrow.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class istream_iterator + +// const T* operator->() const; + +#include <iterator> +#include <sstream> +#include <cassert> + +struct A +{ + double d_; + int i_; +}; + +std::istream& operator>>(std::istream& is, A& a) +{ + return is >> a.d_ >> a.i_; +} + +int main() +{ + std::istringstream inf("1.5 23 "); + std::istream_iterator<A> i(inf); + assert(i->d_ == 1.5); + assert(i->i_ == 23); +} diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/dereference.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/dereference.pass.cpp new file mode 100644 index 00000000000..5e068a1e2a9 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/dereference.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class istream_iterator + +// const T& operator*() const; + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + std::istringstream inf(" 1 23"); + std::istream_iterator<int> i(inf); + int j = 0; + j = *i; + assert(j == 1); + j = *i; + assert(j == 1); + ++i; + j = *i; + assert(j == 23); + j = *i; + assert(j == 23); +} diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/equal.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/equal.pass.cpp new file mode 100644 index 00000000000..736c188bf13 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/equal.pass.cpp @@ -0,0 +1,52 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class istream_iterator + +// template <class T, class charT, class traits, class Distance> +// bool operator==(const istream_iterator<T,charT,traits,Distance> &x, +// const istream_iterator<T,charT,traits,Distance> &y); +// +// template <class T, class charT, class traits, class Distance> +// bool operator!=(const istream_iterator<T,charT,traits,Distance> &x, +// const istream_iterator<T,charT,traits,Distance> &y); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + std::istringstream inf1(" 1 23"); + std::istringstream inf2(" 1 23"); + std::istream_iterator<int> i1(inf1); + std::istream_iterator<int> i2(inf1); + std::istream_iterator<int> i3(inf2); + std::istream_iterator<int> i4; + std::istream_iterator<int> i5; + assert(i1 == i1); + assert(i1 == i2); + assert(i1 != i3); + assert(i1 != i4); + assert(i1 != i5); + + assert(i2 == i2); + assert(i2 != i3); + assert(i2 != i4); + assert(i2 != i5); + + assert(i3 == i3); + assert(i3 != i4); + assert(i3 != i5); + + assert(i4 == i4); + assert(i4 == i5); +} diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/post_increment.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/post_increment.pass.cpp new file mode 100644 index 00000000000..7f24b817798 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/post_increment.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class istream_iterator + +// istream_iterator operator++(int); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + std::istringstream inf(" 1 23"); + std::istream_iterator<int> i(inf); + std::istream_iterator<int> icopy = i++; + assert(icopy == i); + int j = 0; + j = *i; + assert(j == 23); + j = 0; + j = *icopy; + assert(j == 1); +} diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/pre_increment.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/pre_increment.pass.cpp new file mode 100644 index 00000000000..90315633089 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/pre_increment.pass.cpp @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class istream_iterator + +// istream_iterator& operator++(); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + std::istringstream inf(" 1 23"); + std::istream_iterator<int> i(inf); + std::istream_iterator<int>& iref = ++i; + assert(&iref == &i); + int j = 0; + j = *i; + assert(j == 23); +} diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/types.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/types.pass.cpp new file mode 100644 index 00000000000..dbfac03ee47 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istream.iterator/types.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <class T, class charT = char, class traits = char_traits<charT>, +// class Distance = ptrdiff_t> +// class istream_iterator +// : public iterator<input_iterator_tag, T, Distance, const T*, const T&> +// { +// public: +// typedef charT char_type; +// typedef traits traits_type; +// typedef basic_istream<charT,traits> istream_type; +// ... + +#include <iterator> +#include <type_traits> + +int main() +{ + typedef std::istream_iterator<double> I1; + static_assert((std::is_convertible<I1, + std::iterator<std::input_iterator_tag, double, std::ptrdiff_t, + const double*, const double&> >::value), ""); + static_assert((std::is_same<I1::char_type, char>::value), ""); + static_assert((std::is_same<I1::traits_type, std::char_traits<char> >::value), ""); + static_assert((std::is_same<I1::istream_type, std::istream>::value), ""); + typedef std::istream_iterator<unsigned, wchar_t> I2; + static_assert((std::is_convertible<I2, + std::iterator<std::input_iterator_tag, unsigned, std::ptrdiff_t, + const unsigned*, const unsigned&> >::value), ""); + static_assert((std::is_same<I2::char_type, wchar_t>::value), ""); + static_assert((std::is_same<I2::traits_type, std::char_traits<wchar_t> >::value), ""); + static_assert((std::is_same<I2::istream_type, std::wistream>::value), ""); +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp new file mode 100644 index 00000000000..cf552a19b70 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// istreambuf_iterator + +// istreambuf_iterator() throw(); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::istreambuf_iterator<char> i; + assert(i == std::istreambuf_iterator<char>()); + } + { + std::istreambuf_iterator<wchar_t> i; + assert(i == std::istreambuf_iterator<wchar_t>()); + } +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/istream.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/istream.pass.cpp new file mode 100644 index 00000000000..9fd4862f5e6 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/istream.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// istreambuf_iterator + +// istreambuf_iterator(basic_istream<charT,traits>& s) throw(); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::istringstream inf; + std::istreambuf_iterator<char> i(inf); + assert(i == std::istreambuf_iterator<char>()); + } + { + std::istringstream inf("a"); + std::istreambuf_iterator<char> i(inf); + assert(i != std::istreambuf_iterator<char>()); + } + { + std::wistringstream inf; + std::istreambuf_iterator<wchar_t> i(inf); + assert(i == std::istreambuf_iterator<wchar_t>()); + } + { + std::wistringstream inf(L"a"); + std::istreambuf_iterator<wchar_t> i(inf); + assert(i != std::istreambuf_iterator<wchar_t>()); + } +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/proxy.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/proxy.pass.cpp new file mode 100644 index 00000000000..79312ac1b76 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/proxy.pass.cpp @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// istreambuf_iterator + +// istreambuf_iterator(const proxy& p) throw(); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::istringstream inf("abc"); + std::istreambuf_iterator<char> j(inf); + std::istreambuf_iterator<char> i = j++; + assert(i != std::istreambuf_iterator<char>()); + assert(*i == 'b'); + } + { + std::wistringstream inf(L"abc"); + std::istreambuf_iterator<wchar_t> j(inf); + std::istreambuf_iterator<wchar_t> i = j++; + assert(i != std::istreambuf_iterator<wchar_t>()); + assert(*i == L'b'); + } +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/streambuf.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/streambuf.pass.cpp new file mode 100644 index 00000000000..459a664aebb --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/streambuf.pass.cpp @@ -0,0 +1,50 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// istreambuf_iterator + +// istreambuf_iterator(basic_streambuf<charT,traits>* s) throw(); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::istreambuf_iterator<char> i(nullptr); + assert(i == std::istreambuf_iterator<char>()); + } + { + std::istringstream inf; + std::istreambuf_iterator<char> i(inf.rdbuf()); + assert(i == std::istreambuf_iterator<char>()); + } + { + std::istringstream inf("a"); + std::istreambuf_iterator<char> i(inf.rdbuf()); + assert(i != std::istreambuf_iterator<char>()); + } + { + std::istreambuf_iterator<wchar_t> i(nullptr); + assert(i == std::istreambuf_iterator<wchar_t>()); + } + { + std::wistringstream inf; + std::istreambuf_iterator<wchar_t> i(inf.rdbuf()); + assert(i == std::istreambuf_iterator<wchar_t>()); + } + { + std::wistringstream inf(L"a"); + std::istreambuf_iterator<wchar_t> i(inf.rdbuf()); + assert(i != std::istreambuf_iterator<wchar_t>()); + } +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::equal/equal.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::equal/equal.pass.cpp new file mode 100644 index 00000000000..20bae45dee2 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::equal/equal.pass.cpp @@ -0,0 +1,78 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// istreambuf_iterator + +// bool equal(istreambuf_iterator<charT,traits>& b) const; + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::istringstream inf1("abc"); + std::istringstream inf2("def"); + std::istreambuf_iterator<char> i1(inf1); + std::istreambuf_iterator<char> i2(inf2); + std::istreambuf_iterator<char> i3; + std::istreambuf_iterator<char> i4; + + assert( i1.equal(i1)); + assert( i1.equal(i2)); + assert(!i1.equal(i3)); + assert(!i1.equal(i4)); + + assert( i2.equal(i1)); + assert( i2.equal(i2)); + assert(!i2.equal(i3)); + assert(!i2.equal(i4)); + + assert(!i3.equal(i1)); + assert(!i3.equal(i2)); + assert( i3.equal(i3)); + assert( i3.equal(i4)); + + assert(!i4.equal(i1)); + assert(!i4.equal(i2)); + assert( i4.equal(i3)); + assert( i4.equal(i4)); + } + { + std::wistringstream inf1(L"abc"); + std::wistringstream inf2(L"def"); + std::istreambuf_iterator<wchar_t> i1(inf1); + std::istreambuf_iterator<wchar_t> i2(inf2); + std::istreambuf_iterator<wchar_t> i3; + std::istreambuf_iterator<wchar_t> i4; + + assert( i1.equal(i1)); + assert( i1.equal(i2)); + assert(!i1.equal(i3)); + assert(!i1.equal(i4)); + + assert( i2.equal(i1)); + assert( i2.equal(i2)); + assert(!i2.equal(i3)); + assert(!i2.equal(i4)); + + assert(!i3.equal(i1)); + assert(!i3.equal(i2)); + assert( i3.equal(i3)); + assert( i3.equal(i4)); + + assert(!i4.equal(i1)); + assert(!i4.equal(i2)); + assert( i4.equal(i3)); + assert( i4.equal(i4)); + } +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op!=/not_equal.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op!=/not_equal.pass.cpp new file mode 100644 index 00000000000..1dd36b951c7 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op!=/not_equal.pass.cpp @@ -0,0 +1,80 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// istreambuf_iterator + +// template <class charT, class traits> +// bool operator!=(const istreambuf_iterator<charT,traits>& a, +// const istreambuf_iterator<charT,traits>& b); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::istringstream inf1("abc"); + std::istringstream inf2("def"); + std::istreambuf_iterator<char> i1(inf1); + std::istreambuf_iterator<char> i2(inf2); + std::istreambuf_iterator<char> i3; + std::istreambuf_iterator<char> i4; + + assert(!(i1 != i1)); + assert(!(i1 != i2)); + assert( (i1 != i3)); + assert( (i1 != i4)); + + assert(!(i2 != i1)); + assert(!(i2 != i2)); + assert( (i2 != i3)); + assert( (i2 != i4)); + + assert( (i3 != i1)); + assert( (i3 != i2)); + assert(!(i3 != i3)); + assert(!(i3 != i4)); + + assert( (i4 != i1)); + assert( (i4 != i2)); + assert(!(i4 != i3)); + assert(!(i4 != i4)); + } + { + std::wistringstream inf1(L"abc"); + std::wistringstream inf2(L"def"); + std::istreambuf_iterator<wchar_t> i1(inf1); + std::istreambuf_iterator<wchar_t> i2(inf2); + std::istreambuf_iterator<wchar_t> i3; + std::istreambuf_iterator<wchar_t> i4; + + assert(!(i1 != i1)); + assert(!(i1 != i2)); + assert( (i1 != i3)); + assert( (i1 != i4)); + + assert(!(i2 != i1)); + assert(!(i2 != i2)); + assert( (i2 != i3)); + assert( (i2 != i4)); + + assert( (i3 != i1)); + assert( (i3 != i2)); + assert(!(i3 != i3)); + assert(!(i3 != i4)); + + assert( (i4 != i1)); + assert( (i4 != i2)); + assert(!(i4 != i3)); + assert(!(i4 != i4)); + } +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op++/dereference.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op++/dereference.pass.cpp new file mode 100644 index 00000000000..3571f844dc2 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op++/dereference.pass.cpp @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// istreambuf_iterator + +// charT operator*() const + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::istringstream inf("abc"); + std::istreambuf_iterator<char> i(inf); + assert(*i == 'a'); + ++i; + assert(*i == 'b'); + ++i; + assert(*i == 'c'); + } + { + std::wistringstream inf(L"abc"); + std::istreambuf_iterator<wchar_t> i(inf); + assert(*i == L'a'); + ++i; + assert(*i == L'b'); + ++i; + assert(*i == L'c'); + } +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op==/equal.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op==/equal.pass.cpp new file mode 100644 index 00000000000..9c0bca4068e --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op==/equal.pass.cpp @@ -0,0 +1,80 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// istreambuf_iterator + +// template <class charT, class traits> +// bool operator==(const istreambuf_iterator<charT,traits>& a, +// const istreambuf_iterator<charT,traits>& b); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::istringstream inf1("abc"); + std::istringstream inf2("def"); + std::istreambuf_iterator<char> i1(inf1); + std::istreambuf_iterator<char> i2(inf2); + std::istreambuf_iterator<char> i3; + std::istreambuf_iterator<char> i4; + + assert( (i1 == i1)); + assert( (i1 == i2)); + assert(!(i1 == i3)); + assert(!(i1 == i4)); + + assert( (i2 == i1)); + assert( (i2 == i2)); + assert(!(i2 == i3)); + assert(!(i2 == i4)); + + assert(!(i3 == i1)); + assert(!(i3 == i2)); + assert( (i3 == i3)); + assert( (i3 == i4)); + + assert(!(i4 == i1)); + assert(!(i4 == i2)); + assert( (i4 == i3)); + assert( (i4 == i4)); + } + { + std::wistringstream inf1(L"abc"); + std::wistringstream inf2(L"def"); + std::istreambuf_iterator<wchar_t> i1(inf1); + std::istreambuf_iterator<wchar_t> i2(inf2); + std::istreambuf_iterator<wchar_t> i3; + std::istreambuf_iterator<wchar_t> i4; + + assert( (i1 == i1)); + assert( (i1 == i2)); + assert(!(i1 == i3)); + assert(!(i1 == i4)); + + assert( (i2 == i1)); + assert( (i2 == i2)); + assert(!(i2 == i3)); + assert(!(i2 == i4)); + + assert(!(i3 == i1)); + assert(!(i3 == i2)); + assert( (i3 == i3)); + assert( (i3 == i4)); + + assert(!(i4 == i1)); + assert(!(i4 == i2)); + assert( (i4 == i3)); + assert( (i4 == i4)); + } +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/arrow.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/arrow.pass.cpp new file mode 100644 index 00000000000..475608b74e8 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/arrow.pass.cpp @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// istreambuf_iterator + +// pointer operator->() const; + +#include <iostream> +#include <sstream> +#include <streambuf> + +typedef char C; +int main () +{ + std::istringstream s("filename"); + std::istreambuf_iterator<char> i(s); + + (*i).~C(); // This is well-formed... + i->~C(); // ... so this should be supported! +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/post_increment.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/post_increment.pass.cpp new file mode 100644 index 00000000000..8c31d5e98f9 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/post_increment.pass.cpp @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// istreambuf_iterator + +// proxy istreambuf_iterator<charT,traits>::operator++(int); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::istringstream inf("abc"); + std::istreambuf_iterator<char> i(inf); + assert(*i++ == 'a'); + assert(*i++ == 'b'); + assert(*i++ == 'c'); + assert(i == std::istreambuf_iterator<char>()); + } + { + std::wistringstream inf(L"abc"); + std::istreambuf_iterator<wchar_t> i(inf); + assert(*i++ == L'a'); + assert(*i++ == L'b'); + assert(*i++ == L'c'); + assert(i == std::istreambuf_iterator<wchar_t>()); + } +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/pre_increment.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/pre_increment.pass.cpp new file mode 100644 index 00000000000..4b315f005f8 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/pre_increment.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// istreambuf_iterator + +// istreambuf_iterator<charT,traits>& +// istreambuf_iterator<charT,traits>::operator++(); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::istringstream inf("abc"); + std::istreambuf_iterator<char> i(inf); + assert(*i == 'a'); + assert(*++i == 'b'); + assert(*++i == 'c'); + assert(++i == std::istreambuf_iterator<char>()); + } + { + std::wistringstream inf(L"abc"); + std::istreambuf_iterator<wchar_t> i(inf); + assert(*i == L'a'); + assert(*++i == L'b'); + assert(*++i == L'c'); + assert(++i == std::istreambuf_iterator<wchar_t>()); + } +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::proxy/proxy.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::proxy/proxy.pass.cpp new file mode 100644 index 00000000000..1f088df19c1 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::proxy/proxy.pass.cpp @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template<class charT, class traits = char_traits<charT> > +// class istreambuf_iterator +// : public iterator<input_iterator_tag, charT, +// typename traits::off_type, charT*, +// charT> +// { +// public: +// ... +// proxy operator++(int); + +// class proxy +// { +// public: +// charT operator*(); +// }; + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::istringstream inf("abc"); + std::istreambuf_iterator<char> i(inf); + assert(*i++ == 'a'); + } + { + std::wistringstream inf(L"abc"); + std::istreambuf_iterator<wchar_t> i(inf); + assert(*i++ == L'a'); + } +} diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp new file mode 100644 index 00000000000..7562332e998 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template<class charT, class traits = char_traits<charT> > +// class istreambuf_iterator +// : public iterator<input_iterator_tag, charT, +// typename traits::off_type, unspecified, +// charT> +// { +// public: +// typedef charT char_type; +// typedef traits traits_type; +// typedef typename traits::int_type int_type; +// typedef basic_streambuf<charT,traits> streambuf_type; +// typedef basic_istream<charT,traits> istream_type; +// ... + +#include <iterator> +#include <string> +#include <type_traits> + +int main() +{ + typedef std::istreambuf_iterator<char> I1; + static_assert((std::is_convertible<I1, + std::iterator<std::input_iterator_tag, char, std::char_traits<char>::off_type, + char*, char> >::value), ""); + static_assert((std::is_same<I1::char_type, char>::value), ""); + static_assert((std::is_same<I1::traits_type, std::char_traits<char> >::value), ""); + static_assert((std::is_same<I1::int_type, I1::traits_type::int_type>::value), ""); + static_assert((std::is_same<I1::streambuf_type, std::streambuf>::value), ""); + static_assert((std::is_same<I1::istream_type, std::istream>::value), ""); + + typedef std::istreambuf_iterator<wchar_t> I2; + static_assert((std::is_convertible<I2, + std::iterator<std::input_iterator_tag, wchar_t, std::char_traits<wchar_t>::off_type, + wchar_t*, wchar_t> >::value), ""); + static_assert((std::is_same<I2::char_type, wchar_t>::value), ""); + static_assert((std::is_same<I2::traits_type, std::char_traits<wchar_t> >::value), ""); + static_assert((std::is_same<I2::int_type, I2::traits_type::int_type>::value), ""); + static_assert((std::is_same<I2::streambuf_type, std::wstreambuf>::value), ""); + static_assert((std::is_same<I2::istream_type, std::wistream>::value), ""); +} diff --git a/libcxx/test/iterators/stream.iterators/iterator.range/begin_array.pass.cpp b/libcxx/test/iterators/stream.iterators/iterator.range/begin_array.pass.cpp new file mode 100644 index 00000000000..9909ea8a004 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/iterator.range/begin_array.pass.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <class T, size_t N> T* begin(T (&array)[N]); + +#include <iterator> +#include <cassert> + +int main() +{ + int ia[] = {1, 2, 3}; + int* i = std::begin(ia); + assert(*i == 1); + *i = 2; + assert(ia[0] == 2); +} diff --git a/libcxx/test/iterators/stream.iterators/iterator.range/begin_const.pass.cpp b/libcxx/test/iterators/stream.iterators/iterator.range/begin_const.pass.cpp new file mode 100644 index 00000000000..71fcce006b1 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/iterator.range/begin_const.pass.cpp @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <class C> auto begin(const C& c) -> decltype(c.begin()); + +#include <vector> +#include <cassert> + +int main() +{ + int ia[] = {1, 2, 3}; + const std::vector<int> v(ia, ia + sizeof(ia)/sizeof(ia[0])); + std::vector<int>::const_iterator i = begin(v); + assert(*i == 1); +} diff --git a/libcxx/test/iterators/stream.iterators/iterator.range/begin_non_const.pass.cpp b/libcxx/test/iterators/stream.iterators/iterator.range/begin_non_const.pass.cpp new file mode 100644 index 00000000000..60aa74dcd86 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/iterator.range/begin_non_const.pass.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <class C> auto begin(C& c) -> decltype(c.begin()); + +#include <vector> +#include <cassert> + +int main() +{ + int ia[] = {1, 2, 3}; + std::vector<int> v(ia, ia + sizeof(ia)/sizeof(ia[0])); + std::vector<int>::iterator i = begin(v); + assert(*i == 1); + *i = 2; + assert(*i == 2); +} diff --git a/libcxx/test/iterators/stream.iterators/iterator.range/end_array.pass.cpp b/libcxx/test/iterators/stream.iterators/iterator.range/end_array.pass.cpp new file mode 100644 index 00000000000..72ab1fb0992 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/iterator.range/end_array.pass.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <class T, size_t N> T* end(T (&array)[N]); + +#include <iterator> +#include <cassert> + +int main() +{ + int ia[] = {1, 2, 3}; + int* i = std::begin(ia); + int* e = std::end(ia); + assert(e == ia + 3); + assert(e - i == 3); +} diff --git a/libcxx/test/iterators/stream.iterators/iterator.range/end_const.pass.cpp b/libcxx/test/iterators/stream.iterators/iterator.range/end_const.pass.cpp new file mode 100644 index 00000000000..f07bd3e9868 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/iterator.range/end_const.pass.cpp @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <class C> auto end(const C& c) -> decltype(c.end()); + +#include <vector> +#include <cassert> + +int main() +{ + int ia[] = {1, 2, 3}; + const std::vector<int> v(ia, ia + sizeof(ia)/sizeof(ia[0])); + std::vector<int>::const_iterator i = end(v); + assert(i == v.cend()); +} diff --git a/libcxx/test/iterators/stream.iterators/iterator.range/end_non_const.pass.cpp b/libcxx/test/iterators/stream.iterators/iterator.range/end_non_const.pass.cpp new file mode 100644 index 00000000000..4571928fc51 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/iterator.range/end_non_const.pass.cpp @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <class C> auto end(C& c) -> decltype(c.end()); + +#include <vector> +#include <cassert> + +int main() +{ + int ia[] = {1, 2, 3}; + std::vector<int> v(ia, ia + sizeof(ia)/sizeof(ia[0])); + std::vector<int>::iterator i = end(v); + assert(i == v.end()); +} diff --git a/libcxx/test/iterators/stream.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/stream.iterators/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..fa4d462f18d --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/copy.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/copy.pass.cpp new file mode 100644 index 00000000000..7c619308edc --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/copy.pass.cpp @@ -0,0 +1,26 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class ostream_iterator + +// ostream_iterator(const ostream_iterator& x); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + std::ostringstream outf; + std::ostream_iterator<int> i(outf); + std::ostream_iterator<int> j = i; + assert(outf.good()); +} diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream.pass.cpp new file mode 100644 index 00000000000..5a5b98d8579 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream.pass.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class ostream_iterator + +// ostream_iterator(ostream_type& s); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + std::ostringstream outf; + std::ostream_iterator<int> i(outf); + assert(outf.good()); +} diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream_delem.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream_delem.pass.cpp new file mode 100644 index 00000000000..f83eddbcac4 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream_delem.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class ostream_iterator + +// ostream_iterator(ostream_type& s, const charT* delimiter); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::ostringstream outf; + std::ostream_iterator<int> i(outf, ", "); + assert(outf.good()); + } + { + std::wostringstream outf; + std::ostream_iterator<double, wchar_t> i(outf, L", "); + assert(outf.good()); + } +} diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/assign_t.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/assign_t.pass.cpp new file mode 100644 index 00000000000..7252cf492c3 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/assign_t.pass.cpp @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class ostream_iterator + +// ostream_iterator& operator=(const T& value); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::ostringstream outf; + std::ostream_iterator<int> i(outf); + i = 2.4; + assert(outf.str() == "2"); + } + { + std::ostringstream outf; + std::ostream_iterator<int> i(outf, ", "); + i = 2.4; + assert(outf.str() == "2, "); + } + { + std::wostringstream outf; + std::ostream_iterator<int, wchar_t> i(outf); + i = 2.4; + assert(outf.str() == L"2"); + } + { + std::wostringstream outf; + std::ostream_iterator<int, wchar_t> i(outf, L", "); + i = 2.4; + assert(outf.str() == L"2, "); + } +} diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/dereference.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/dereference.pass.cpp new file mode 100644 index 00000000000..092deca02b8 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/dereference.pass.cpp @@ -0,0 +1,26 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class ostream_iterator + +// ostream_iterator& operator*() const; + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + std::ostringstream os; + std::ostream_iterator<int> i(os); + std::ostream_iterator<int>& iref = *i; + assert(&iref == &i); +} diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/increment.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/increment.pass.cpp new file mode 100644 index 00000000000..665cac0a1c0 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/increment.pass.cpp @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class ostream_iterator + +// ostream_iterator& operator++(); +// ostream_iterator& operator++(int); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + std::ostringstream os; + std::ostream_iterator<int> i(os); + std::ostream_iterator<int>& iref1 = ++i; + assert(&iref1 == &i); + std::ostream_iterator<int>& iref2 = i++; + assert(&iref2 == &i); +} diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/types.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/types.pass.cpp new file mode 100644 index 00000000000..536c6953298 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/types.pass.cpp @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <class T, class charT = char, class traits = char_traits<charT>, +// class Distance = ptrdiff_t> +// class ostream_iterator +// : public iterator<output_iterator_tag, void, void, void, void> +// { +// public: +// typedef charT char_type; +// typedef traits traits_type; +// typedef basic_istream<charT,traits> istream_type; +// ... + +#include <iterator> +#include <type_traits> + +int main() +{ + typedef std::ostream_iterator<double> I1; + static_assert((std::is_convertible<I1, + std::iterator<std::output_iterator_tag, void, void, void, void> >::value), ""); + static_assert((std::is_same<I1::char_type, char>::value), ""); + static_assert((std::is_same<I1::traits_type, std::char_traits<char> >::value), ""); + static_assert((std::is_same<I1::ostream_type, std::ostream>::value), ""); + typedef std::ostream_iterator<unsigned, wchar_t> I2; + static_assert((std::is_convertible<I2, + std::iterator<std::output_iterator_tag, void, void, void, void> >::value), ""); + static_assert((std::is_same<I2::char_type, wchar_t>::value), ""); + static_assert((std::is_same<I2::traits_type, std::char_traits<wchar_t> >::value), ""); + static_assert((std::is_same<I2::ostream_type, std::wostream>::value), ""); +} diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/ostream.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/ostream.pass.cpp new file mode 100644 index 00000000000..f5641650fde --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/ostream.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class ostreambuf_iterator + +// ostreambuf_iterator(ostream_type& s) throw(); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::ostringstream outf; + std::ostreambuf_iterator<char> i(outf); + assert(!i.failed()); + } + { + std::wostringstream outf; + std::ostreambuf_iterator<wchar_t> i(outf); + assert(!i.failed()); + } +} diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/streambuf.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/streambuf.pass.cpp new file mode 100644 index 00000000000..6634e3e8425 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/streambuf.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class ostreambuf_iterator + +// ostreambuf_iterator(streambuf_type* s) throw(); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::ostringstream outf; + std::ostreambuf_iterator<char> i(outf.rdbuf()); + assert(!i.failed()); + } + { + std::wostringstream outf; + std::ostreambuf_iterator<wchar_t> i(outf.rdbuf()); + assert(!i.failed()); + } +} diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/assign_c.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/assign_c.pass.cpp new file mode 100644 index 00000000000..35f8bb172a7 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/assign_c.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class ostreambuf_iterator + +// ostreambuf_iterator<charT,traits>& +// operator=(charT c); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::ostringstream outf; + std::ostreambuf_iterator<char> i(outf); + i = 'a'; + assert(outf.str() == "a"); + i = 'b'; + assert(outf.str() == "ab"); + } + { + std::wostringstream outf; + std::ostreambuf_iterator<wchar_t> i(outf); + i = L'a'; + assert(outf.str() == L"a"); + i = L'b'; + assert(outf.str() == L"ab"); + } +} diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/deref.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/deref.pass.cpp new file mode 100644 index 00000000000..8a1e5a12235 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/deref.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class ostreambuf_iterator + +// ostreambuf_iterator<charT,traits>& operator*(); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::ostringstream outf; + std::ostreambuf_iterator<char> i(outf); + std::ostreambuf_iterator<char>& iref = *i; + assert(&iref == &i); + } + { + std::wostringstream outf; + std::ostreambuf_iterator<wchar_t> i(outf); + std::ostreambuf_iterator<wchar_t>& iref = *i; + assert(&iref == &i); + } +} diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/failed.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/failed.pass.cpp new file mode 100644 index 00000000000..ff699092b49 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/failed.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class ostreambuf_iterator + +// bool failed() const throw(); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::ostreambuf_iterator<char> i(nullptr); + assert(i.failed()); + } + { + std::ostreambuf_iterator<wchar_t> i(nullptr); + assert(i.failed()); + } +} diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/increment.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/increment.pass.cpp new file mode 100644 index 00000000000..79db9358de5 --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/increment.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// class ostreambuf_iterator + +// ostreambuf_iterator<charT,traits>& operator++(); +// ostreambuf_iterator<charT,traits>& operator++(int); + +#include <iterator> +#include <sstream> +#include <cassert> + +int main() +{ + { + std::ostringstream outf; + std::ostreambuf_iterator<char> i(outf); + std::ostreambuf_iterator<char>& iref = ++i; + assert(&iref == &i); + std::ostreambuf_iterator<char>& iref2 = i++; + assert(&iref2 == &i); + } + { + std::wostringstream outf; + std::ostreambuf_iterator<wchar_t> i(outf); + std::ostreambuf_iterator<wchar_t>& iref = ++i; + assert(&iref == &i); + std::ostreambuf_iterator<wchar_t>& iref2 = i++; + assert(&iref2 == &i); + } +} diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp new file mode 100644 index 00000000000..e2894b9531e --- /dev/null +++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// template <class charT, class traits = char_traits<charT> > +// class ostreambuf_iterator +// : public iterator<output_iterator_tag, void, void, void, void> +// { +// public: +// typedef charT char_type; +// typedef traits traits_type; +// typedef basic_streambuf<charT, traits> streambuf_type; +// typedef basic_ostream<charT, traits> ostream_type; +// ... + +#include <iterator> +#include <string> +#include <type_traits> + +int main() +{ + typedef std::ostreambuf_iterator<char> I1; + static_assert((std::is_convertible<I1, + std::iterator<std::output_iterator_tag, void, void, void, void> >::value), ""); + static_assert((std::is_same<I1::char_type, char>::value), ""); + static_assert((std::is_same<I1::traits_type, std::char_traits<char> >::value), ""); + static_assert((std::is_same<I1::streambuf_type, std::streambuf>::value), ""); + static_assert((std::is_same<I1::ostream_type, std::ostream>::value), ""); + + typedef std::ostreambuf_iterator<wchar_t> I2; + static_assert((std::is_convertible<I2, + std::iterator<std::output_iterator_tag, void, void, void, void> >::value), ""); + static_assert((std::is_same<I2::char_type, wchar_t>::value), ""); + static_assert((std::is_same<I2::traits_type, std::char_traits<wchar_t> >::value), ""); + static_assert((std::is_same<I2::streambuf_type, std::wstreambuf>::value), ""); + static_assert((std::is_same<I2::ostream_type, std::wostream>::value), ""); +} diff --git a/libcxx/test/iterators/version.pass.cpp b/libcxx/test/iterators/version.pass.cpp new file mode 100644 index 00000000000..19cb755d6c2 --- /dev/null +++ b/libcxx/test/iterators/version.pass.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +#include <iterator> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} |