• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 ///////////////////////////////////////////////////////////////////////////////
2 // posix_charset_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_POSIX_CHARSET_MATCHER_HPP_EAN_10_04_2005
9 #define BOOST_XPRESSIVE_DETAIL_CORE_MATCHER_POSIX_CHARSET_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/mpl/bool.hpp>
18 #include <boost/xpressive/detail/detail_fwd.hpp>
19 #include <boost/xpressive/detail/core/quant_style.hpp>
20 #include <boost/xpressive/detail/core/state.hpp>
21 #include <boost/xpressive/detail/utility/traits_utils.hpp>
22 
23 namespace boost { namespace xpressive { namespace detail
24 {
25 
26     ///////////////////////////////////////////////////////////////////////////////
27     // posix_charset_matcher
28     //
29     template<typename Traits>
30     struct posix_charset_matcher
31       : quant_style_fixed_width<1>
32     {
33         typedef Traits traits_type;
34         typedef typename Traits::char_class_type char_class_type;
35 
posix_charset_matcherboost::xpressive::detail::posix_charset_matcher36         posix_charset_matcher(char_class_type m, bool no)
37           : not_(no)
38           , mask_(m)
39         {
40             BOOST_ASSERT(0 != this->mask_);
41         }
42 
inverseboost::xpressive::detail::posix_charset_matcher43         void inverse()
44         {
45             this->not_ = !this->not_;
46         }
47 
48         template<typename BidiIter, typename Next>
matchboost::xpressive::detail::posix_charset_matcher49         bool match(match_state<BidiIter> &state, Next const &next) const
50         {
51             if(state.eos() || this->not_ == traits_cast<Traits>(state).isctype(
52                 *state.cur_, this->mask_))
53             {
54                 return false;
55             }
56 
57             ++state.cur_;
58             if(next.match(state))
59             {
60                 return true;
61             }
62 
63             --state.cur_;
64             return false;
65         }
66 
67         bool not_;
68         char_class_type mask_;
69     };
70 
71 }}}
72 
73 #endif
74