본문 바로가기
C++/0x02-boost

boost iterator_range

by SpeeDr00t 2016. 8. 1.
반응형

boost iterator_range

class iterator_range

namespace boost
{
    template< class ForwardTraversalIterator >
    class iterator_range
    {
    public: // Forward Range types
        typedef ForwardTraversalIterator             iterator;
        typedef ForwardTraversalIterator             const_iterator;
        typedef iterator_difference<iterator>::type  difference_type;
 
    public: // construction, assignment
        template< class ForwardTraversalIterator2 >
        iterator_range( ForwardTraversalIterator2 Begin, ForwardTraversalIterator2 End );
                    
        template< class ForwardRange >
        iterator_range( ForwardRange& r );
  
        template< class ForwardRange >
        iterator_range( const ForwardRange& r );
        
        template< class ForwardRange >
        iterator_range& operator=( ForwardRange& r );

        template< class ForwardRange >
        iterator_range& operator=( const ForwardRange& r );
    
    public: // Forward Range functions
        iterator        begin() const;
        iterator        end() const;
        difference_type size() const;
        bool            empty() const;
        
    public: // convenience
        operator        unspecified_bool_type() const;
        bool            equal( const iterator_range& ) const;
        reference       front() const;
        reference       back() const;
        iterator_range& advance_begin( difference_type n );
        iterator_range& advance_end( difference_type n );
        // for Random Access Range only: 
        reference       operator[]( difference_type at ) const;
        value_type      operator()( difference_type at ) const;
    };
    
    // stream output
    template< class ForwardTraversalIterator, class T, class Traits >
    std::basic_ostream<T,Traits>& 
    operator<<( std::basic_ostream<T,Traits>& Os,
                const iterator_range<ForwardTraversalIterator>& r );

    // comparison
    template< class ForwardTraversalIterator, class ForwardTraversalIterator2 >
    bool operator==( const iterator_range<ForwardTraversalIterator>& l, 
                     const iterator_range<ForwardTraversalIterator2>& r );

    template< class ForwardTraversalIterator, class ForwardRange >
    bool operator==( const iterator_range<ForwardTraversalIterator>& l, 
                     const ForwardRange& r );

    template< class ForwardTraversalIterator, class ForwardRange >
    bool operator==( const ForwardRange& l,
                     const iterator_range<ForwardTraversalIterator>& r );

    template< class ForwardTraversalIterator, class ForwardTraversalIterator2 >
    bool operator!=( const iterator_range<ForwardTraversalIterator>& l, 
                     const iterator_range<ForwardTraversalIterator2>& r );

    template< class ForwardTraversalIterator, class ForwardRange >
    bool operator!=( const iterator_range<ForwardTraversalIterator>& l, 
                     const ForwardRange& r );

    template< class ForwardTraversalIterator, class ForwardRange >
    bool operator!=( const ForwardRange& l,
                     const iterator_range<ForwardTraversalIterator>& r );

    template< class ForwardTraversalIterator, class ForwardTraversalIterator2 >
    bool operator<( const iterator_range<ForwardTraversalIterator>& l, 
                    const iterator_range<ForwardTraversalIterator2>& r );

    template< class ForwardTraversalIterator, class ForwardRange >
    bool operator<( const iterator_range<ForwardTraversalIterator>& l, 
                    const ForwardRange& r );

    template< class ForwardTraversalIterator, class ForwardRange >
    bool operator<( const ForwardRange& l,
                    const iterator_range<ForwardTraversalIterator>& r );
 
    // external construction
    template< class ForwardTraversalIterator >
    iterator_range< ForwardTraversalIterator >
    make_iterator_range( ForwardTraversalIterator Begin, 
                         ForwardTraversalIterator End );
       
    template< class ForwardRange >
    iterator_range< typename range_iterator<ForwardRange>::type >
    make_iterator_range( ForwardRange& r );

    template< class ForwardRange >
    iterator_range< typename range_iterator<const ForwardRange>::type >
    make_iterator_range( const ForwardRange& r );
    
    template< class Range >
    iterator_range< typename range_iterator<Range>::type >
    make_iterator_range( Range& r,
                         typename range_difference<Range>::type advance_begin,
                         typename range_difference<Range>::type advance_end );
    
    template< class Range >
    iterator_range< typename range_iterator<const Range>::type >
    make_iterator_range( const Range& r, 
                         typename range_difference<Range>::type advance_begin,
                         typename range_difference<Range>::type advance_end );
    
    // convenience
    template< class Sequence, class ForwardRange >
    Sequence copy_range( const ForwardRange& r );
    
} // namespace 'boost'
    


1.소스

#include <boost/range/iterator_range.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/iterator.hpp>
#include <typeinfo>
#include <iostream>
#include <ostream>


using namespace boost;
using namespace std;


struct print
{

    template<typename T>
    void operator()( const T &t) const
    {
        cout << t << " ";
    }
};


int main( int argc , char ** argv )
{
    typedef int Arrary[20];
    cout << typeid( range_iterator<Arrary>::type ).name() << endl;

    Arrary arr = { 11, 22, 33, 44, 55, 66, 77, 88 };
    boost::for_each( make_iterator_range( arr, arr + 5 ) , print() );

    cout << endl;

return 0;
}

결과

hacker@ubuntu:~/cpp$ 
hacker@ubuntu:~/cpp$ 
hacker@ubuntu:~/cpp$ 
hacker@ubuntu:~/cpp$ c++ -I /home/hacker/boost_1_61_0 -o iterator_range1  iterator_range1.cpp
hacker@ubuntu:~/cpp$ ./iterator_range1 
Pi
11 22 33 44 55 
hacker@ubuntu:~/cpp$ 


반응형

'C++ > 0x02-boost' 카테고리의 다른 글

boost 설치  (0) 2018.03.06
boost to_upper_copy  (0) 2016.08.01
boost c++ 라이브러리 사용하기 ][ find iterator  (0) 2016.08.01
boost replace  (0) 2016.08.01
boost find  (0) 2016.08.01