annotate DEPENDENCIES/generic/include/boost/spirit/home/classic/utility/distinct.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 /*=============================================================================
Chris@16 2 Copyright (c) 1998-2003 Joel de Guzman
Chris@16 3 Copyright (c) 2003 Vaclav Vesely
Chris@16 4 http://spirit.sourceforge.net/
Chris@16 5
Chris@16 6 Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@16 7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8 =============================================================================*/
Chris@16 9 #if !defined(BOOST_SPIRIT_DISTINCT_HPP)
Chris@16 10 #define BOOST_SPIRIT_DISTINCT_HPP
Chris@16 11
Chris@16 12 #include <boost/spirit/home/classic/core/parser.hpp>
Chris@16 13 #include <boost/spirit/home/classic/core/primitives/primitives.hpp>
Chris@16 14 #include <boost/spirit/home/classic/core/composite/operators.hpp>
Chris@16 15 #include <boost/spirit/home/classic/core/composite/directives.hpp>
Chris@16 16 #include <boost/spirit/home/classic/core/composite/epsilon.hpp>
Chris@16 17 #include <boost/spirit/home/classic/core/non_terminal/rule.hpp>
Chris@16 18 #include <boost/spirit/home/classic/utility/chset.hpp>
Chris@16 19
Chris@16 20 #include <boost/spirit/home/classic/utility/distinct_fwd.hpp>
Chris@16 21
Chris@16 22 namespace boost {
Chris@16 23 namespace spirit {
Chris@16 24 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
Chris@16 25
Chris@16 26 //-----------------------------------------------------------------------------
Chris@16 27 // distinct_parser class
Chris@16 28
Chris@16 29 template <typename CharT, typename TailT>
Chris@16 30 class distinct_parser
Chris@16 31 {
Chris@16 32 public:
Chris@16 33 typedef
Chris@16 34 contiguous<
Chris@16 35 sequence<
Chris@16 36 chseq<CharT const*>,
Chris@16 37 negated_empty_match_parser<
Chris@16 38 TailT
Chris@16 39 >
Chris@16 40 >
Chris@16 41 >
Chris@16 42 result_t;
Chris@16 43
Chris@16 44 distinct_parser()
Chris@16 45 : tail(chset<CharT>())
Chris@16 46 {
Chris@16 47 }
Chris@16 48
Chris@16 49 explicit distinct_parser(parser<TailT> const & tail_)
Chris@16 50 : tail(tail_.derived())
Chris@16 51 {
Chris@16 52 }
Chris@16 53
Chris@16 54 explicit distinct_parser(CharT const* letters)
Chris@16 55 : tail(chset_p(letters))
Chris@16 56 {
Chris@16 57 }
Chris@16 58
Chris@16 59 result_t operator()(CharT const* str) const
Chris@16 60 {
Chris@16 61 return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)];
Chris@16 62 }
Chris@16 63
Chris@16 64 TailT tail;
Chris@16 65 };
Chris@16 66
Chris@16 67 //-----------------------------------------------------------------------------
Chris@16 68 // distinct_directive class
Chris@16 69
Chris@16 70 template <typename CharT, typename TailT>
Chris@16 71 class distinct_directive
Chris@16 72 {
Chris@16 73 public:
Chris@16 74 template<typename ParserT>
Chris@16 75 struct result {
Chris@16 76 typedef
Chris@16 77 contiguous<
Chris@16 78 sequence<
Chris@16 79 ParserT,
Chris@16 80 negated_empty_match_parser<
Chris@16 81 TailT
Chris@16 82 >
Chris@16 83 >
Chris@16 84 >
Chris@16 85 type;
Chris@16 86 };
Chris@16 87
Chris@16 88 distinct_directive()
Chris@16 89 : tail(chset<CharT>())
Chris@16 90 {
Chris@16 91 }
Chris@16 92
Chris@16 93 explicit distinct_directive(CharT const* letters)
Chris@16 94 : tail(chset_p(letters))
Chris@16 95 {
Chris@16 96 }
Chris@16 97
Chris@16 98 explicit distinct_directive(parser<TailT> const & tail_)
Chris@16 99 : tail(tail_.derived())
Chris@16 100 {
Chris@16 101 }
Chris@16 102
Chris@16 103 template<typename ParserT>
Chris@16 104 typename result<typename as_parser<ParserT>::type>::type
Chris@16 105 operator[](ParserT const &subject) const
Chris@16 106 {
Chris@16 107 return
Chris@16 108 lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)];
Chris@16 109 }
Chris@16 110
Chris@16 111 TailT tail;
Chris@16 112 };
Chris@16 113
Chris@16 114 //-----------------------------------------------------------------------------
Chris@16 115 // dynamic_distinct_parser class
Chris@16 116
Chris@16 117 template <typename ScannerT>
Chris@16 118 class dynamic_distinct_parser
Chris@16 119 {
Chris@16 120 public:
Chris@16 121 typedef typename ScannerT::value_t char_t;
Chris@16 122
Chris@16 123 typedef
Chris@16 124 rule<
Chris@16 125 typename no_actions_scanner<
Chris@16 126 typename lexeme_scanner<ScannerT>::type
Chris@16 127 >::type
Chris@16 128 >
Chris@16 129 tail_t;
Chris@16 130
Chris@16 131 typedef
Chris@16 132 contiguous<
Chris@16 133 sequence<
Chris@16 134 chseq<char_t const*>,
Chris@16 135 negated_empty_match_parser<
Chris@16 136 tail_t
Chris@16 137 >
Chris@16 138 >
Chris@16 139 >
Chris@16 140 result_t;
Chris@16 141
Chris@16 142 dynamic_distinct_parser()
Chris@16 143 : tail(nothing_p)
Chris@16 144 {
Chris@16 145 }
Chris@16 146
Chris@16 147 template<typename ParserT>
Chris@16 148 explicit dynamic_distinct_parser(parser<ParserT> const & tail_)
Chris@16 149 : tail(tail_.derived())
Chris@16 150 {
Chris@16 151 }
Chris@16 152
Chris@16 153 explicit dynamic_distinct_parser(char_t const* letters)
Chris@16 154 : tail(chset_p(letters))
Chris@16 155 {
Chris@16 156 }
Chris@16 157
Chris@16 158 result_t operator()(char_t const* str) const
Chris@16 159 {
Chris@16 160 return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)];
Chris@16 161 }
Chris@16 162
Chris@16 163 tail_t tail;
Chris@16 164 };
Chris@16 165
Chris@16 166 //-----------------------------------------------------------------------------
Chris@16 167 // dynamic_distinct_directive class
Chris@16 168
Chris@16 169 template <typename ScannerT>
Chris@16 170 class dynamic_distinct_directive
Chris@16 171 {
Chris@16 172 public:
Chris@16 173 typedef typename ScannerT::value_t char_t;
Chris@16 174
Chris@16 175 typedef
Chris@16 176 rule<
Chris@16 177 typename no_actions_scanner<
Chris@16 178 typename lexeme_scanner<ScannerT>::type
Chris@16 179 >::type
Chris@16 180 >
Chris@16 181 tail_t;
Chris@16 182
Chris@16 183 template<typename ParserT>
Chris@16 184 struct result {
Chris@16 185 typedef
Chris@16 186 contiguous<
Chris@16 187 sequence<
Chris@16 188 ParserT,
Chris@16 189 negated_empty_match_parser<
Chris@16 190 tail_t
Chris@16 191 >
Chris@16 192 >
Chris@16 193 >
Chris@16 194 type;
Chris@16 195 };
Chris@16 196
Chris@16 197 dynamic_distinct_directive()
Chris@16 198 : tail(nothing_p)
Chris@16 199 {
Chris@16 200 }
Chris@16 201
Chris@16 202 template<typename ParserT>
Chris@16 203 explicit dynamic_distinct_directive(parser<ParserT> const & tail_)
Chris@16 204 : tail(tail_.derived())
Chris@16 205 {
Chris@16 206 }
Chris@16 207
Chris@16 208 explicit dynamic_distinct_directive(char_t const* letters)
Chris@16 209 : tail(chset_p(letters))
Chris@16 210 {
Chris@16 211 }
Chris@16 212
Chris@16 213 template<typename ParserT>
Chris@16 214 typename result<typename as_parser<ParserT>::type>::type
Chris@16 215 operator[](ParserT const &subject) const
Chris@16 216 {
Chris@16 217 return
Chris@16 218 lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)];
Chris@16 219 }
Chris@16 220
Chris@16 221 tail_t tail;
Chris@16 222 };
Chris@16 223
Chris@16 224 //-----------------------------------------------------------------------------
Chris@16 225 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
Chris@16 226 } // namespace spirit
Chris@16 227 } // namespace boost
Chris@16 228
Chris@16 229 #endif // !defined(BOOST_SPIRIT_DISTINCT_HPP)