Index: test/std/experimental/iterator/nothing_to_do.pass.cpp =================================================================== --- test/std/experimental/iterator/nothing_to_do.pass.cpp +++ test/std/experimental/iterator/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include + +int main () {} Index: test/std/experimental/iterator/ostream.joiner/ostream.joiner.cons/ostream_joiner.cons.pass.cpp =================================================================== --- test/std/experimental/iterator/ostream.joiner/ostream.joiner.cons/ostream_joiner.cons.pass.cpp +++ test/std/experimental/iterator/ostream.joiner/ostream.joiner.cons/ostream_joiner.cons.pass.cpp @@ -0,0 +1,58 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11 + +// +// +// template > +// class ostream_joiner; +// +// ostream_joiner(ostream_type& __os, _Delim&& __d); +// ostream_joiner(ostream_type& __os, const _Delim& __d); + +#include +#include +#include + +#include "test_macros.h" + +namespace exp = std::experimental; + +int main () { + const char eight = '8'; + const std::string nine = "9"; + const std::wstring ten = L"10"; + const int eleven = 11; + +// Narrow streams w/rvalues + { exp::ostream_joiner oj(std::cout, '8'); } + { exp::ostream_joiner oj(std::cout, std::string("9")); } + { exp::ostream_joiner oj(std::cout, std::wstring(L"10")); } + { exp::ostream_joiner oj(std::cout, 11); } + +// Narrow streams w/lvalues + { exp::ostream_joiner oj(std::cout, eight); } + { exp::ostream_joiner oj(std::cout, nine); } + { exp::ostream_joiner oj(std::cout, ten); } + { exp::ostream_joiner oj(std::cout, eleven); } + +// Wide streams w/rvalues + { exp::ostream_joiner oj(std::wcout, '8'); } + { exp::ostream_joiner oj(std::wcout, std::string("9")); } + { exp::ostream_joiner oj(std::wcout, std::wstring(L"10")); } + { exp::ostream_joiner oj(std::wcout, 11); } + +// Wide streams w/lvalues + { exp::ostream_joiner oj(std::wcout, eight); } + { exp::ostream_joiner oj(std::wcout, nine); } + { exp::ostream_joiner oj(std::wcout, ten); } + { exp::ostream_joiner oj(std::wcout, eleven); } + + } Index: test/std/experimental/iterator/ostream.joiner/ostream.joiner.creation/make_ostream_joiner.pass.cpp =================================================================== --- test/std/experimental/iterator/ostream.joiner/ostream.joiner.creation/make_ostream_joiner.pass.cpp +++ test/std/experimental/iterator/ostream.joiner/ostream.joiner.creation/make_ostream_joiner.pass.cpp @@ -0,0 +1,53 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11 + +// +// +// template > +// class ostream_joiner; +// +// template +// ostream_joiner::type, _CharT, _Traits> +// make_ostream_joiner(basic_ostream<_CharT, _Traits>& __os, _Delim && __d); +// + +#include +#include +#include +#include + +#include "test_macros.h" +#include "test_iterators.h" + +namespace exp = std::experimental; + +template > +void test (Delim &&d, Iter first, Iter last, const CharT *expected ) { + std::basic_stringstream sstream; + auto joiner = exp::make_ostream_joiner(sstream, d); + typedef exp::ostream_joiner::type, CharT, Traits> Joiner; + static_assert((std::is_same::value), "" ); + while (first != last) + joiner = *first++; + assert(sstream.str() == expected); + } + +int main () { + const char chars[] = "0123456789"; + const int ints [] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; + +// There are more of these tests in another file. +// This is just to make sure that the ostream_joiner is created correctly + test('X', chars, chars+10, "0X1X2X3X4X5X6X7X8X9"); + test('x', ints, ints+10, "10x11x12x13x14x15x16x17x18x19"); + test("Z", chars, chars+10, "0Z1Z2Z3Z4Z5Z6Z7Z8Z9"); + test("z", ints, ints+10, "10z11z12z13z14z15z16z17z18z19"); + } Index: test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.assign.pass.cpp =================================================================== --- test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.assign.pass.cpp +++ test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.assign.pass.cpp @@ -0,0 +1,120 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11 + +// +// +// template > +// class ostream_joiner; +// +// template +// ostream_joiner & operator=(const T&) +// + +#include +#include +#include +#include + +#include "test_macros.h" +#include "test_iterators.h" + +struct mutating_delimiter { + mutating_delimiter(char c = ' ') : c_(c) {} + char get () const { return c_++; } + mutable char c_; + }; + +template +std::basic_ostream<_CharT, _Traits>& +operator<<(std::basic_ostream<_CharT, _Traits>& os, const mutating_delimiter &d) +{ return os << d.get(); } + + +struct mutating_delimiter2 { // same as above, w/o the const and the mutable + mutating_delimiter2(char c = ' ') : c_(c) {} + char get () { return c_++; } + char c_; + }; + +template +std::basic_ostream<_CharT, _Traits>& +operator<<(std::basic_ostream<_CharT, _Traits>& os, mutating_delimiter2 &d) +{ return os << d.get(); } + + +namespace exp = std::experimental; + +template > +void test (Delim &&d, Iter first, Iter last, const CharT *expected ) { + typedef exp::ostream_joiner::type, CharT, Traits> Joiner; + + static_assert((std::is_copy_constructible::value == std::is_copy_constructible::type>::value), "" ); + static_assert((std::is_move_constructible::value == std::is_move_constructible::type>::value), "" ); + static_assert((std::is_copy_assignable ::value == std::is_copy_assignable::type> ::value), "" ); + static_assert((std::is_move_assignable ::value == std::is_move_assignable::type> ::value), "" ); + + std::basic_stringstream sstream; + Joiner joiner(sstream, d); + while (first != last) + *joiner++ = *first++; + assert(sstream.str() == expected); + } + +int main () { +{ + const char chars[] = "0123456789"; + const int ints [] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; + + test('X', chars, chars+10, "0X1X2X3X4X5X6X7X8X9"); + test('x', ints, ints+10, "10x11x12x13x14x15x16x17x18x19"); + test('X', input_iterator(chars), input_iterator(chars+10), "0X1X2X3X4X5X6X7X8X9"); + test('x', input_iterator(ints), input_iterator(ints+10), "10x11x12x13x14x15x16x17x18x19"); + test('X', forward_iterator(chars), forward_iterator(chars+10), "0X1X2X3X4X5X6X7X8X9"); + test('x', forward_iterator(ints), forward_iterator(ints+10), "10x11x12x13x14x15x16x17x18x19"); + test('X', random_access_iterator(chars), random_access_iterator(chars+10), "0X1X2X3X4X5X6X7X8X9"); + test('x', random_access_iterator(ints), random_access_iterator(ints+10), "10x11x12x13x14x15x16x17x18x19"); + + test("Z", chars, chars+10, "0Z1Z2Z3Z4Z5Z6Z7Z8Z9"); + test("z", ints, ints+10, "10z11z12z13z14z15z16z17z18z19"); + + test ('X', chars, chars+10, L"0X1X2X3X4X5X6X7X8X9"); + test ('x', ints, ints+10, L"10x11x12x13x14x15x16x17x18x19"); +// test('X', chars, chars+10, u"0X1X2X3X4X5X6X7X8X9"); +// test('x', ints, ints+10, u"10x11x12x13x14x15x16x17x18x19"); +// test('X', chars, chars+10, U"0X1X2X3X4X5X6X7X8X9"); +// test('x', ints, ints+10, U"10x11x12x13x14x15x16x17x18x19"); + + test(mutating_delimiter(), chars, chars+10, "0 1!2\"3#4$5%6&7'8(9"); + test(mutating_delimiter2(), chars, chars+10, "0 1!2\"3#4$5%6&7'8(9"); + } + + { + const wchar_t chars[] = L"0123456789"; + const int ints [] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; + test(L'X', chars, chars+10, L"0X1X2X3X4X5X6X7X8X9"); + test(L'x', ints, ints+10, L"10x11x12x13x14x15x16x17x18x19"); + test(L'X', input_iterator(chars), input_iterator(chars+10), L"0X1X2X3X4X5X6X7X8X9"); + test(L'x', input_iterator(ints), input_iterator(ints+10), L"10x11x12x13x14x15x16x17x18x19"); + test(L'X', forward_iterator(chars), forward_iterator(chars+10), L"0X1X2X3X4X5X6X7X8X9"); + test(L'x', forward_iterator(ints), forward_iterator(ints+10), L"10x11x12x13x14x15x16x17x18x19"); + test(L'X', random_access_iterator(chars), random_access_iterator(chars+10), L"0X1X2X3X4X5X6X7X8X9"); + test(L'x', random_access_iterator(ints), random_access_iterator(ints+10), L"10x11x12x13x14x15x16x17x18x19"); + + test(L"Z", chars, chars+10, L"0Z1Z2Z3Z4Z5Z6Z7Z8Z9"); + test(L"z", ints, ints+10, L"10z11z12z13z14z15z16z17z18z19"); + + test ('X', chars, chars+10, L"0X1X2X3X4X5X6X7X8X9"); + test ('x', ints, ints+10, L"10x11x12x13x14x15x16x17x18x19"); + + test(mutating_delimiter(), chars, chars+10, L"0 1!2\"3#4$5%6&7'8(9"); + } + +} Index: test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.postincrement.pass.cpp =================================================================== --- test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.postincrement.pass.cpp +++ test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.postincrement.pass.cpp @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11 + +// +// +// template > +// class ostream_joiner; +// +// ostream_joiner & operator++(int) noexcept +// returns *this; + +#include +#include +#include + +#include "test_macros.h" + +namespace exp = std::experimental; + +template +void test ( exp::ostream_joiner &oj ) { + static_assert((noexcept(oj++)), "" ); + exp::ostream_joiner &ret = oj++; + assert( &ret == &oj ); + } + +int main () { + + { exp::ostream_joiner oj(std::cout, '8'); test(oj); } + { exp::ostream_joiner oj(std::cout, std::string("9")); test(oj); } + { exp::ostream_joiner oj(std::cout, std::wstring(L"10")); test(oj); } + { exp::ostream_joiner oj(std::cout, 11); test(oj); } + + { exp::ostream_joiner oj(std::wcout, '8'); test(oj); } + { exp::ostream_joiner oj(std::wcout, std::string("9")); test(oj); } + { exp::ostream_joiner oj(std::wcout, std::wstring(L"10")); test(oj); } + { exp::ostream_joiner oj(std::wcout, 11); test(oj); } + } Index: test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.pretincrement.pass.cpp =================================================================== --- test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.pretincrement.pass.cpp +++ test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.pretincrement.pass.cpp @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11 + +// +// +// template > +// class ostream_joiner; +// +// ostream_joiner & operator++() noexcept +// returns *this; + +#include +#include +#include + +#include "test_macros.h" + +namespace exp = std::experimental; + +template +void test ( exp::ostream_joiner &oj ) { + static_assert((noexcept(++oj)), "" ); + exp::ostream_joiner &ret = ++oj; + assert( &ret == &oj ); + } + +int main () { + + { exp::ostream_joiner oj(std::cout, '8'); test(oj); } + { exp::ostream_joiner oj(std::cout, std::string("9")); test(oj); } + { exp::ostream_joiner oj(std::cout, std::wstring(L"10")); test(oj); } + { exp::ostream_joiner oj(std::cout, 11); test(oj); } + + { exp::ostream_joiner oj(std::wcout, '8'); test(oj); } + { exp::ostream_joiner oj(std::wcout, std::string("9")); test(oj); } + { exp::ostream_joiner oj(std::wcout, std::wstring(L"10")); test(oj); } + { exp::ostream_joiner oj(std::wcout, 11); test(oj); } + } Index: test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.star.pass.cpp =================================================================== --- test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.star.pass.cpp +++ test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.star.pass.cpp @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11 + +// +// +// template > +// class ostream_joiner; +// +// ostream_joiner & operator*() noexcept +// returns *this; + +#include +#include +#include + +#include "test_macros.h" + +namespace exp = std::experimental; + +template +void test ( exp::ostream_joiner &oj ) { + static_assert((noexcept(*oj)), "" ); + exp::ostream_joiner &ret = *oj; + assert( &ret == &oj ); + } + +int main () { + + { exp::ostream_joiner oj(std::cout, '8'); test(oj); } + { exp::ostream_joiner oj(std::cout, std::string("9")); test(oj); } + { exp::ostream_joiner oj(std::cout, std::wstring(L"10")); test(oj); } + { exp::ostream_joiner oj(std::cout, 11); test(oj); } + + { exp::ostream_joiner oj(std::wcout, '8'); test(oj); } + { exp::ostream_joiner oj(std::wcout, std::string("9")); test(oj); } + { exp::ostream_joiner oj(std::wcout, std::wstring(L"10")); test(oj); } + { exp::ostream_joiner oj(std::wcout, 11); test(oj); } + }