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