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