146035553Spatrick// -*- C++ -*- 2*4bdff4beSrobert//===----------------------------------------------------------------------===// 346035553Spatrick// 446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 546035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 746035553Spatrick// 846035553Spatrick//===----------------------------------------------------------------------===// 946035553Spatrick 1046035553Spatrick#ifndef _LIBCPP_EXPERIMENTAL_ITERATOR 1146035553Spatrick#define _LIBCPP_EXPERIMENTAL_ITERATOR 1246035553Spatrick 1346035553Spatrick/* 1446035553Spatricknamespace std { 1546035553Spatrick namespace experimental { 1646035553Spatrick inline namespace fundamentals_v2 { 1746035553Spatrick 1846035553Spatrick template <class DelimT, class charT = char, class traits = char_traits<charT>> 1946035553Spatrick class ostream_joiner { 2046035553Spatrick public: 2146035553Spatrick typedef charT char_type; 2246035553Spatrick typedef traits traits_type; 2346035553Spatrick typedef basic_ostream<charT, traits> ostream_type; 2446035553Spatrick typedef output_iterator_tag iterator_category; 2546035553Spatrick typedef void value_type; 2646035553Spatrick typedef void difference_type; 2746035553Spatrick typedef void pointer; 2846035553Spatrick typedef void reference; 2946035553Spatrick 3046035553Spatrick ostream_joiner(ostream_type& s, const DelimT& delimiter); 3146035553Spatrick ostream_joiner(ostream_type& s, DelimT&& delimiter); 3246035553Spatrick 3346035553Spatrick template<typename T> 3446035553Spatrick ostream_joiner& operator=(const T& value); 3546035553Spatrick 3646035553Spatrick ostream_joiner& operator*() noexcept; 3746035553Spatrick ostream_joiner& operator++() noexcept; 3846035553Spatrick ostream_joiner& operator++(int) noexcept; 3946035553Spatrick private: 4046035553Spatrick ostream_type* out_stream; // exposition only 4146035553Spatrick DelimT delim; // exposition only 4246035553Spatrick bool first_element; // exposition only 4346035553Spatrick }; 4446035553Spatrick 4546035553Spatrick template <class charT, class traits, class DelimT> 4646035553Spatrick ostream_joiner<decay_t<DelimT>, charT, traits> 4746035553Spatrick make_ostream_joiner(basic_ostream<charT, traits>& os, DelimT&& delimiter); 4846035553Spatrick 4946035553Spatrick } // inline namespace fundamentals_v2 5046035553Spatrick } // namespace experimental 5146035553Spatrick} // namespace std 5246035553Spatrick 5346035553Spatrick*/ 5446035553Spatrick 55*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler 56*4bdff4beSrobert#include <__memory/addressof.h> 57*4bdff4beSrobert#include <__type_traits/decay.h> 58*4bdff4beSrobert#include <__utility/forward.h> 59*4bdff4beSrobert#include <__utility/move.h> 6046035553Spatrick#include <experimental/__config> 61*4bdff4beSrobert#include <iosfwd> // char_traits 62*4bdff4beSrobert#include <iterator> 63*4bdff4beSrobert 64*4bdff4beSrobert#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 65*4bdff4beSrobert# pragma GCC system_header 66*4bdff4beSrobert#endif 6746035553Spatrick 6846035553Spatrick#if _LIBCPP_STD_VER > 11 6946035553Spatrick 7046035553Spatrick_LIBCPP_BEGIN_NAMESPACE_LFTS 7146035553Spatrick 7246035553Spatricktemplate <class _Delim, class _CharT = char, class _Traits = char_traits<_CharT>> 7346035553Spatrickclass ostream_joiner { 7446035553Spatrickpublic: 7546035553Spatrick 7646035553Spatrick typedef _CharT char_type; 7746035553Spatrick typedef _Traits traits_type; 7846035553Spatrick typedef basic_ostream<char_type,traits_type> ostream_type; 7946035553Spatrick typedef output_iterator_tag iterator_category; 8046035553Spatrick typedef void value_type; 8146035553Spatrick typedef void difference_type; 8246035553Spatrick typedef void pointer; 8346035553Spatrick typedef void reference; 8446035553Spatrick 8546035553Spatrick ostream_joiner(ostream_type& __os, _Delim&& __d) 86*4bdff4beSrobert : __output_iter_(_VSTD::addressof(__os)), __delim_(_VSTD::move(__d)), __first_(true) {} 8746035553Spatrick 8846035553Spatrick ostream_joiner(ostream_type& __os, const _Delim& __d) 89*4bdff4beSrobert : __output_iter_(_VSTD::addressof(__os)), __delim_(__d), __first_(true) {} 9046035553Spatrick 9146035553Spatrick 9246035553Spatrick template<typename _Tp> 9346035553Spatrick ostream_joiner& operator=(const _Tp& __v) 9446035553Spatrick { 95*4bdff4beSrobert if (!__first_) 96*4bdff4beSrobert *__output_iter_ << __delim_; 97*4bdff4beSrobert __first_ = false; 98*4bdff4beSrobert *__output_iter_ << __v; 9946035553Spatrick return *this; 10046035553Spatrick } 10146035553Spatrick 10246035553Spatrick ostream_joiner& operator*() _NOEXCEPT { return *this; } 10346035553Spatrick ostream_joiner& operator++() _NOEXCEPT { return *this; } 10446035553Spatrick ostream_joiner& operator++(int) _NOEXCEPT { return *this; } 10546035553Spatrick 10646035553Spatrickprivate: 107*4bdff4beSrobert ostream_type* __output_iter_; 108*4bdff4beSrobert _Delim __delim_; 109*4bdff4beSrobert bool __first_; 11046035553Spatrick}; 11146035553Spatrick 11246035553Spatrick 11346035553Spatricktemplate <class _CharT, class _Traits, class _Delim> 114*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI ostream_joiner<typename decay<_Delim>::type, _CharT, _Traits> 11546035553Spatrickmake_ostream_joiner(basic_ostream<_CharT, _Traits>& __os, _Delim && __d) 11646035553Spatrick{ return ostream_joiner<typename decay<_Delim>::type, _CharT, _Traits>(__os, _VSTD::forward<_Delim>(__d)); } 11746035553Spatrick 11846035553Spatrick_LIBCPP_END_NAMESPACE_LFTS 11946035553Spatrick 120*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 11 121*4bdff4beSrobert 122*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 123*4bdff4beSrobert# include <type_traits> 124*4bdff4beSrobert#endif 12546035553Spatrick 12646035553Spatrick#endif // _LIBCPP_EXPERIMENTAL_ITERATOR 127