Skip to content

Commit

Permalink
Update std iterators (#672)
Browse files Browse the repository at this point in the history
  • Loading branch information
miscco authored Nov 27, 2023
1 parent 5191bc5 commit 9cafbd5
Show file tree
Hide file tree
Showing 24 changed files with 669 additions and 111 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,31 +35,39 @@ _LIBCUDACXX_SUPPRESS_DEPRECATED_PUSH
template <class _Container>
class _LIBCUDACXX_TEMPLATE_VIS back_insert_iterator
#if _LIBCUDACXX_STD_VER <= 14 || !defined(_LIBCUDACXX_ABI_NO_ITERATOR_BASES)
: public iterator<output_iterator_tag,
void,
void,
void,
void>
: public iterator<output_iterator_tag, void, void, void, void>
#endif
{
_LIBCUDACXX_SUPPRESS_DEPRECATED_POP
protected:
_Container* container;
public:
typedef output_iterator_tag iterator_category;
typedef void value_type;
#if _LIBCUDACXX_STD_VER > 17
typedef ptrdiff_t difference_type;
#else
typedef void difference_type;
#endif
typedef void pointer;
typedef void reference;
typedef _Container container_type;

_LIBCUDACXX_INLINE_VISIBILITY explicit back_insert_iterator(_Container& __x) : container(_CUDA_VSTD::addressof(__x)) {}
_LIBCUDACXX_INLINE_VISIBILITY back_insert_iterator& operator=(const typename _Container::value_type& __value_)
{container->push_back(__value_); return *this;}
_LIBCUDACXX_INLINE_VISIBILITY back_insert_iterator& operator=(typename _Container::value_type&& __value_)
{container->push_back(_CUDA_VSTD::move(__value_)); return *this;}
_LIBCUDACXX_INLINE_VISIBILITY back_insert_iterator& operator*() {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY back_insert_iterator& operator++() {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY back_insert_iterator operator++(int) {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 explicit back_insert_iterator(_Container& __x) : container(_CUDA_VSTD::addressof(__x)) {}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 back_insert_iterator& operator=(const typename _Container::value_type& __value)
{container->push_back(__value); return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 back_insert_iterator& operator=(typename _Container::value_type&& __value)
{container->push_back(_CUDA_VSTD::move(__value)); return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 back_insert_iterator& operator*() {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 back_insert_iterator& operator++() {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 back_insert_iterator operator++(int) {return *this;}

_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 _Container* __get_container() const { return container; }
};
_LIBCUDACXX_CTAD_SUPPORTED_FOR_TYPE(back_insert_iterator);

template <class _Container>
inline _LIBCUDACXX_INLINE_VISIBILITY
inline _LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17
back_insert_iterator<_Container>
back_inserter(_Container& __x)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
#include <__config>
#endif // __cuda_std__

#include "../__iterator/iterator.h"
#include "../__iterator/iterator_traits.h"
#include "../__iterator/iterator.h"
#include "../__memory/addressof.h"
#include "../__utility/move.h"
#include "../cstddef"
Expand All @@ -35,31 +35,37 @@ _LIBCUDACXX_SUPPRESS_DEPRECATED_PUSH
template <class _Container>
class _LIBCUDACXX_TEMPLATE_VIS front_insert_iterator
#if _LIBCUDACXX_STD_VER <= 14 || !defined(_LIBCUDACXX_ABI_NO_ITERATOR_BASES)
: public iterator<output_iterator_tag,
void,
void,
void,
void>
: public iterator<output_iterator_tag, void, void, void, void>
#endif
{
_LIBCUDACXX_SUPPRESS_DEPRECATED_POP
protected:
_Container* container;
public:
typedef output_iterator_tag iterator_category;
typedef void value_type;
#if _LIBCUDACXX_STD_VER > 17
typedef ptrdiff_t difference_type;
#else
typedef void difference_type;
#endif
typedef void pointer;
typedef void reference;
typedef _Container container_type;

_LIBCUDACXX_INLINE_VISIBILITY explicit front_insert_iterator(_Container& __x) : container(_CUDA_VSTD::addressof(__x)) {}
_LIBCUDACXX_INLINE_VISIBILITY front_insert_iterator& operator=(const typename _Container::value_type& __value_)
{container->push_front(__value_); return *this;}
_LIBCUDACXX_INLINE_VISIBILITY front_insert_iterator& operator=(typename _Container::value_type&& __value_)
{container->push_front(_CUDA_VSTD::move(__value_)); return *this;}
_LIBCUDACXX_INLINE_VISIBILITY front_insert_iterator& operator*() {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY front_insert_iterator& operator++() {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY front_insert_iterator operator++(int) {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 explicit front_insert_iterator(_Container& __x) : container(_CUDA_VSTD::addressof(__x)) {}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 front_insert_iterator& operator=(const typename _Container::value_type& __value)
{container->push_front(__value); return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 front_insert_iterator& operator=(typename _Container::value_type&& __value)
{container->push_front(_CUDA_VSTD::move(__value)); return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 front_insert_iterator& operator*() {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 front_insert_iterator& operator++() {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 front_insert_iterator operator++(int) {return *this;}
};
_LIBCUDACXX_CTAD_SUPPORTED_FOR_TYPE(front_insert_iterator);

template <class _Container>
inline _LIBCUDACXX_INLINE_VISIBILITY
inline _LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17
front_insert_iterator<_Container>
front_inserter(_Container& __x)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,39 +31,47 @@

_LIBCUDACXX_BEGIN_NAMESPACE_STD

template <class _Container>
using __insert_iterator_iter_t = typename _Container::iterator;

_LIBCUDACXX_SUPPRESS_DEPRECATED_PUSH
template <class _Container>
class _LIBCUDACXX_TEMPLATE_VIS insert_iterator
#if _LIBCUDACXX_STD_VER <= 14 || !defined(_LIBCUDACXX_ABI_NO_ITERATOR_BASES)
: public iterator<output_iterator_tag,
void,
void,
void,
void>
: public iterator<output_iterator_tag, void, void, void, void>
#endif
{
_LIBCUDACXX_SUPPRESS_DEPRECATED_POP
protected:
_Container* container;
typename _Container::iterator iter;
__insert_iterator_iter_t<_Container> iter;
public:
typedef output_iterator_tag iterator_category;
typedef void value_type;
#if _LIBCUDACXX_STD_VER > 17
typedef ptrdiff_t difference_type;
#else
typedef void difference_type;
#endif
typedef void pointer;
typedef void reference;
typedef _Container container_type;

_LIBCUDACXX_INLINE_VISIBILITY insert_iterator(_Container& __x, typename _Container::iterator __i)
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 insert_iterator(_Container& __x, __insert_iterator_iter_t<_Container> __i)
: container(_CUDA_VSTD::addressof(__x)), iter(__i) {}
_LIBCUDACXX_INLINE_VISIBILITY insert_iterator& operator=(const typename _Container::value_type& __value_)
{iter = container->insert(iter, __value_); ++iter; return *this;}
_LIBCUDACXX_INLINE_VISIBILITY insert_iterator& operator=(typename _Container::value_type&& __value_)
{iter = container->insert(iter, _CUDA_VSTD::move(__value_)); ++iter; return *this;}
_LIBCUDACXX_INLINE_VISIBILITY insert_iterator& operator*() {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY insert_iterator& operator++() {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY insert_iterator& operator++(int) {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 insert_iterator& operator=(const typename _Container::value_type& __value)
{iter = container->insert(iter, __value); ++iter; return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 insert_iterator& operator=(typename _Container::value_type&& __value)
{iter = container->insert(iter, _CUDA_VSTD::move(__value)); ++iter; return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 insert_iterator& operator*() {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 insert_iterator& operator++() {return *this;}
_LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17 insert_iterator& operator++(int) {return *this;}
};

template <class _Container>
inline _LIBCUDACXX_INLINE_VISIBILITY
inline _LIBCUDACXX_INLINE_VISIBILITY _LIBCUDACXX_CONSTEXPR_AFTER_CXX17
insert_iterator<_Container>
inserter(_Container& __x, typename _Container::iterator __i)
inserter(_Container& __x, __insert_iterator_iter_t<_Container> __i)
{
return insert_iterator<_Container>(__x, __i);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
#include <__config>
#endif // __cuda_std__

#include "../__iterator/default_sentinel.h"
#include "../__iterator/iterator_traits.h"
#include "../__iterator/iterator.h"
#include "../__memory/addressof.h"
#include "../cstddef"
Expand All @@ -40,26 +42,34 @@ class _LIBCUDACXX_TEMPLATE_VIS istream_iterator
{
_LIBCUDACXX_SUPPRESS_DEPRECATED_POP
public:
typedef input_iterator_tag iterator_category;
typedef _Tp value_type;
typedef _Distance difference_type;
typedef const _Tp* pointer;
typedef const _Tp& reference;
typedef _CharT char_type;
typedef _Traits traits_type;
typedef basic_istream<_CharT,_Traits> istream_type;
private:
istream_type* __in_stream_;
_Tp __value_;
public:
_LIBCUDACXX_INLINE_VISIBILITY constexpr istream_iterator() : __in_stream_(0), __value_() {}
_LIBCUDACXX_INLINE_VISIBILITY constexpr istream_iterator() : __in_stream_(nullptr), __value_() {}
#if _LIBCUDACXX_STD_VER > 14
_LIBCUDACXX_INLINE_VISIBILITY constexpr istream_iterator(default_sentinel_t) : istream_iterator() {}
#endif // _LIBCUDACXX_STD_VER > 14
_LIBCUDACXX_INLINE_VISIBILITY istream_iterator(istream_type& __s) : __in_stream_(_CUDA_VSTD::addressof(__s))
{
if (!(*__in_stream_ >> __value_))
__in_stream_ = 0;
__in_stream_ = nullptr;
}

_LIBCUDACXX_INLINE_VISIBILITY const _Tp& operator*() const {return __value_;}
_LIBCUDACXX_INLINE_VISIBILITY const _Tp* operator->() const {return _CUDA_VSTD::addressof((operator*()));}
_LIBCUDACXX_INLINE_VISIBILITY istream_iterator& operator++()
{
if (!(*__in_stream_ >> __value_))
__in_stream_ = 0;
__in_stream_ = nullptr;
return *this;
}
_LIBCUDACXX_INLINE_VISIBILITY istream_iterator operator++(int)
Expand All @@ -71,11 +81,22 @@ _LIBCUDACXX_SUPPRESS_DEPRECATED_POP
operator==(const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __x,
const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __y);

template <class _Up, class _CharU, class _TraitsU, class _DistanceU>
friend _LIBCUDACXX_INLINE_VISIBILITY
bool
operator==(const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __x,
const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __y);
#if _LIBCUDACXX_STD_VER > 14
friend _LIBCUDACXX_INLINE_VISIBILITY bool operator==(const istream_iterator& __i, default_sentinel_t) {
return __i.__in_stream_ == nullptr;
}
#if _LIBCUDACXX_STD_VER < 20
friend _LIBCUDACXX_INLINE_VISIBILITY bool operator==(default_sentinel_t, const istream_iterator& __i) {
return __i.__in_stream_ == nullptr;
}
friend _LIBCUDACXX_INLINE_VISIBILITY bool operator!=(const istream_iterator& __i, default_sentinel_t) {
return __i.__in_stream_ != nullptr;
}
friend _LIBCUDACXX_INLINE_VISIBILITY bool operator!=(default_sentinel_t, const istream_iterator& __i) {
return __i.__in_stream_ != nullptr;
}
#endif // _LIBCUDACXX_STD_VER < 20
#endif // _LIBCUDACXX_STD_VER > 14
};

template <class _Tp, class _CharT, class _Traits, class _Distance>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@
#include <__config>
#endif //__cuda_std__

#include "../__iterator/iterator.h"
#include "../__iterator/default_sentinel.h"
#include "../__iterator/iterator_traits.h"
#include "../__iterator/iterator.h"
#include "../iosfwd"

#if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC)
Expand All @@ -40,6 +41,11 @@ class _LIBCUDACXX_TEMPLATE_VIS istreambuf_iterator
{
_LIBCUDACXX_SUPPRESS_DEPRECATED_POP
public:
typedef input_iterator_tag iterator_category;
typedef _CharT value_type;
typedef typename _Traits::off_type difference_type;
typedef _CharT* pointer;
typedef _CharT reference;
typedef _CharT char_type;
typedef _Traits traits_type;
typedef typename _Traits::int_type int_type;
Expand All @@ -52,7 +58,8 @@ _LIBCUDACXX_SUPPRESS_DEPRECATED_POP
{
char_type __keep_;
streambuf_type* __sbuf_;
_LIBCUDACXX_INLINE_VISIBILITY __proxy(char_type __c, streambuf_type* __s)
_LIBCUDACXX_INLINE_VISIBILITY
explicit __proxy(char_type __c, streambuf_type* __s)
: __keep_(__c), __sbuf_(__s) {}
friend class istreambuf_iterator;
public:
Expand All @@ -63,11 +70,15 @@ _LIBCUDACXX_SUPPRESS_DEPRECATED_POP
bool __test_for_eof() const
{
if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sgetc(), traits_type::eof()))
__sbuf_ = 0;
return __sbuf_ == 0;
__sbuf_ = nullptr;
return __sbuf_ == nullptr;
}
public:
_LIBCUDACXX_INLINE_VISIBILITY constexpr istreambuf_iterator() noexcept : __sbuf_(0) {}
_LIBCUDACXX_INLINE_VISIBILITY constexpr istreambuf_iterator() noexcept : __sbuf_(nullptr) {}
#if _LIBCUDACXX_STD_VER > 17
_LIBCUDACXX_INLINE_VISIBILITY constexpr istreambuf_iterator(default_sentinel_t) noexcept
: istreambuf_iterator() {}
#endif // _LIBCUDACXX_STD_VER > 17
_LIBCUDACXX_INLINE_VISIBILITY istreambuf_iterator(istream_type& __s) noexcept
: __sbuf_(__s.rdbuf()) {}
_LIBCUDACXX_INLINE_VISIBILITY istreambuf_iterator(streambuf_type* __s) noexcept
Expand All @@ -89,6 +100,23 @@ _LIBCUDACXX_SUPPRESS_DEPRECATED_POP

_LIBCUDACXX_INLINE_VISIBILITY bool equal(const istreambuf_iterator& __b) const
{return __test_for_eof() == __b.__test_for_eof();}

#if _LIBCUDACXX_STD_VER > 14
friend _LIBCUDACXX_HIDE_FROM_ABI bool operator==(const istreambuf_iterator& __i, default_sentinel_t) {
return __i.__test_for_eof();
}
#if _LIBCUDACXX_STD_VER < 20
friend _LIBCUDACXX_HIDE_FROM_ABI bool operator==(default_sentinel_t, const istreambuf_iterator& __i) {
return __i.__test_for_eof();
}
friend _LIBCUDACXX_HIDE_FROM_ABI bool operator!=(const istreambuf_iterator& __i, default_sentinel_t) {
return !__i.__test_for_eof();
}
friend _LIBCUDACXX_HIDE_FROM_ABI bool operator!=(default_sentinel_t, const istreambuf_iterator& __i) {
return !__i.__test_for_eof();
}
#endif // _LIBCUDACXX_STD_VER < 20
#endif // _LIBCUDACXX_STD_VER > 14
};

template <class _CharT, class _Traits>
Expand All @@ -97,11 +125,13 @@ bool operator==(const istreambuf_iterator<_CharT,_Traits>& __a,
const istreambuf_iterator<_CharT,_Traits>& __b)
{return __a.equal(__b);}

#if _LIBCUDACXX_STD_VER <= 17
template <class _CharT, class _Traits>
inline _LIBCUDACXX_INLINE_VISIBILITY
bool operator!=(const istreambuf_iterator<_CharT,_Traits>& __a,
const istreambuf_iterator<_CharT,_Traits>& __b)
{return !__a.equal(__b);}
#endif // _LIBCUDACXX_STD_VER <= 17

_LIBCUDACXX_END_NAMESPACE_STD

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,30 @@ class _LIBCUDACXX_TEMPLATE_VIS ostream_iterator
{
_LIBCUDACXX_SUPPRESS_DEPRECATED_POP
public:
typedef _CharT char_type;
typedef _Traits traits_type;
typedef basic_ostream<_CharT,_Traits> ostream_type;
typedef output_iterator_tag iterator_category;
typedef void value_type;
#if _LIBCUDACXX_STD_VER > 17
typedef ptrdiff_t difference_type;
#else
typedef void difference_type;
#endif
typedef void pointer;
typedef void reference;
typedef _CharT char_type;
typedef _Traits traits_type;
typedef basic_ostream<_CharT, _Traits> ostream_type;

private:
ostream_type* __out_stream_;
const char_type* __delim_;
public:
_LIBCUDACXX_INLINE_VISIBILITY ostream_iterator(ostream_type& __s) noexcept
: __out_stream_(_CUDA_VSTD::addressof(__s)), __delim_(0) {}
: __out_stream_(_CUDA_VSTD::addressof(__s)), __delim_(nullptr) {}
_LIBCUDACXX_INLINE_VISIBILITY ostream_iterator(ostream_type& __s, const _CharT* __delimiter) noexcept
: __out_stream_(_CUDA_VSTD::addressof(__s)), __delim_(__delimiter) {}
_LIBCUDACXX_INLINE_VISIBILITY ostream_iterator& operator=(const _Tp& __value_)
_LIBCUDACXX_INLINE_VISIBILITY ostream_iterator& operator=(const _Tp& __value)
{
*__out_stream_ << __value_;
*__out_stream_ << __value;
if (__delim_)
*__out_stream_ << __delim_;
return *this;
Expand Down
Loading

0 comments on commit 9cafbd5

Please sign in to comment.