• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 ///////////////////////////////////////////////////////////////////////////////
2 // range_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_RANGE_MATCHER_HPP_EAN_10_04_2005
9 #define BOOST_XPRESSIVE_DETAIL_CORE_MATCHER_RANGE_MATCHER_HPP_EAN_10_04_2005
10 
11 // MS compatible compilers support #pragma once
12 #if defined(_MSC_VER)
13 # pragma once
14 # pragma warning(push)
15 # pragma warning(disable : 4100) // unreferenced formal parameter
16 #endif
17 
18 #include <boost/mpl/bool.hpp>
19 #include <boost/xpressive/detail/detail_fwd.hpp>
20 #include <boost/xpressive/detail/core/quant_style.hpp>
21 #include <boost/xpressive/detail/core/state.hpp>
22 
23 namespace boost { namespace xpressive { namespace detail
24 {
25 
26     ///////////////////////////////////////////////////////////////////////////////
27     // range_matcher
28     //
29     template<typename Traits, typename ICase>
30     struct range_matcher
31       : quant_style_fixed_width<1>
32     {
33         typedef typename Traits::char_type char_type;
34         typedef ICase icase_type;
35         char_type ch_min_;
36         char_type ch_max_;
37         bool not_;
38 
range_matcherboost::xpressive::detail::range_matcher39         range_matcher(char_type ch_min, char_type ch_max, bool no, Traits const &)
40           : ch_min_(ch_min)
41           , ch_max_(ch_max)
42           , not_(no)
43         {
44         }
45 
inverseboost::xpressive::detail::range_matcher46         void inverse()
47         {
48             this->not_ = !this->not_;
49         }
50 
in_rangeboost::xpressive::detail::range_matcher51         bool in_range(Traits const &tr, char_type ch, mpl::false_) const // case-sensitive
52         {
53             return tr.in_range(this->ch_min_, this->ch_max_, ch);
54         }
55 
in_rangeboost::xpressive::detail::range_matcher56         bool in_range(Traits const &tr, char_type ch, mpl::true_) const // case-insensitive
57         {
58             return tr.in_range_nocase(this->ch_min_, this->ch_max_, ch);
59         }
60 
61         template<typename BidiIter, typename Next>
matchboost::xpressive::detail::range_matcher62         bool match(match_state<BidiIter> &state, Next const &next) const
63         {
64             if(state.eos() || this->not_ ==
65                 this->in_range(traits_cast<Traits>(state), *state.cur_, icase_type()))
66             {
67                 return false;
68             }
69 
70             ++state.cur_;
71             if(next.match(state))
72             {
73                 return true;
74             }
75 
76             --state.cur_;
77             return false;
78         }
79     };
80 
81 }}}
82 
83 #if defined(_MSC_VER)
84 # pragma warning(pop)
85 #endif
86 
87 #endif
88