111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// -*- C++ -*- 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 2007-2014 Free Software Foundation, Inc. 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library. This library is free 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the terms 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// of the GNU General Public License as published by the Free Software 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Foundation; either version 3, or (at your option) any later 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// version. 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful, but 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// WITHOUT ANY WARRANTY; without even the implied warranty of 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// General Public License for more details. 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation. 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program; 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>. 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/** @file parallel/iterator.h 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Helper iterator classes for the std::transform() functions. 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This file is a GNU parallel extension to the Standard C++ Library. 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Written by Johannes Singler. 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _GLIBCXX_PARALLEL_ITERATOR_H 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _GLIBCXX_PARALLEL_ITERATOR_H 1 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <parallel/basic_iterator.h> 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/stl_pair.h> 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace __gnu_parallel 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** @brief A pair of iterators. The usual iterator operations are 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * applied to both child iterators. 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Iterator1, typename _Iterator2, 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename _IteratorCategory> 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _IteratorPair : public std::pair<_Iterator1, _Iterator2> 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef std::pair<_Iterator1, _Iterator2> _Base; 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _IteratorCategory iterator_category; 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef void value_type; 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef std::iterator_traits<_Iterator1> _TraitsType; 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TraitsType::difference_type difference_type; 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _IteratorPair* pointer; 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _IteratorPair& reference; 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _IteratorPair() { } 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _IteratorPair(const _Iterator1& __first, const _Iterator2& __second) 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _Base(__first, __second) { } 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Pre-increment operator. 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _IteratorPair& 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator++() 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++_Base::first; 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++_Base::second; 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Post-increment operator. 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _IteratorPair 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator++(int) 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _IteratorPair(_Base::first++, _Base::second++); } 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Pre-decrement operator. 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _IteratorPair& 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator--() 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert --_Base::first; 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert --_Base::second; 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Post-decrement operator. 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _IteratorPair 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator--(int) 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _IteratorPair(_Base::first--, _Base::second--); } 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Type conversion. 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator _Iterator2() const 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _Base::second; } 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _IteratorPair& 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator=(const _IteratorPair& __other) 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Base::first = __other.first; 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Base::second = __other.second; 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _IteratorPair 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator+(difference_type __delta) const 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _IteratorPair(_Base::first + __delta, _Base::second + __delta); 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert difference_type 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator-(const _IteratorPair& __other) const 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _Base::first - __other.first; } 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** @brief A triple of iterators. The usual iterator operations are 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert applied to all three child iterators. 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Iterator1, typename _Iterator2, typename _Iterator3, 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename _IteratorCategory> 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _IteratorTriple 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _IteratorCategory iterator_category; 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef void value_type; 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename std::iterator_traits<_Iterator1>::difference_type 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert difference_type; 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _IteratorTriple* pointer; 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _IteratorTriple& reference; 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Iterator1 _M_first; 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Iterator2 _M_second; 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Iterator3 _M_third; 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _IteratorTriple() { } 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _IteratorTriple(const _Iterator1& __first, const _Iterator2& __second, 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _Iterator3& __third) 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_first = __first; 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_second = __second; 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_third = __third; 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Pre-increment operator. 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _IteratorTriple& 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator++() 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++_M_first; 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++_M_second; 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++_M_third; 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Post-increment operator. 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _IteratorTriple 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator++(int) 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _IteratorTriple(_M_first++, _M_second++, _M_third++); } 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Pre-decrement operator. 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _IteratorTriple& 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator--() 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert --_M_first; 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert --_M_second; 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert --_M_third; 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Post-decrement operator. 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _IteratorTriple 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator--(int) 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _IteratorTriple(_M_first--, _M_second--, _M_third--); } 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Type conversion. 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator _Iterator3() const 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_third; } 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _IteratorTriple& 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator=(const _IteratorTriple& __other) 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_first = __other._M_first; 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_second = __other._M_second; 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_third = __other._M_third; 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _IteratorTriple 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator+(difference_type __delta) const 18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _IteratorTriple(_M_first + __delta, _M_second + __delta, 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_third + __delta); } 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert difference_type 19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator-(const _IteratorTriple& __other) const 19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_first - __other._M_first; } 19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _GLIBCXX_PARALLEL_ITERATOR_H */ 199