/Src/Dependencies/Boost/boost/spirit/home/classic/utility/distinct.hpp
http://hadesmem.googlecode.com/ · C++ Header · 229 lines · 175 code · 37 blank · 17 comment · 0 complexity · ad88b4f602dfef1a812198427c02e663 MD5 · raw file
- /*=============================================================================
- Copyright (c) 1998-2003 Joel de Guzman
- Copyright (c) 2003 Vaclav Vesely
- http://spirit.sourceforge.net/
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- =============================================================================*/
- #if !defined(BOOST_SPIRIT_DISTINCT_HPP)
- #define BOOST_SPIRIT_DISTINCT_HPP
- #include <boost/spirit/home/classic/core/parser.hpp>
- #include <boost/spirit/home/classic/core/primitives/primitives.hpp>
- #include <boost/spirit/home/classic/core/composite/operators.hpp>
- #include <boost/spirit/home/classic/core/composite/directives.hpp>
- #include <boost/spirit/home/classic/core/composite/epsilon.hpp>
- #include <boost/spirit/home/classic/core/non_terminal/rule.hpp>
- #include <boost/spirit/home/classic/utility/chset.hpp>
- #include <boost/spirit/home/classic/utility/distinct_fwd.hpp>
- namespace boost {
- namespace spirit {
- BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
- //-----------------------------------------------------------------------------
- // distinct_parser class
- template <typename CharT, typename TailT>
- class distinct_parser
- {
- public:
- typedef
- contiguous<
- sequence<
- chseq<CharT const*>,
- negated_empty_match_parser<
- TailT
- >
- >
- >
- result_t;
- distinct_parser()
- : tail(chset<CharT>())
- {
- }
- explicit distinct_parser(parser<TailT> const & tail_)
- : tail(tail_.derived())
- {
- }
- explicit distinct_parser(CharT const* letters)
- : tail(chset_p(letters))
- {
- }
- result_t operator()(CharT const* str) const
- {
- return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)];
- }
- TailT tail;
- };
- //-----------------------------------------------------------------------------
- // distinct_directive class
- template <typename CharT, typename TailT>
- class distinct_directive
- {
- public:
- template<typename ParserT>
- struct result {
- typedef
- contiguous<
- sequence<
- ParserT,
- negated_empty_match_parser<
- TailT
- >
- >
- >
- type;
- };
- distinct_directive()
- : tail(chset<CharT>())
- {
- }
- explicit distinct_directive(CharT const* letters)
- : tail(chset_p(letters))
- {
- }
- explicit distinct_directive(parser<TailT> const & tail_)
- : tail(tail_.derived())
- {
- }
- template<typename ParserT>
- typename result<typename as_parser<ParserT>::type>::type
- operator[](ParserT const &subject) const
- {
- return
- lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)];
- }
- TailT tail;
- };
- //-----------------------------------------------------------------------------
- // dynamic_distinct_parser class
- template <typename ScannerT>
- class dynamic_distinct_parser
- {
- public:
- typedef typename ScannerT::value_t char_t;
- typedef
- rule<
- typename no_actions_scanner<
- typename lexeme_scanner<ScannerT>::type
- >::type
- >
- tail_t;
- typedef
- contiguous<
- sequence<
- chseq<char_t const*>,
- negated_empty_match_parser<
- tail_t
- >
- >
- >
- result_t;
- dynamic_distinct_parser()
- : tail(nothing_p)
- {
- }
- template<typename ParserT>
- explicit dynamic_distinct_parser(parser<ParserT> const & tail_)
- : tail(tail_.derived())
- {
- }
- explicit dynamic_distinct_parser(char_t const* letters)
- : tail(chset_p(letters))
- {
- }
- result_t operator()(char_t const* str) const
- {
- return lexeme_d[chseq_p(str) >> ~epsilon_p(tail)];
- }
- tail_t tail;
- };
- //-----------------------------------------------------------------------------
- // dynamic_distinct_directive class
- template <typename ScannerT>
- class dynamic_distinct_directive
- {
- public:
- typedef typename ScannerT::value_t char_t;
- typedef
- rule<
- typename no_actions_scanner<
- typename lexeme_scanner<ScannerT>::type
- >::type
- >
- tail_t;
- template<typename ParserT>
- struct result {
- typedef
- contiguous<
- sequence<
- ParserT,
- negated_empty_match_parser<
- tail_t
- >
- >
- >
- type;
- };
- dynamic_distinct_directive()
- : tail(nothing_p)
- {
- }
- template<typename ParserT>
- explicit dynamic_distinct_directive(parser<ParserT> const & tail_)
- : tail(tail_.derived())
- {
- }
- explicit dynamic_distinct_directive(char_t const* letters)
- : tail(chset_p(letters))
- {
- }
- template<typename ParserT>
- typename result<typename as_parser<ParserT>::type>::type
- operator[](ParserT const &subject) const
- {
- return
- lexeme_d[as_parser<ParserT>::convert(subject) >> ~epsilon_p(tail)];
- }
- tail_t tail;
- };
- //-----------------------------------------------------------------------------
- BOOST_SPIRIT_CLASSIC_NAMESPACE_END
- } // namespace spirit
- } // namespace boost
- #endif // !defined(BOOST_SPIRIT_DISTINCT_HPP)