]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libc++/include/experimental/iterator
Merge ^/head r327150 through r327164.
[FreeBSD/FreeBSD.git] / contrib / libc++ / include / experimental / iterator
1 // -*- C++ -*-
2 //===----------------------------- iterator -------------------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #ifndef _LIBCPP_EXPERIMENTAL_ITERATOR
12 #define _LIBCPP_EXPERIMENTAL_ITERATOR
13
14 /*
15 namespace std {
16   namespace experimental {
17     inline namespace fundamentals_v2 {
18
19     template <class DelimT, class charT = char, class traits = char_traits<charT>>
20         class ostream_joiner {
21         public:
22          typedef charT                        char_type;
23          typedef traits                       traits_type;
24          typedef basic_ostream<charT, traits> ostream_type;
25          typedef output_iterator_tag          iterator_category;
26          typedef void                         value_type;
27          typedef void                         difference_type;
28          typedef void                         pointer;
29          typedef void                         reference;
30       
31          ostream_joiner(ostream_type& s, const DelimT& delimiter);
32          ostream_joiner(ostream_type& s, DelimT&& delimiter);
33
34          template<typename T>  
35          ostream_joiner& operator=(const T& value);
36
37          ostream_joiner& operator*() noexcept;
38          ostream_joiner& operator++() noexcept;
39          ostream_joiner& operator++(int) noexcept;
40    private:
41       ostream_type* out_stream;   // exposition only 
42       DelimT delim;               // exposition only 
43       bool first_element;         // exposition only
44    };
45
46   template <class charT, class traits, class DelimT>
47     ostream_joiner<decay_t<DelimT>, charT, traits>
48     make_ostream_joiner(basic_ostream<charT, traits>& os, DelimT&& delimiter);
49
50     } // inline namespace fundamentals_v2
51   } // namespace experimental
52 } // namespace std
53
54 */
55
56 #include <experimental/__config>
57
58 #if _LIBCPP_STD_VER > 11
59
60 #include <iterator>
61
62 _LIBCPP_BEGIN_NAMESPACE_LFTS
63
64 template <class _Delim, class _CharT = char, class _Traits = char_traits<_CharT>>
65 class ostream_joiner {
66 public:
67
68     typedef _CharT                               char_type;
69     typedef _Traits                              traits_type;
70     typedef basic_ostream<char_type,traits_type> ostream_type;
71     typedef output_iterator_tag                  iterator_category;
72     typedef void                                 value_type;
73     typedef void                                 difference_type;
74     typedef void                                 pointer;
75     typedef void                                 reference;
76
77     ostream_joiner(ostream_type& __os, _Delim&& __d)
78         : __output_iter(_VSTD::addressof(__os)), __delim(_VSTD::move(__d)), __first(true) {}
79         
80     ostream_joiner(ostream_type& __os, const _Delim& __d)
81         : __output_iter(_VSTD::addressof(__os)), __delim(__d), __first(true) {}
82     
83
84     template<typename _Tp>
85     ostream_joiner& operator=(const _Tp& __v)
86     {
87         if (!__first)
88             *__output_iter << __delim;
89         __first = false;
90         *__output_iter << __v;
91         return *this;
92     }
93
94     ostream_joiner& operator*()     _NOEXCEPT { return *this; }
95     ostream_joiner& operator++()    _NOEXCEPT { return *this; }
96     ostream_joiner& operator++(int) _NOEXCEPT { return *this; }
97
98 private:
99     ostream_type*   __output_iter;
100     _Delim          __delim;
101     bool            __first;
102 };
103
104
105 template <class _CharT, class _Traits, class _Delim>
106 ostream_joiner<typename decay<_Delim>::type, _CharT, _Traits>
107 make_ostream_joiner(basic_ostream<_CharT, _Traits>& __os, _Delim && __d)
108 { return ostream_joiner<typename decay<_Delim>::type, _CharT, _Traits>(__os, _VSTD::forward<_Delim>(__d)); }
109
110 _LIBCPP_END_NAMESPACE_LFTS
111
112 #endif /* _LIBCPP_STD_VER > 11 */
113
114 #endif // _LIBCPP_EXPERIMENTAL_ITERATOR