xref: /openbsd-src/gnu/llvm/libcxx/include/experimental/iterator (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
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