1e78f53d1SNikolas Klauser// -*- C++ -*- 2e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 3e78f53d1SNikolas Klauser// 4e78f53d1SNikolas Klauser// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e78f53d1SNikolas Klauser// See https://llvm.org/LICENSE.txt for license information. 6e78f53d1SNikolas Klauser// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e78f53d1SNikolas Klauser// 8e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 9e78f53d1SNikolas Klauser 10*ce777190SNikolas Klauser#ifndef _LIBCPP___CXX03_EXPERIMENTAL_ITERATOR 11*ce777190SNikolas Klauser#define _LIBCPP___CXX03_EXPERIMENTAL_ITERATOR 12e78f53d1SNikolas Klauser 13e78f53d1SNikolas Klauser/* 14e78f53d1SNikolas Klausernamespace std { 15e78f53d1SNikolas Klauser namespace experimental { 16e78f53d1SNikolas Klauser inline namespace fundamentals_v2 { 17e78f53d1SNikolas Klauser 18e78f53d1SNikolas Klauser template <class DelimT, class charT = char, class traits = char_traits<charT>> 19e78f53d1SNikolas Klauser class ostream_joiner { 20e78f53d1SNikolas Klauser public: 21e78f53d1SNikolas Klauser typedef charT char_type; 22e78f53d1SNikolas Klauser typedef traits traits_type; 23e78f53d1SNikolas Klauser typedef basic_ostream<charT, traits> ostream_type; 24e78f53d1SNikolas Klauser typedef output_iterator_tag iterator_category; 25e78f53d1SNikolas Klauser typedef void value_type; 26e78f53d1SNikolas Klauser typedef void difference_type; 27e78f53d1SNikolas Klauser typedef void pointer; 28e78f53d1SNikolas Klauser typedef void reference; 29e78f53d1SNikolas Klauser 30e78f53d1SNikolas Klauser ostream_joiner(ostream_type& s, const DelimT& delimiter); 31e78f53d1SNikolas Klauser ostream_joiner(ostream_type& s, DelimT&& delimiter); 32e78f53d1SNikolas Klauser 33e78f53d1SNikolas Klauser template<typename T> 34e78f53d1SNikolas Klauser ostream_joiner& operator=(const T& value); 35e78f53d1SNikolas Klauser 36e78f53d1SNikolas Klauser ostream_joiner& operator*() noexcept; 37e78f53d1SNikolas Klauser ostream_joiner& operator++() noexcept; 38e78f53d1SNikolas Klauser ostream_joiner& operator++(int) noexcept; 39e78f53d1SNikolas Klauser private: 40e78f53d1SNikolas Klauser ostream_type* out_stream; // exposition only 41e78f53d1SNikolas Klauser DelimT delim; // exposition only 42e78f53d1SNikolas Klauser bool first_element; // exposition only 43e78f53d1SNikolas Klauser }; 44e78f53d1SNikolas Klauser 45e78f53d1SNikolas Klauser template <class charT, class traits, class DelimT> 46e78f53d1SNikolas Klauser ostream_joiner<decay_t<DelimT>, charT, traits> 47e78f53d1SNikolas Klauser make_ostream_joiner(basic_ostream<charT, traits>& os, DelimT&& delimiter); 48e78f53d1SNikolas Klauser 49e78f53d1SNikolas Klauser } // inline namespace fundamentals_v2 50e78f53d1SNikolas Klauser } // namespace experimental 51e78f53d1SNikolas Klauser} // namespace std 52e78f53d1SNikolas Klauser 53e78f53d1SNikolas Klauser*/ 54e78f53d1SNikolas Klauser 5573fbae83SNikolas Klauser#include <__cxx03/__memory/addressof.h> 5673fbae83SNikolas Klauser#include <__cxx03/__type_traits/decay.h> 5773fbae83SNikolas Klauser#include <__cxx03/__utility/forward.h> 5873fbae83SNikolas Klauser#include <__cxx03/__utility/move.h> 5973fbae83SNikolas Klauser#include <__cxx03/experimental/__config> 6073fbae83SNikolas Klauser#include <__cxx03/iterator> 61e78f53d1SNikolas Klauser 62e78f53d1SNikolas Klauser#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 63e78f53d1SNikolas Klauser# pragma GCC system_header 64e78f53d1SNikolas Klauser#endif 65e78f53d1SNikolas Klauser 66e78f53d1SNikolas Klauser_LIBCPP_PUSH_MACROS 6773fbae83SNikolas Klauser#include <__cxx03/__undef_macros> 68e78f53d1SNikolas Klauser 69e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 70e78f53d1SNikolas Klauser 71e78f53d1SNikolas Klauser_LIBCPP_BEGIN_NAMESPACE_LFTS 72e78f53d1SNikolas Klauser 73e78f53d1SNikolas Klausertemplate <class _Delim, class _CharT = char, class _Traits = char_traits<_CharT>> 74e78f53d1SNikolas Klauserclass ostream_joiner { 75e78f53d1SNikolas Klauserpublic: 76e78f53d1SNikolas Klauser typedef _CharT char_type; 77e78f53d1SNikolas Klauser typedef _Traits traits_type; 78e78f53d1SNikolas Klauser typedef basic_ostream<char_type, traits_type> ostream_type; 79e78f53d1SNikolas Klauser typedef output_iterator_tag iterator_category; 80e78f53d1SNikolas Klauser typedef void value_type; 81e78f53d1SNikolas Klauser typedef void difference_type; 82e78f53d1SNikolas Klauser typedef void pointer; 83e78f53d1SNikolas Klauser typedef void reference; 84e78f53d1SNikolas Klauser 85e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI ostream_joiner(ostream_type& __os, _Delim&& __d) 86e78f53d1SNikolas Klauser : __output_iter_(std::addressof(__os)), __delim_(std::move(__d)), __first_(true) {} 87e78f53d1SNikolas Klauser 88e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI ostream_joiner(ostream_type& __os, const _Delim& __d) 89e78f53d1SNikolas Klauser : __output_iter_(std::addressof(__os)), __delim_(__d), __first_(true) {} 90e78f53d1SNikolas Klauser 91e78f53d1SNikolas Klauser template <typename _Tp> 92e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI ostream_joiner& operator=(const _Tp& __v) { 93e78f53d1SNikolas Klauser if (!__first_) 94e78f53d1SNikolas Klauser *__output_iter_ << __delim_; 95e78f53d1SNikolas Klauser __first_ = false; 96e78f53d1SNikolas Klauser *__output_iter_ << __v; 97e78f53d1SNikolas Klauser return *this; 98e78f53d1SNikolas Klauser } 99e78f53d1SNikolas Klauser 100e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI ostream_joiner& operator*() _NOEXCEPT { return *this; } 101e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI ostream_joiner& operator++() _NOEXCEPT { return *this; } 102e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI ostream_joiner& operator++(int) _NOEXCEPT { return *this; } 103e78f53d1SNikolas Klauser 104e78f53d1SNikolas Klauserprivate: 105e78f53d1SNikolas Klauser ostream_type* __output_iter_; 106e78f53d1SNikolas Klauser _Delim __delim_; 107e78f53d1SNikolas Klauser bool __first_; 108e78f53d1SNikolas Klauser}; 109e78f53d1SNikolas Klauser 110e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits, class _Delim> 111e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI ostream_joiner<__decay_t<_Delim>, _CharT, _Traits> 112e78f53d1SNikolas Klausermake_ostream_joiner(basic_ostream<_CharT, _Traits>& __os, _Delim&& __d) { 113e78f53d1SNikolas Klauser return ostream_joiner<__decay_t<_Delim>, _CharT, _Traits>(__os, std::forward<_Delim>(__d)); 114e78f53d1SNikolas Klauser} 115e78f53d1SNikolas Klauser 116e78f53d1SNikolas Klauser_LIBCPP_END_NAMESPACE_LFTS 117e78f53d1SNikolas Klauser 118e78f53d1SNikolas Klauser#endif // _LIBCPP_STD_VER >= 14 119e78f53d1SNikolas Klauser 120e78f53d1SNikolas Klauser_LIBCPP_POP_MACROS 121e78f53d1SNikolas Klauser 122e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 12373fbae83SNikolas Klauser# include <__cxx03/iosfwd> 12473fbae83SNikolas Klauser# include <__cxx03/type_traits> 125e78f53d1SNikolas Klauser#endif 126e78f53d1SNikolas Klauser 127*ce777190SNikolas Klauser#endif // _LIBCPP___CXX03_EXPERIMENTAL_ITERATOR 128