📄 multi_pass.hpp
字号:
// Copyright (c) 2001, Daniel C. Nuffer// Copyright (c) 2001-2008, 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(BOOST_SPIRIT_ITERATOR_MULTI_PASS_MAR_16_2007_1122AM)#define BOOST_SPIRIT_ITERATOR_MULTI_PASS_MAR_16_2007_1122AM#include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp>#include <boost/iterator.hpp>#include <boost/mpl/bool.hpp>#include <iterator>#include <algorithm> ///////////////////////////////////////////////////////////////////////////////namespace boost { namespace spirit { namespace detail{ /////////////////////////////////////////////////////////////////////////// template <typename T> inline void swap(T& t1, T& t2) { using std::swap; using boost::spirit::swap; swap(t1, t2); } #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) /////////////////////////////////////////////////////////////////////////// // Meta-function to generate a std::iterator<> base class for multi_pass. // This is used mainly to improve conformance of compilers not supporting // PTS and thus relying on inheritance to recognize an iterator. // // We are using boost::iterator<> because it offers an automatic // workaround for broken std::iterator<> implementations. /////////////////////////////////////////////////////////////////////////// template <typename T, typename InputPolicy> struct iterator_base_creator { typedef typename InputPolicy::BOOST_NESTED_TEMPLATE unique<T> input_type; typedef boost::iterator < std::forward_iterator_tag, typename input_type::value_type, typename input_type::difference_type, typename input_type::pointer, typename input_type::reference > type; };#endif /////////////////////////////////////////////////////////////////////////// // Default implementations of the different policies to be used with a // multi_pass iterator /////////////////////////////////////////////////////////////////////////// struct default_input_policy { default_input_policy() {} template <typename Functor> default_input_policy(Functor const&) {} template <typename MultiPass> static void destroy(MultiPass&) {} void swap(default_input_policy&) {} template <typename MultiPass, typename TokenType> static TokenType& advance_input(MultiPass& mp, TokenType& curtok); template <typename MultiPass, typename TokenType> static bool input_at_eof(MultiPass const& mp, TokenType& curtok); template <typename MultiPass, typename TokenType> static bool input_is_valid(MultiPass& mp, TokenType& curtok); }; struct default_ownership_policy { template <typename MultiPass> static void destroy(MultiPass&) {} void swap(default_ownership_policy&) {} template <typename MultiPass> static void clone(MultiPass&) {} template <typename MultiPass> static bool release(MultiPass& mp); template <typename MultiPass> static bool is_unique(MultiPass const& mp); }; struct default_storage_policy { template <typename MultiPass> static void destroy(MultiPass&) {} void swap(default_storage_policy&) {} template <typename MultiPass> static typename MultiPass::reference dereference(MultiPass const& mp); template <typename MultiPass> static void increment(MultiPass&) {} template <typename MultiPass> static void clear_queue(MultiPass&) {} template <typename MultiPass> static bool is_eof(MultiPass const& mp); template <typename MultiPass> static bool equal_to(MultiPass const& mp, MultiPass const& x); template <typename MultiPass> static bool less_than(MultiPass const& mp, MultiPass const& x); }; struct default_checking_policy { template <typename MultiPass> static void destroy(MultiPass&) {} void swap(default_checking_policy&) {} template <typename MultiPass> static void check(MultiPass const&) {} template <typename MultiPass> static void clear_queue(MultiPass&) {} }; }}}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -