1 // Copyright (c) 2001 Daniel C. Nuffer 2 // Copyright (c) 2001-2011 Hartmut Kaiser 3 // 4 // Distributed under the Boost Software License, Version 1.0. (See accompanying 5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 7 #if !defined(BOOST_SPIRIT_ITERATOR_INPUT_ITERATOR_POLICY_MAR_16_2007_1156AM) 8 #define BOOST_SPIRIT_ITERATOR_INPUT_ITERATOR_POLICY_MAR_16_2007_1156AM 9 10 #include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp> 11 #include <boost/spirit/home/support/iterators/detail/multi_pass.hpp> 12 #include <boost/assert.hpp> 13 #include <iterator> // for std::iterator_traits 14 15 namespace boost { namespace spirit { namespace iterator_policies 16 { 17 namespace input_iterator_is_valid_test_ 18 { 19 /////////////////////////////////////////////////////////////////////// 20 template <typename Token> token_is_valid(Token const & c)21 inline bool token_is_valid(Token const& c) 22 { 23 return c ? true : false; 24 } 25 } 26 27 /////////////////////////////////////////////////////////////////////////// 28 // class input_iterator 29 // Implementation of the InputPolicy used by multi_pass 30 // 31 // The input_iterator encapsulates an input iterator of type T 32 /////////////////////////////////////////////////////////////////////////// 33 struct input_iterator 34 { 35 /////////////////////////////////////////////////////////////////////// 36 template <typename T> 37 class unique // : public detail::default_input_policy 38 { 39 private: 40 typedef 41 typename std::iterator_traits<T>::value_type 42 result_type; 43 44 public: 45 typedef 46 typename std::iterator_traits<T>::difference_type 47 difference_type; 48 typedef 49 typename std::iterator_traits<T>::difference_type 50 distance_type; 51 typedef 52 typename std::iterator_traits<T>::pointer 53 pointer; 54 typedef 55 typename std::iterator_traits<T>::reference 56 reference; 57 typedef result_type value_type; 58 59 protected: unique()60 unique() {} unique(T)61 explicit unique(T) {} 62 swap(unique &)63 void swap(unique&) {} 64 65 public: 66 template <typename MultiPass> destroy(MultiPass &)67 static void destroy(MultiPass&) {} 68 69 template <typename MultiPass> get_input(MultiPass & mp)70 static typename MultiPass::reference get_input(MultiPass& mp) 71 { 72 return *mp.shared()->input_; 73 } 74 75 template <typename MultiPass> advance_input(MultiPass & mp)76 static void advance_input(MultiPass& mp) 77 { 78 ++mp.shared()->input_; 79 } 80 81 // test, whether we reached the end of the underlying stream 82 template <typename MultiPass> input_at_eof(MultiPass const & mp)83 static bool input_at_eof(MultiPass const& mp) 84 { 85 static T const end_iter; 86 return mp.shared()->input_ == end_iter; 87 } 88 89 template <typename MultiPass> input_is_valid(MultiPass const &,value_type const & t)90 static bool input_is_valid(MultiPass const&, value_type const& t) 91 { 92 using namespace input_iterator_is_valid_test_; 93 return token_is_valid(t); 94 } 95 96 // no unique data elements 97 }; 98 99 /////////////////////////////////////////////////////////////////////// 100 template <typename T> 101 struct shared 102 { sharedboost::spirit::iterator_policies::input_iterator::shared103 explicit shared(T const& input) : input_(input) {} 104 105 T input_; 106 }; 107 }; 108 109 }}} 110 111 #endif 112