1 /*============================================================================= 2 Boost.Wave: A Standard compliant C++ preprocessor library 3 4 http://www.boost.org/ 5 6 Copyright (c) 2001-2012 Hartmut Kaiser. Distributed under the Boost 7 Software License, Version 1.0. (See accompanying file 8 LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 =============================================================================*/ 10 11 #if !defined(TRANSFORM_ITERATOR_HPP_D492C659_88C7_4258_8C42_192F9AE80EC0_INCLUDED) 12 #define TRANSFORM_ITERATOR_HPP_D492C659_88C7_4258_8C42_192F9AE80EC0_INCLUDED 13 14 #include <boost/config.hpp> 15 #include <boost/iterator_adaptors.hpp> 16 #include <boost/iterator/transform_iterator.hpp> 17 18 #include <boost/assert.hpp> 19 20 // this must occur after all of the includes and before any code appears 21 #ifdef BOOST_HAS_ABI_HEADERS 22 #include BOOST_ABI_PREFIX 23 #endif 24 25 /////////////////////////////////////////////////////////////////////////////// 26 namespace boost { 27 namespace wave { 28 namespace impl { 29 30 /////////////////////////////////////////////////////////////////////////////// 31 // 32 // The new Boost.Iterator library already conatins a transform_iterator usable 33 // for our needs. The code below wraps this up. 34 // 35 /////////////////////////////////////////////////////////////////////////////// 36 template <class AdaptableUnaryFunctionT, class IteratorT> 37 class ref_transform_iterator_generator 38 { 39 typedef typename AdaptableUnaryFunctionT::result_type return_type; 40 typedef typename AdaptableUnaryFunctionT::argument_type argument_type; 41 42 public: 43 typedef boost::transform_iterator< 44 return_type (*)(argument_type), IteratorT, return_type> 45 type; 46 }; 47 48 template <class AdaptableUnaryFunctionT, class IteratorT> 49 inline 50 typename ref_transform_iterator_generator< 51 AdaptableUnaryFunctionT, IteratorT>::type make_ref_transform_iterator(IteratorT base,AdaptableUnaryFunctionT const & f)52 make_ref_transform_iterator( 53 IteratorT base, AdaptableUnaryFunctionT const &f) 54 { 55 typedef typename ref_transform_iterator_generator< 56 AdaptableUnaryFunctionT, IteratorT>::type 57 iterator_type; 58 return iterator_type(base, f.transform); 59 } 60 61 // Retrieve the token value given a parse node 62 // This is used in conjunction with the ref_transform_iterator above, to 63 // get the token values while iterating directly over the parse tree. 64 template <typename TokenT, typename ParseTreeNodeT> 65 struct get_token_value { 66 67 typedef TokenT const &result_type; 68 typedef ParseTreeNodeT const &argument_type; 69 70 static result_type transformboost::wave::impl::get_token_value71 transform (argument_type node) 72 { 73 BOOST_ASSERT(1 == std::distance(node.value.begin(), 74 node.value.end())); 75 return *node.value.begin(); 76 } 77 }; 78 79 /////////////////////////////////////////////////////////////////////////////// 80 } // namespace impl 81 } // namespace wave 82 } // namespace boost 83 84 // the suffix header occurs after all of the code 85 #ifdef BOOST_HAS_ABI_HEADERS 86 #include BOOST_ABI_SUFFIX 87 #endif 88 89 #endif // !defined(TRANSFORM_ITERATOR_HPP_D492C659_88C7_4258_8C42_192F9AE80EC0_INCLUDED) 90