xref: /freebsd/contrib/llvm-project/libcxx/include/experimental/iterator (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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