Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
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