Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/wave/util/transform_iterator.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/wave/util/transform_iterator.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,89 @@ +/*============================================================================= + Boost.Wave: A Standard compliant C++ preprocessor library + + http://www.boost.org/ + + Copyright (c) 2001-2012 Hartmut Kaiser. Distributed under the Boost + Software License, Version 1.0. (See accompanying file + LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ + +#if !defined(TRANSFORM_ITERATOR_HPP_D492C659_88C7_4258_8C42_192F9AE80EC0_INCLUDED) +#define TRANSFORM_ITERATOR_HPP_D492C659_88C7_4258_8C42_192F9AE80EC0_INCLUDED + +#include <boost/config.hpp> +#include <boost/iterator_adaptors.hpp> +#include <boost/iterator/transform_iterator.hpp> + +#include <boost/assert.hpp> + +// this must occur after all of the includes and before any code appears +#ifdef BOOST_HAS_ABI_HEADERS +#include BOOST_ABI_PREFIX +#endif + +/////////////////////////////////////////////////////////////////////////////// +namespace boost { +namespace wave { +namespace impl { + +/////////////////////////////////////////////////////////////////////////////// +// +// The new Boost.Iterator library already conatins a transform_iterator usable +// for our needs. The code below wraps this up. +// +/////////////////////////////////////////////////////////////////////////////// + template <class AdaptableUnaryFunctionT, class IteratorT> + class ref_transform_iterator_generator + { + typedef typename AdaptableUnaryFunctionT::result_type return_type; + typedef typename AdaptableUnaryFunctionT::argument_type argument_type; + + public: + typedef boost::transform_iterator< + return_type (*)(argument_type), IteratorT, return_type> + type; + }; + + template <class AdaptableUnaryFunctionT, class IteratorT> + inline + typename ref_transform_iterator_generator< + AdaptableUnaryFunctionT, IteratorT>::type + make_ref_transform_iterator( + IteratorT base, AdaptableUnaryFunctionT const &f) + { + typedef typename ref_transform_iterator_generator< + AdaptableUnaryFunctionT, IteratorT>::type + iterator_type; + return iterator_type(base, f.transform); + } + + // Retrieve the token value given a parse node + // This is used in conjunction with the ref_transform_iterator above, to + // get the token values while iterating directly over the parse tree. + template <typename TokenT, typename ParseTreeNodeT> + struct get_token_value { + + typedef TokenT const &result_type; + typedef ParseTreeNodeT const &argument_type; + + static result_type + transform (argument_type node) + { + BOOST_ASSERT(1 == std::distance(node.value.begin(), + node.value.end())); + return *node.value.begin(); + } + }; + +/////////////////////////////////////////////////////////////////////////////// +} // namespace impl +} // namespace wave +} // namespace boost + +// the suffix header occurs after all of the code +#ifdef BOOST_HAS_ABI_HEADERS +#include BOOST_ABI_SUFFIX +#endif + +#endif // !defined(TRANSFORM_ITERATOR_HPP_D492C659_88C7_4258_8C42_192F9AE80EC0_INCLUDED)