1 /*=============================================================================
2     Copyright (c) 2001-2003 Joel de Guzman
3     http://spirit.sourceforge.net/
4 
5   Distributed under the Boost Software License, Version 1.0. (See accompanying
6   file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
8 #ifndef BOOST_SPIRIT_PARAMETRIC_HPP
9 #define BOOST_SPIRIT_PARAMETRIC_HPP
10 
11 ///////////////////////////////////////////////////////////////////////////////
12 #include <boost/spirit/home/classic/namespace.hpp>
13 #include <boost/spirit/home/classic/core/parser.hpp>
14 #include <boost/spirit/home/classic/core/composite/composite.hpp>
15 #include <boost/spirit/home/classic/core/primitives/primitives.hpp>
16 
17 namespace boost { namespace spirit {
18 
19 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
20 
21     ///////////////////////////////////////////////////////////////////////////
22     //
23     //  f_chlit class [ functional version of chlit ]
24     //
25     ///////////////////////////////////////////////////////////////////////////
26     template <typename ChGenT>
27     struct f_chlit : public char_parser<f_chlit<ChGenT> >
28     {
f_chlitboost::spirit::f_chlit29         f_chlit(ChGenT chgen_)
30         : chgen(chgen_) {}
31 
32         template <typename T>
testboost::spirit::f_chlit33         bool test(T ch) const
34         { return ch == chgen(); }
35 
36         ChGenT   chgen;
37     };
38 
39     template <typename ChGenT>
40     inline f_chlit<ChGenT>
f_ch_p(ChGenT chgen)41     f_ch_p(ChGenT chgen)
42     { return f_chlit<ChGenT>(chgen); }
43 
44     ///////////////////////////////////////////////////////////////////////////
45     //
46     //  f_range class [ functional version of range ]
47     //
48     ///////////////////////////////////////////////////////////////////////////
49     template <typename ChGenAT, typename ChGenBT>
50     struct f_range : public char_parser<f_range<ChGenAT, ChGenBT> >
51     {
f_rangeboost::spirit::f_range52         f_range(ChGenAT first_, ChGenBT last_)
53         : first(first_), last(last_)
54         {}
55 
56         template <typename T>
testboost::spirit::f_range57         bool test(T ch) const
58         {
59             BOOST_SPIRIT_ASSERT(first() <= last());
60             return (ch >= first()) && (ch <= last());
61         }
62 
63         ChGenAT first;
64         ChGenBT last;
65     };
66 
67     template <typename ChGenAT, typename ChGenBT>
68     inline f_range<ChGenAT, ChGenBT>
f_range_p(ChGenAT first,ChGenBT last)69     f_range_p(ChGenAT first, ChGenBT last)
70     { return f_range<ChGenAT, ChGenBT>(first, last); }
71 
72     ///////////////////////////////////////////////////////////////////////////
73     //
74     //  f_chseq class [ functional version of chseq ]
75     //
76     ///////////////////////////////////////////////////////////////////////////
77     template <typename IterGenAT, typename IterGenBT>
78     class f_chseq : public parser<f_chseq<IterGenAT, IterGenBT> >
79     {
80     public:
81 
82         typedef f_chseq<IterGenAT, IterGenBT> self_t;
83 
f_chseq(IterGenAT first_,IterGenBT last_)84         f_chseq(IterGenAT first_, IterGenBT last_)
85         : first(first_), last(last_) {}
86 
87         template <typename ScannerT>
88         typename parser_result<self_t, ScannerT>::type
parse(ScannerT const & scan) const89         parse(ScannerT const& scan) const
90         {
91             typedef typename parser_result<self_t, ScannerT>::type result_t;
92             return impl::string_parser_parse<result_t>(first(), last(), scan);
93         }
94 
95     private:
96 
97         IterGenAT first;
98         IterGenBT last;
99     };
100 
101     template <typename IterGenAT, typename IterGenBT>
102     inline f_chseq<IterGenAT, IterGenBT>
f_chseq_p(IterGenAT first,IterGenBT last)103     f_chseq_p(IterGenAT first, IterGenBT last)
104     { return f_chseq<IterGenAT, IterGenBT>(first, last); }
105 
106     ///////////////////////////////////////////////////////////////////////////
107     //
108     //  f_strlit class [ functional version of strlit ]
109     //
110     ///////////////////////////////////////////////////////////////////////////
111     template <typename IterGenAT, typename IterGenBT>
112     class f_strlit : public parser<f_strlit<IterGenAT, IterGenBT> >
113     {
114     public:
115 
116         typedef f_strlit<IterGenAT, IterGenBT> self_t;
117 
f_strlit(IterGenAT first,IterGenBT last)118         f_strlit(IterGenAT first, IterGenBT last)
119         : seq(first, last) {}
120 
121         template <typename ScannerT>
122         typename parser_result<self_t, ScannerT>::type
parse(ScannerT const & scan) const123         parse(ScannerT const& scan) const
124         {
125             typedef typename parser_result<self_t, ScannerT>::type result_t;
126             return impl::contiguous_parser_parse<result_t>
127                 (seq, scan, scan);
128         }
129 
130     private:
131 
132         f_chseq<IterGenAT, IterGenBT> seq;
133     };
134 
135     template <typename IterGenAT, typename IterGenBT>
136     inline f_strlit<IterGenAT, IterGenBT>
f_str_p(IterGenAT first,IterGenBT last)137     f_str_p(IterGenAT first, IterGenBT last)
138     { return f_strlit<IterGenAT, IterGenBT>(first, last); }
139 
140 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
141 
142 }} // namespace BOOST_SPIRIT_CLASSIC_NS
143 
144 #endif
145