]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/xpressive/include/boost/xpressive/detail/core/matcher/end_matcher.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / xpressive / include / boost / xpressive / detail / core / matcher / end_matcher.hpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // end_matcher.hpp
3 //
4 // Copyright 2008 Eric Niebler. Distributed under the Boost
5 // Software License, Version 1.0. (See accompanying file
6 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7
8 #ifndef BOOST_XPRESSIVE_DETAIL_CORE_MATCHER_END_MATCHER_HPP_EAN_10_04_2005
9 #define BOOST_XPRESSIVE_DETAIL_CORE_MATCHER_END_MATCHER_HPP_EAN_10_04_2005
10
11 // MS compatible compilers support #pragma once
12 #if defined(_MSC_VER)
13 # pragma once
14 #endif
15
16 #include <boost/assert.hpp>
17 #include <boost/xpressive/detail/detail_fwd.hpp>
18 #include <boost/xpressive/detail/core/quant_style.hpp>
19 #include <boost/xpressive/detail/core/state.hpp>
20 #include <boost/xpressive/detail/core/sub_match_impl.hpp>
21 #include <boost/xpressive/detail/core/flow_control.hpp>
22
23 namespace boost { namespace xpressive { namespace detail
24 {
25
26 ///////////////////////////////////////////////////////////////////////////////
27 // end_matcher
28 //
29 struct end_matcher
30 : quant_style_assertion
31 {
32 template<typename BidiIter, typename Next>
33 static bool match(match_state<BidiIter> &state, Next const &)
34 {
35 BidiIter const tmp = state.cur_;
36 sub_match_impl<BidiIter> &s0 = state.sub_match(0);
37 BOOST_ASSERT(!s0.matched);
38
39 // SPECIAL: if there is a match context on the context stack, then
40 // this pattern has been nested within another. pop that context and
41 // continue executing.
42 if(0 != state.context_.prev_context_)
43 {
44 if(!pop_context_match(state))
45 {
46 return false;
47 }
48
49 // record the end of sub-match zero
50 s0.first = s0.begin_;
51 s0.second = tmp;
52 s0.matched = true;
53
54 return true;
55 }
56 else if((state.flags_.match_all_ && !state.eos()) ||
57 (state.flags_.match_not_null_ && state.cur_ == s0.begin_))
58 {
59 return false;
60 }
61
62 // record the end of sub-match zero
63 s0.first = s0.begin_;
64 s0.second = tmp;
65 s0.matched = true;
66
67 // Now execute any actions that have been queued
68 for(actionable const *actor = state.action_list_.next; 0 != actor; actor = actor->next)
69 {
70 actor->execute(state.action_args_);
71 }
72
73 return true;
74 }
75 };
76
77 ///////////////////////////////////////////////////////////////////////////////
78 // independent_end_matcher
79 //
80 struct independent_end_matcher
81 : quant_style_assertion
82 {
83 template<typename BidiIter, typename Next>
84 bool match(match_state<BidiIter> &state, Next const &) const
85 {
86 // Now execute any actions that have been queued
87 for(actionable const *actor = state.action_list_.next; 0 != actor; actor = actor->next)
88 {
89 actor->execute(state.action_args_);
90 }
91
92 return true;
93 }
94 };
95
96 }}}
97
98 #endif