annotate DEPENDENCIES/generic/include/boost/token_iterator.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Boost token_iterator.hpp -------------------------------------------------//
Chris@16 2
Chris@16 3 // Copyright John R. Bandela 2001
Chris@16 4 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 5 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 6 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 7
Chris@16 8 // See http://www.boost.org/libs/tokenizer for documentation.
Chris@16 9
Chris@16 10 // Revision History:
Chris@16 11 // 16 Jul 2003 John Bandela
Chris@16 12 // Allowed conversions from convertible base iterators
Chris@16 13 // 03 Jul 2003 John Bandela
Chris@16 14 // Converted to new iterator adapter
Chris@16 15
Chris@16 16
Chris@16 17
Chris@16 18 #ifndef BOOST_TOKENIZER_POLICY_JRB070303_HPP_
Chris@16 19 #define BOOST_TOKENIZER_POLICY_JRB070303_HPP_
Chris@16 20
Chris@101 21 #include <boost/assert.hpp>
Chris@101 22 #include <boost/iterator/iterator_adaptor.hpp>
Chris@101 23 #include <boost/iterator/minimum_category.hpp>
Chris@101 24 #include <boost/token_functions.hpp>
Chris@101 25 #include <utility>
Chris@16 26
Chris@16 27 namespace boost
Chris@16 28 {
Chris@16 29 template <class TokenizerFunc, class Iterator, class Type>
Chris@16 30 class token_iterator
Chris@16 31 : public iterator_facade<
Chris@16 32 token_iterator<TokenizerFunc, Iterator, Type>
Chris@16 33 , Type
Chris@101 34 , typename iterators::minimum_category<
Chris@16 35 forward_traversal_tag
Chris@16 36 , typename iterator_traversal<Iterator>::type
Chris@101 37 >::type
Chris@16 38 , const Type&
Chris@16 39 >
Chris@16 40 {
Chris@16 41
Chris@16 42 friend class iterator_core_access;
Chris@16 43
Chris@16 44 TokenizerFunc f_;
Chris@16 45 Iterator begin_;
Chris@16 46 Iterator end_;
Chris@16 47 bool valid_;
Chris@16 48 Type tok_;
Chris@16 49
Chris@16 50 void increment(){
Chris@16 51 BOOST_ASSERT(valid_);
Chris@16 52 valid_ = f_(begin_,end_,tok_);
Chris@16 53 }
Chris@16 54
Chris@16 55 const Type& dereference() const {
Chris@16 56 BOOST_ASSERT(valid_);
Chris@16 57 return tok_;
Chris@16 58 }
Chris@16 59 template<class Other>
Chris@16 60 bool equal(const Other& a) const{
Chris@16 61 return (a.valid_ && valid_)
Chris@16 62 ?( (a.begin_==begin_) && (a.end_ == end_) )
Chris@16 63 :(a.valid_==valid_);
Chris@16 64
Chris@16 65 }
Chris@16 66
Chris@16 67 void initialize(){
Chris@16 68 if(valid_) return;
Chris@16 69 f_.reset();
Chris@16 70 valid_ = (begin_ != end_)?
Chris@16 71 f_(begin_,end_,tok_):false;
Chris@16 72 }
Chris@16 73 public:
Chris@16 74 token_iterator():begin_(),end_(),valid_(false),tok_() { }
Chris@16 75
Chris@16 76 token_iterator(TokenizerFunc f, Iterator begin, Iterator e = Iterator())
Chris@16 77 : f_(f),begin_(begin),end_(e),valid_(false),tok_(){ initialize(); }
Chris@16 78
Chris@16 79 token_iterator(Iterator begin, Iterator e = Iterator())
Chris@16 80 : f_(),begin_(begin),end_(e),valid_(false),tok_() {initialize();}
Chris@16 81
Chris@16 82 template<class OtherIter>
Chris@16 83 token_iterator(
Chris@16 84 token_iterator<TokenizerFunc, OtherIter,Type> const& t
Chris@16 85 , typename enable_if_convertible<OtherIter, Iterator>::type* = 0)
Chris@16 86 : f_(t.tokenizer_function()),begin_(t.base())
Chris@16 87 ,end_(t.end()),valid_(!t.at_end()),tok_(t.current_token()) {}
Chris@16 88
Chris@16 89 Iterator base()const{return begin_;}
Chris@16 90
Chris@101 91 Iterator end()const{return end_;}
Chris@16 92
Chris@16 93 TokenizerFunc tokenizer_function()const{return f_;}
Chris@16 94
Chris@16 95 Type current_token()const{return tok_;}
Chris@16 96
Chris@16 97 bool at_end()const{return !valid_;}
Chris@16 98
Chris@16 99
Chris@16 100
Chris@16 101
Chris@16 102 };
Chris@16 103 template <
Chris@101 104 class TokenizerFunc = char_delimiters_separator<char>,
Chris@16 105 class Iterator = std::string::const_iterator,
Chris@16 106 class Type = std::string
Chris@16 107 >
Chris@16 108 class token_iterator_generator {
Chris@16 109
Chris@101 110 private:
Chris@16 111 public:
Chris@16 112 typedef token_iterator<TokenizerFunc,Iterator,Type> type;
Chris@16 113 };
Chris@101 114
Chris@101 115
Chris@16 116 // Type has to be first because it needs to be explicitly specified
Chris@16 117 // because there is no way the function can deduce it.
Chris@16 118 template<class Type, class Iterator, class TokenizerFunc>
Chris@101 119 typename token_iterator_generator<TokenizerFunc,Iterator,Type>::type
Chris@16 120 make_token_iterator(Iterator begin, Iterator end,const TokenizerFunc& fun){
Chris@101 121 typedef typename
Chris@16 122 token_iterator_generator<TokenizerFunc,Iterator,Type>::type ret_type;
Chris@16 123 return ret_type(fun,begin,end);
Chris@16 124 }
Chris@16 125
Chris@16 126 } // namespace boost
Chris@16 127
Chris@16 128 #endif