Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Concepts
iterator.hpp
Go to the documentation of this file.
1
6/*
7 * This file is part of Algorithms library toolkit.
8 * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz)
9
10 * Algorithms library toolkit is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
14
15 * Algorithms library toolkit is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19
20 * You should have received a copy of the GNU General Public License
21 * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>.
22 */
23
24#pragma once
25
26#include <iterator>
27#include <functional>
28
29namespace ext {
30
37template <class Iterator>
43 Iterator current;
44
45public:
50 typedef Iterator iterator_type;
51
56 using iterator_category = typename std::iterator_traits < Iterator >::iterator_category;
57
62 typedef typename std::iterator_traits<Iterator>::value_type value_type;
63
69
75
80 using difference_type = std::ptrdiff_t;
81
88 explicit set_move_iterator (Iterator it) : current(it) {
89 }
90
98 return current;
99 }
100
108 return & ( this->operator * ( ) );
109 }
110
117 reference operator*() const {
118 return std::move(const_cast<value_type&>(*current));
119 }
120
130 ++current;
131 return *this;
132 }
133
143 --current;
144 return *this;
145 }
146
156 set_move_iterator temp = *this;
157 ++current;
158 return temp;
159 }
160
170 set_move_iterator temp = *this;
171 --current;
172 return temp;
173 }
174
183 bool operator== (const set_move_iterator<Iterator>& other) const {
184 return this->current == other.current;
185 }
186
187};
188
199template<class Iterator>
202}
203
212template < class Iterator, class KeyType, class ValueType >
214 static_assert ( ! std::is_const_v < std::remove_reference_t < KeyType > >, "KeyType of move iterator must not be const" );
215
220 Iterator current;
221
222public:
227 typedef Iterator iterator_type;
228
233 using iterator_category = typename std::iterator_traits < Iterator >::iterator_category;
234
239 typedef typename std::pair < KeyType, ValueType > value_type;
240
246
252
257 using difference_type = std::ptrdiff_t;
258
265 explicit map_move_iterator (Iterator it) : current(it) {
266 }
267
275 return current;
276 }
277
285 return & ( this->operator * ( ) );
286 }
287
294 reference operator*() const {
295 return std::move(reinterpret_cast < value_type & >(*current));
296 }
297
307 ++current;
308 return *this;
309 }
310
320 --current;
321 return *this;
322 }
323
333 map_move_iterator temp = *this;
334 ++current;
335 return temp;
336 }
337
347 map_move_iterator temp = *this;
348 --current;
349 return temp;
350 }
351
361 return this->current == other.current;
362 }
363
364};
365
378template < class T, class R, class Iterator>
381}
382
389template < class T >
395 T m_Container;
396public:
401 explicit value_mover ( T && param ) : m_Container ( std::move ( param ) ) {}
402
407 auto begin ( ) {
408 return std::move ( m_Container ).begin ( );
409 }
410
415 auto end ( ) {
416 return std::move ( m_Container ).end ( );
417 }
418};
419
426template < class T >
432 T && m_Container;
433public:
438 explicit reference_mover ( T && param ) : m_Container ( std::move ( param ) ) {}
439
444 auto begin ( ) {
445 return std::move ( m_Container ).begin ( );
446 }
447
452 auto end ( ) {
453 return std::move ( m_Container ).end ( );
454 }
455};
456
467template < class T >
469 return reference_mover < T > ( std::move ( param ) );
470}
471
482template < class T >
484 return value_mover < T > ( std::forward < T > ( param ) );
485}
486
493template < class T >
494class reverser {
499 T && m_Container;
500
501public:
508 explicit reverser ( T && container ) : m_Container ( std::forward < T && > ( container ) ) {
509 }
510
517 auto begin ( ) const {
518 return m_Container.rbegin ( );
519 }
520
527 auto end ( ) const {
528 return m_Container.rend ( );
529 }
530
531};
532
543template < class T >
545 return reverser < T > ( container );
546}
547
555template < class Iterator >
561 Iterator m_base;
562
563public:
568 using pointer = typename std::iterator_traits < Iterator >::value_type;
569
574 using value_type = typename std::conditional < std::is_const < typename std::remove_reference < typename std::iterator_traits < Iterator >::reference >::type >::value, typename std::add_const < typename std::remove_pointer < pointer >::type >::type, typename std::remove_pointer < pointer >::type >::type;
575
580 using difference_type = std::ptrdiff_t;
581
587
592 using iterator_category = typename std::iterator_traits < Iterator >::iterator_category;
593
600 explicit dereferencing_iterator ( Iterator base ) : m_base ( base ) {
601 }
602
610 template < class Iter >
611 dereferencing_iterator ( const dereferencing_iterator < Iter > & iter ) : m_base ( iter.base ( ) ) {
612 }
613
621 return * * m_base;
622 }
623
631 return * m_base;
632 }
633
643 ++ m_base;
644 return * this;
645 }
646
656 auto tmp = * this;
657 ++ m_base;
658 return tmp;
659 }
660
670 -- m_base;
671 return * this;
672 }
673
683 auto tmp = * this;
684 -- m_base;
685 return tmp;
686 }
687
697 m_base += distance;
698 return *this;
699 }
700
710 auto res = * this;
711 res += distance;
712 return res;
713 }
714
724 m_base -= distance;
725 return *this;
726 }
727
737 auto res = * this;
738 res -= distance;
739 return res;
740 }
741
752 reference operator [ ] ( int index ) const {
753 return * ( m_base [ index ] );
754 }
755
765 return m_base - other.m_base;
766 }
767
777 return this->m_base == other.m_base;
778 }
779
789 return this->m_base < other.m_base;
790 }
791
798 Iterator base ( ) const {
799 return m_base;
800 }
801
802};
803
814template < class Iterator >
817}
818
829template < typename InputIterator, typename Distance >
830inline constexpr void retractInternal ( InputIterator & i, Distance n, std::input_iterator_tag ) {
831 assert ( n <= 0 );
832 while ( n ++ )
833 ++ i;
834}
835
846template < typename BidirectionalIterator, typename Distance >
847inline constexpr void retractInternal ( BidirectionalIterator & i, Distance n, std::bidirectional_iterator_tag ) {
848 if ( n > 0)
849 while ( n -- )
850 -- i;
851 else
852 while ( n ++ )
853 ++ i;
854}
855
866template < typename RandomAccessIterator, typename Distance >
867inline constexpr void retractInternal ( RandomAccessIterator & i, Distance n, std::random_access_iterator_tag ) {
868 i -= n;
869}
870
886template < typename Iterator, typename Distance >
887inline constexpr void retract ( Iterator & i, Distance n ) {
888 typename std::iterator_traits < Iterator >::difference_type d = n;
889 retractInternal ( i, d, typename std::iterator_traits < Iterator >::iterator_category ( ) );
890}
891
899template < class Container >
900auto begin ( Container && cont ) -> decltype ( std::forward ( cont ).begin ( ) ) {
901 return std::forward ( cont ).begin ( );
902}
903
911template < class Container >
912auto end ( Container && cont ) -> decltype ( std::forward ( cont ).end ( ) ) {
913 return std::forward ( cont ).end ( );
914}
915
922template < class T >
927 T m_callback;
928
929public:
930 using difference_type = void;
931 using value_type = void;
932 using pointer = void;
933 using reference = void;
934 using iterator_category = std::output_iterator_tag;
935
941 explicit callback_iterator ( T callback ) : m_callback ( std::move ( callback ) ) {
942 }
943
951 template < class R >
953 m_callback ( std::forward < R > ( value ) );
954 return * this;
955 }
956
963 return * this;
964 }
965
972 return * this;
973 }
974
981 return * this;
982 }
983};
984
992template < class T >
995}
996
1002template < typename map_type >
1003class key_iterator : public map_type::const_iterator {
1004public:
1005 explicit key_iterator ( const typename map_type::const_iterator & other ) : map_type::const_iterator ( other ) {
1006 }
1007
1008 const typename map_type::value_type::first_type & operator * ( ) const {
1009 return map_type::const_iterator::operator * ( ).first;
1010 }
1011
1012 const typename map_type::value_type::first_type * operator -> ( ) const {
1013 return & ( map_type::const_iterator::operator * ( ).first );
1014 }
1015};
1016
1026template < typename map_type >
1027key_iterator < map_type > key_begin ( const map_type & m ) {
1028 return key_iterator < map_type > ( m.begin ( ) );
1029}
1030
1040template < typename map_type >
1041key_iterator < map_type > key_end ( const map_type & m ) {
1042 return key_iterator < map_type > ( m.end ( ) );
1043}
1044
1050template < typename map_type >
1051class value_iterator : public map_type::const_iterator {
1052public:
1053 explicit value_iterator ( const typename map_type::const_iterator & other ) : map_type::const_iterator ( other ) {
1054 }
1055
1056 const typename map_type::value_type::first_type & operator * ( ) const {
1057 return map_type::const_iterator::operator * ( ).second;
1058 }
1059
1060 const typename map_type::value_type::first_type * operator -> ( ) const {
1061 return & ( map_type::const_iterator::operator * ( ).second );
1062 }
1063};
1064
1074template < typename map_type >
1076 return value_iterator < map_type > ( m.begin ( ) );
1077}
1078
1088template < typename map_type >
1090 return value_iterator < map_type > ( m.end ( ) );
1091}
1092
1093} /* namespace ext */
1094
Output iterator calling a callback function on assignment.
Definition: iterator.hpp:923
void value_type
Definition: iterator.hpp:931
callback_iterator & operator*()
Definition: iterator.hpp:962
void reference
Definition: iterator.hpp:933
void pointer
Definition: iterator.hpp:932
void difference_type
Definition: iterator.hpp:930
callback_iterator(T callback)
Definition: iterator.hpp:941
callback_iterator & operator=(R &&value)
Definition: iterator.hpp:952
std::output_iterator_tag iterator_category
Definition: iterator.hpp:934
callback_iterator & operator++()
Definition: iterator.hpp:971
Adaptor iterator to additionally call second dereference on the iterator dereference result.
Definition: iterator.hpp:556
typename std::iterator_traits< Iterator >::value_type pointer
The pointer type is the value of adapted iterator.
Definition: iterator.hpp:568
reference operator[](int index) const
Array subscript operator.
Definition: iterator.hpp:752
bool operator==(const dereferencing_iterator< Iterator > &other) const
Comparison of iterators for equality.
Definition: iterator.hpp:776
typename std::iterator_traits< Iterator >::iterator_category iterator_category
iterator_category is inherited.
Definition: iterator.hpp:592
dereferencing_iterator< Iterator > & operator-=(int distance)
Shifs the iterator back by distance.
Definition: iterator.hpp:723
dereferencing_iterator< Iterator > operator-(int distance) const
Creates a new iterator and shifs it back by distance.
Definition: iterator.hpp:736
dereferencing_iterator< Iterator > & operator++()
Increment operator.
Definition: iterator.hpp:642
reference operator*() const
Dereference operator doing extra dereference.
Definition: iterator.hpp:620
typename std::conditional< std::is_const< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type >::value, typename std::add_const< typename std::remove_pointer< pointer >::type >::type, typename std::remove_pointer< pointer >::type >::type value_type
The value type is the value of adapted iterator without pointer.
Definition: iterator.hpp:574
dereferencing_iterator(Iterator base)
Constructor of the dereferencing iterator adaptor.
Definition: iterator.hpp:600
auto operator<=>(const dereferencing_iterator< Iterator > &other) const
Less than comparison of iterators.
Definition: iterator.hpp:788
pointer operator->() const
Arrow operator doing extra dereference.
Definition: iterator.hpp:630
dereferencing_iterator< Iterator > & operator--()
Decrement operator.
Definition: iterator.hpp:669
Iterator base() const
The underlying iterator getter.
Definition: iterator.hpp:798
std::ptrdiff_t difference_type
Difference_type is standard pointer difference type.
Definition: iterator.hpp:580
dereferencing_iterator(const dereferencing_iterator< Iter > &iter)
Definition: iterator.hpp:611
dereferencing_iterator< Iterator > & operator+=(int distance)
Shifs the iterator by distance.
Definition: iterator.hpp:696
value_type & reference
Reference type is reference to the value type.
Definition: iterator.hpp:586
dereferencing_iterator< Iterator > operator+(int distance) const
Creates a new iterator and shifs it by distance.
Definition: iterator.hpp:709
Definition: iterator.hpp:1003
const map_type::value_type::first_type & operator*() const
Definition: iterator.hpp:1008
key_iterator(const typename map_type::const_iterator &other)
Definition: iterator.hpp:1005
const map_type::value_type::first_type * operator->() const
Definition: iterator.hpp:1012
Adaptor iterator to allow values to be moved from a map. Internaly calls reinterpret cast to derefere...
Definition: iterator.hpp:213
map_move_iterator operator++(int)
Increment operator.
Definition: iterator.hpp:332
std::ptrdiff_t difference_type
Difference_type is standard pointer difference type.
Definition: iterator.hpp:257
reference operator*() const
Dereference operator using the reinterpret cast.
Definition: iterator.hpp:294
value_type * pointer
The pointer type is a pointer to the value_type.
Definition: iterator.hpp:251
typename std::iterator_traits< Iterator >::iterator_category iterator_category
iterator_category is inherited.
Definition: iterator.hpp:233
map_move_iterator & operator++()
Increment operator.
Definition: iterator.hpp:306
map_move_iterator operator--(int)
Decrement operator.
Definition: iterator.hpp:346
pointer operator->() const
Arrow operator using the reinterpret cast.
Definition: iterator.hpp:284
bool operator==(const map_move_iterator< Iterator, KeyType, ValueType > &other) const
Comparison of iterators for equality.
Definition: iterator.hpp:360
iterator_type base() const
Getter of the underlying set iterator.
Definition: iterator.hpp:274
value_type && reference
Reference type is rvalue reference to the value type.
Definition: iterator.hpp:245
map_move_iterator(Iterator it)
Constructor of the set move iterator adaptor.
Definition: iterator.hpp:265
Iterator iterator_type
The underlying iterator type.
Definition: iterator.hpp:227
std::pair< KeyType, ValueType > value_type
The value type is essentially the value_type of adapted iterator but constructed here to avoid consts...
Definition: iterator.hpp:239
map_move_iterator & operator--()
Decrement operator.
Definition: iterator.hpp:319
Adaptor class to change begin and end behavior for rvalue qualified begin and end....
Definition: iterator.hpp:427
auto end()
End method calls rvalue qualified end on adapted value.
Definition: iterator.hpp:452
auto begin()
Begin method calls rvalue qualified begin on adapted value.
Definition: iterator.hpp:444
reference_mover(T &&param)
Constructor of the mover adaptor class.
Definition: iterator.hpp:438
Adaptor class to change begin and end behavior for reverse begin and reverse end and vise versa.
Definition: iterator.hpp:494
auto begin() const
Begin adaptor method to call rbegin.
Definition: iterator.hpp:517
auto end() const
End adaptor method to call rend.
Definition: iterator.hpp:527
reverser(T &&container)
Constructor of the adaptor class based on the adapted container.
Definition: iterator.hpp:508
Adaptor iterator to allow values to be moved from a set. Internaly calls const cast to dereference re...
Definition: iterator.hpp:38
set_move_iterator operator--(int)
Decrement operator.
Definition: iterator.hpp:169
std::ptrdiff_t difference_type
Difference_type is standard pointer difference type.
Definition: iterator.hpp:80
bool operator==(const set_move_iterator< Iterator > &other) const
Comparison of iterators for equality.
Definition: iterator.hpp:183
iterator_type base() const
Getter of the underlying set iterator.
Definition: iterator.hpp:97
set_move_iterator & operator++()
Increment operator.
Definition: iterator.hpp:129
set_move_iterator operator++(int)
Increment operator.
Definition: iterator.hpp:155
set_move_iterator(Iterator it)
Constructor of the set move iterator adaptor.
Definition: iterator.hpp:88
std::iterator_traits< Iterator >::value_type value_type
The value type is the value_type of adapted iterator.
Definition: iterator.hpp:62
value_type && reference
Reference type is rvalue reference to the value type.
Definition: iterator.hpp:68
pointer operator->() const
Arrow operator using the const cast.
Definition: iterator.hpp:107
set_move_iterator & operator--()
Decrement operator.
Definition: iterator.hpp:142
Iterator iterator_type
The underlying iterator type.
Definition: iterator.hpp:50
typename std::iterator_traits< Iterator >::iterator_category iterator_category
iterator_category is inherited.
Definition: iterator.hpp:56
value_type * pointer
The pointer type is a pointer to the value_type.
Definition: iterator.hpp:74
reference operator*() const
Dereference operator using the const cast.
Definition: iterator.hpp:117
Definition: iterator.hpp:1051
const map_type::value_type::first_type * operator->() const
Definition: iterator.hpp:1060
value_iterator(const typename map_type::const_iterator &other)
Definition: iterator.hpp:1053
const map_type::value_type::first_type & operator*() const
Definition: iterator.hpp:1056
Adaptor class to change begin and end behavior for rvalue qualified begin and end....
Definition: iterator.hpp:390
auto end()
End method calls rvalue qualified end on adapted value.
Definition: iterator.hpp:415
auto begin()
Begin method calls rvalue qualified begin on adapted value.
Definition: iterator.hpp:407
value_mover(T &&param)
Constructor of the mover adaptor class.
Definition: iterator.hpp:401
int i
Definition: AllEpsilonClosure.h:118
return res
Definition: MinimizeByPartitioning.h:145
Definition: ContainerFromStringLexer.cpp:8
Definition: sigHandler.cpp:20
auto end(Container &&cont) -> decltype(std::forward(cont).end())
Definition: iterator.hpp:912
callback_iterator< T > make_callback_iterator(T callback)
Definition: iterator.hpp:993
constexpr void retract(Iterator &i, Distance n)
A generalization of pointer arithmetic.
Definition: iterator.hpp:887
reverser< T > make_reverse(T &&container)
Reverese adaptor construction function.
Definition: iterator.hpp:544
constexpr void retractInternal(InputIterator &i, Distance n, std::input_iterator_tag)
Implementation of retract function specific to input iterators.
Definition: iterator.hpp:830
int callback(struct dl_phdr_info *info, size_t, void *data)
Definition: simpleStacktrace.cpp:25
reference_mover< T > make_mover(T &param)
Move adaptor construction function specialized to lvalue reference parameter.
Definition: iterator.hpp:468
value_iterator< map_type > value_end(const map_type &m)
Definition: iterator.hpp:1089
map_move_iterator< Iterator, T, R > make_map_move_iterator(Iterator it)
Move from map iterator adaptor construction function.
Definition: iterator.hpp:379
value_iterator< map_type > value_begin(const map_type &m)
Definition: iterator.hpp:1075
key_iterator< map_type > key_begin(const map_type &m)
Definition: iterator.hpp:1027
dereferencing_iterator< Iterator > dereferencer(Iterator iter)
Dereferencing adaptor construction function.
Definition: iterator.hpp:815
set_move_iterator< Iterator > make_set_move_iterator(Iterator it)
Move from set iterator adaptor construction function.
Definition: iterator.hpp:200
key_iterator< map_type > key_end(const map_type &m)
Definition: iterator.hpp:1041
auto begin(Container &&cont) -> decltype(std::forward(cont).begin())
Definition: iterator.hpp:900
Definition: FordFulkerson.hpp:16