1*0b57cec5SDimitry Andric// -*- C++ -*- 2*0b57cec5SDimitry Andric//===----------------------------- iterator -------------------------------===// 3*0b57cec5SDimitry Andric// 4*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 6*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*0b57cec5SDimitry Andric// 8*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 9*0b57cec5SDimitry Andric 10*0b57cec5SDimitry Andric#ifndef _LIBCPP_EXPERIMENTAL_ITERATOR 11*0b57cec5SDimitry Andric#define _LIBCPP_EXPERIMENTAL_ITERATOR 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric/* 14*0b57cec5SDimitry Andricnamespace std { 15*0b57cec5SDimitry Andric namespace experimental { 16*0b57cec5SDimitry Andric inline namespace fundamentals_v2 { 17*0b57cec5SDimitry Andric 18*0b57cec5SDimitry Andric template <class DelimT, class charT = char, class traits = char_traits<charT>> 19*0b57cec5SDimitry Andric class ostream_joiner { 20*0b57cec5SDimitry Andric public: 21*0b57cec5SDimitry Andric typedef charT char_type; 22*0b57cec5SDimitry Andric typedef traits traits_type; 23*0b57cec5SDimitry Andric typedef basic_ostream<charT, traits> ostream_type; 24*0b57cec5SDimitry Andric typedef output_iterator_tag iterator_category; 25*0b57cec5SDimitry Andric typedef void value_type; 26*0b57cec5SDimitry Andric typedef void difference_type; 27*0b57cec5SDimitry Andric typedef void pointer; 28*0b57cec5SDimitry Andric typedef void reference; 29*0b57cec5SDimitry Andric 30*0b57cec5SDimitry Andric ostream_joiner(ostream_type& s, const DelimT& delimiter); 31*0b57cec5SDimitry Andric ostream_joiner(ostream_type& s, DelimT&& delimiter); 32*0b57cec5SDimitry Andric 33*0b57cec5SDimitry Andric template<typename T> 34*0b57cec5SDimitry Andric ostream_joiner& operator=(const T& value); 35*0b57cec5SDimitry Andric 36*0b57cec5SDimitry Andric ostream_joiner& operator*() noexcept; 37*0b57cec5SDimitry Andric ostream_joiner& operator++() noexcept; 38*0b57cec5SDimitry Andric ostream_joiner& operator++(int) noexcept; 39*0b57cec5SDimitry Andric private: 40*0b57cec5SDimitry Andric ostream_type* out_stream; // exposition only 41*0b57cec5SDimitry Andric DelimT delim; // exposition only 42*0b57cec5SDimitry Andric bool first_element; // exposition only 43*0b57cec5SDimitry Andric }; 44*0b57cec5SDimitry Andric 45*0b57cec5SDimitry Andric template <class charT, class traits, class DelimT> 46*0b57cec5SDimitry Andric ostream_joiner<decay_t<DelimT>, charT, traits> 47*0b57cec5SDimitry Andric make_ostream_joiner(basic_ostream<charT, traits>& os, DelimT&& delimiter); 48*0b57cec5SDimitry Andric 49*0b57cec5SDimitry Andric } // inline namespace fundamentals_v2 50*0b57cec5SDimitry Andric } // namespace experimental 51*0b57cec5SDimitry Andric} // namespace std 52*0b57cec5SDimitry Andric 53*0b57cec5SDimitry Andric*/ 54*0b57cec5SDimitry Andric 55*0b57cec5SDimitry Andric#include <experimental/__config> 56*0b57cec5SDimitry Andric 57*0b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 11 58*0b57cec5SDimitry Andric 59*0b57cec5SDimitry Andric#include <iterator> 60*0b57cec5SDimitry Andric 61*0b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_LFTS 62*0b57cec5SDimitry Andric 63*0b57cec5SDimitry Andrictemplate <class _Delim, class _CharT = char, class _Traits = char_traits<_CharT>> 64*0b57cec5SDimitry Andricclass ostream_joiner { 65*0b57cec5SDimitry Andricpublic: 66*0b57cec5SDimitry Andric 67*0b57cec5SDimitry Andric typedef _CharT char_type; 68*0b57cec5SDimitry Andric typedef _Traits traits_type; 69*0b57cec5SDimitry Andric typedef basic_ostream<char_type,traits_type> ostream_type; 70*0b57cec5SDimitry Andric typedef output_iterator_tag iterator_category; 71*0b57cec5SDimitry Andric typedef void value_type; 72*0b57cec5SDimitry Andric typedef void difference_type; 73*0b57cec5SDimitry Andric typedef void pointer; 74*0b57cec5SDimitry Andric typedef void reference; 75*0b57cec5SDimitry Andric 76*0b57cec5SDimitry Andric ostream_joiner(ostream_type& __os, _Delim&& __d) 77*0b57cec5SDimitry Andric : __output_iter(_VSTD::addressof(__os)), __delim(_VSTD::move(__d)), __first(true) {} 78*0b57cec5SDimitry Andric 79*0b57cec5SDimitry Andric ostream_joiner(ostream_type& __os, const _Delim& __d) 80*0b57cec5SDimitry Andric : __output_iter(_VSTD::addressof(__os)), __delim(__d), __first(true) {} 81*0b57cec5SDimitry Andric 82*0b57cec5SDimitry Andric 83*0b57cec5SDimitry Andric template<typename _Tp> 84*0b57cec5SDimitry Andric ostream_joiner& operator=(const _Tp& __v) 85*0b57cec5SDimitry Andric { 86*0b57cec5SDimitry Andric if (!__first) 87*0b57cec5SDimitry Andric *__output_iter << __delim; 88*0b57cec5SDimitry Andric __first = false; 89*0b57cec5SDimitry Andric *__output_iter << __v; 90*0b57cec5SDimitry Andric return *this; 91*0b57cec5SDimitry Andric } 92*0b57cec5SDimitry Andric 93*0b57cec5SDimitry Andric ostream_joiner& operator*() _NOEXCEPT { return *this; } 94*0b57cec5SDimitry Andric ostream_joiner& operator++() _NOEXCEPT { return *this; } 95*0b57cec5SDimitry Andric ostream_joiner& operator++(int) _NOEXCEPT { return *this; } 96*0b57cec5SDimitry Andric 97*0b57cec5SDimitry Andricprivate: 98*0b57cec5SDimitry Andric ostream_type* __output_iter; 99*0b57cec5SDimitry Andric _Delim __delim; 100*0b57cec5SDimitry Andric bool __first; 101*0b57cec5SDimitry Andric}; 102*0b57cec5SDimitry Andric 103*0b57cec5SDimitry Andric 104*0b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Delim> 105*0b57cec5SDimitry Andricostream_joiner<typename decay<_Delim>::type, _CharT, _Traits> 106*0b57cec5SDimitry Andricmake_ostream_joiner(basic_ostream<_CharT, _Traits>& __os, _Delim && __d) 107*0b57cec5SDimitry Andric{ return ostream_joiner<typename decay<_Delim>::type, _CharT, _Traits>(__os, _VSTD::forward<_Delim>(__d)); } 108*0b57cec5SDimitry Andric 109*0b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_LFTS 110*0b57cec5SDimitry Andric 111*0b57cec5SDimitry Andric#endif /* _LIBCPP_STD_VER > 11 */ 112*0b57cec5SDimitry Andric 113*0b57cec5SDimitry Andric#endif // _LIBCPP_EXPERIMENTAL_ITERATOR 114