| // Copyright 2017-2020 The Khronos Group. This work is licensed under a |
| // Creative Commons Attribution 4.0 International License; see |
| // http://creativecommons.org/licenses/by/4.0/ |
| |
| [[iterator-library]] |
| === Iterator Library |
| |
| OpenCL {cpp} implements part of iterator library (_chapter 24, [iterators]_) from the {cpp14} standard. |
| Primitives ({cpp14} standard, _section 24.4_), iterator operations ({cpp14} standard, _section 24.4.4,_), predefined iterators ({cpp14} standard, _section 24.5_) and range access ({cpp14} standard, _section 24.7_) are supported. |
| |
| For the detailed description please refer to {cpp14} standard. |
| |
| [[header-opencl_iterator-synopsis]] |
| ==== Header <opencl_iterator> Synopsis |
| |
| [source] |
| ---- |
| namespace cl |
| { |
| // primitives: |
| template<class Iterator> struct iterator_traits; |
| template<class T> struct iterator_traits<T*>; |
| template<class Category, class T, class Distance = ptrdiff_t, |
| class Pointer = T*, class Reference = T&> struct iterator; |
| |
| struct input_iterator_tag { }; |
| struct output_iterator_tag { }; |
| struct forward_iterator_tag: public input_iterator_tag { }; |
| struct bidirectional_iterator_tag: public forward_iterator_tag { }; |
| struct random_access_iterator_tag: public bidirectional_iterator_tag { }; |
| |
| // iterator operations: |
| template <class InputIterator, class Distance> |
| void advance(InputIterator& i, Distance n); |
| template <class InputIterator> |
| typename iterator_traits<InputIterator>::difference_type |
| distance(InputIterator first, InputIterator last); |
| template <class ForwardIterator> |
| ForwardIterator next(ForwardIterator x, |
| typename std::iterator_traits<ForwardIterator>::difference_type n = 1); |
| template <class BidirectionalIterator> |
| BidirectionalIterator prev(BidirectionalIterator x, |
| typename std::iterator_traits<BidirectionalIterator>::difference_type n = 1); |
| |
| // predefined iterators: |
| template <class Iterator> class reverse_iterator; |
| template <class Iterator1, class Iterator2> |
| bool operator==( |
| const reverse_iterator<Iterator1>& x, |
| const reverse_iterator<Iterator2>& y); |
| template <class Iterator1, class Iterator2> |
| bool operator<( |
| const reverse_iterator<Iterator1>& x, |
| const reverse_iterator<Iterator2>& y); |
| template <class Iterator1, class Iterator2> |
| bool operator!=( |
| const reverse_iterator<Iterator1>& x, |
| const reverse_iterator<Iterator2>& y); |
| template <class Iterator1, class Iterator2> |
| bool operator>( |
| const reverse_iterator<Iterator1>& x, |
| const reverse_iterator<Iterator2>& y); |
| template <class Iterator1, class Iterator2> |
| bool operator>=( |
| const reverse_iterator<Iterator1>& x, |
| const reverse_iterator<Iterator2>& y); |
| template <class Iterator1, class Iterator2> |
| bool operator<=( |
| const reverse_iterator<Iterator1>& x, |
| const reverse_iterator<Iterator2>& y); |
| template <class Iterator1, class Iterator2> |
| auto operator-( |
| const reverse_iterator<Iterator1>& x, |
| const reverse_iterator<Iterator2>& y) ->decltype(y.base() - x.base()); |
| template <class Iterator> |
| reverse_iterator<Iterator> |
| operator+(typename reverse_iterator<Iterator>::difference_type n, |
| const reverse_iterator<Iterator>& x); |
| template <class Iterator> |
| reverse_iterator<Iterator> make_reverse_iterator(Iterator i); |
| template <class Container> class back_insert_iterator; |
| template <class Container> |
| back_insert_iterator<Container> back_inserter(Container& x); |
| template <class Container> class front_insert_iterator; |
| template <class Container> |
| front_insert_iterator<Container> front_inserter(Container& x); |
| template <class Container> class insert_iterator; |
| template <class Container> |
| insert_iterator<Container> inserter(Container& x, |
| typename Container::iterator i); |
| template <class Iterator> class move_iterator; |
| template <class Iterator1, class Iterator2> |
| bool operator==( |
| const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); |
| template <class Iterator1, class Iterator2> |
| bool operator!=( |
| const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); |
| template <class Iterator1, class Iterator2> |
| bool operator<( |
| const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); |
| template <class Iterator1, class Iterator2> |
| bool operator<=( |
| const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); |
| template <class Iterator1, class Iterator2> |
| bool operator>( |
| const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); |
| template <class Iterator1, class Iterator2> |
| bool operator>=( |
| const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); |
| template <class Iterator1, class Iterator2> |
| auto operator-( |
| const move_iterator<Iterator1>& x, |
| const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base()); |
| template <class Iterator> |
| move_iterator<Iterator> operator+( |
| typename move_iterator<Iterator>::difference_type n, |
| const move_iterator<Iterator>& x); |
| template <class Iterator> |
| move_iterator<Iterator> make_move_iterator(Iterator i); |
| |
| // range access: |
| template <class C> auto begin(C& c) -> decltype(c.begin()); |
| template <class C> auto begin(const C& c) -> decltype(c.begin()); |
| template <class C> auto end(C& c) -> decltype(c.end()); |
| template <class C> auto end(const C& c) -> decltype(c.end()); |
| template <class T, size_t N> constexpr T* begin(T (&array)[N]) noexcept; |
| template <class T, size_t N> constexpr T* end(T (&array)[N]) noexcept; |
| template <class C> |
| constexpr auto cbegin(const C& c) noexcept(noexcept(std::begin(c))) |
| -> decltype(std::begin(c)); |
| template <class C> |
| constexpr auto cend(const C& c) noexcept(noexcept(std::end(c))) |
| -> decltype(std::end(c)); |
| template <class C> auto rbegin(C& c) -> decltype(c.rbegin()); |
| template <class C> auto rbegin(const C& c) -> decltype(c.rbegin()); |
| template <class C> auto rend(C& c) -> decltype(c.rend()); |
| template <class C> auto rend(const C& c) -> decltype(c.rend()); |
| template <class T, size_t N> reverse_iterator<T*> rbegin(T (&array)[N]); |
| template <class T, size_t N> reverse_iterator<T*> rend(T (&array)[N]); |
| template <class E> reverse_iterator<const E*> rbegin(initializer_list<E> il); |
| template <class E> reverse_iterator<const E*> rend(initializer_list<E> il); |
| template <class C> auto crbegin(const C& c) -> decltype(std::rbegin(c)); |
| template <class C> auto crend(const C& c) -> decltype(std::rend(c)); |
| |
| } |
| ---- |