/*============================================================================= Copyright (c) 2001-2003 Joel de Guzman Copyright (c) 2001-2003 Daniel Nuffer 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) =============================================================================*/ #ifndef BOOST_SPIRIT_CHSET_HPP #define BOOST_SPIRIT_CHSET_HPP /////////////////////////////////////////////////////////////////////////////// #include #include #include #include /////////////////////////////////////////////////////////////////////////////// namespace boost { namespace spirit { BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN namespace utility { namespace impl { // This is here because some compilers choke on out-of-line member // template functions. And we don't want to put the whole algorithm // in the chset constructor in the class definition. template void construct_chset(boost::shared_ptr >& ptr, CharT2 const* definition); }} // namespace utility::impl /////////////////////////////////////////////////////////////////////////////// // // chset class // /////////////////////////////////////////////////////////////////////////////// template class chset: public char_parser > { public: chset(); chset(chset const& arg_); explicit chset(CharT arg_); explicit chset(anychar_parser arg_); explicit chset(nothing_parser arg_); explicit chset(chlit const& arg_); explicit chset(range const& arg_); explicit chset(negated_char_parser > const& arg_); explicit chset(negated_char_parser > const& arg_); template explicit chset(CharT2 const* definition) : ptr(new basic_chset()) { utility::impl::construct_chset(ptr, definition); } ~chset(); chset& operator=(chset const& rhs); chset& operator=(CharT rhs); chset& operator=(anychar_parser rhs); chset& operator=(nothing_parser rhs); chset& operator=(chlit const& rhs); chset& operator=(range const& rhs); chset& operator=(negated_char_parser > const& rhs); chset& operator=(negated_char_parser > const& rhs); void set(range const& arg_); void set(negated_char_parser > const& arg_); void set(negated_char_parser > const& arg_); void clear(range const& arg_); void clear(negated_char_parser > const& arg_); bool test(CharT ch) const; chset& inverse(); void swap(chset& x); chset& operator|=(chset const& x); chset& operator&=(chset const& x); chset& operator-=(chset const& x); chset& operator^=(chset const& x); private: boost::shared_ptr > ptr; }; /////////////////////////////////////////////////////////////////////////////// // // Generator functions // /////////////////////////////////////////////////////////////////////////////// template inline chset chset_p(chlit const& arg_) { return chset(arg_); } ////////////////////////////////// template inline chset chset_p(range const& arg_) { return chset(arg_); } template inline chset chset_p(negated_char_parser > const& arg_) { return chset(arg_); } template inline chset chset_p(negated_char_parser > const& arg_) { return chset(arg_); } ////////////////////////////////// inline chset chset_p(char const* init) { return chset(init); } ////////////////////////////////// inline chset chset_p(wchar_t const* init) { return chset(init); } ////////////////////////////////// inline chset chset_p(char ch) { return chset(ch); } ////////////////////////////////// inline chset chset_p(wchar_t ch) { return chset(ch); } ////////////////////////////////// inline chset chset_p(int ch) { return chset(ch); } ////////////////////////////////// inline chset chset_p(unsigned int ch) { return chset(ch); } ////////////////////////////////// inline chset chset_p(short ch) { return chset(ch); } #if !defined(BOOST_NO_INTRINSIC_WCHAR_T) ////////////////////////////////// inline chset chset_p(unsigned short ch) { return chset(ch); } #endif ////////////////////////////////// inline chset chset_p(long ch) { return chset(ch); } ////////////////////////////////// inline chset chset_p(unsigned long ch) { return chset(ch); } #ifdef BOOST_HAS_LONG_LONG ////////////////////////////////// inline chset< ::boost::long_long_type> chset_p( ::boost::long_long_type ch) { return chset< ::boost::long_long_type>(ch); } ////////////////////////////////// inline chset< ::boost::ulong_long_type> chset_p( ::boost::ulong_long_type ch) { return chset< ::boost::ulong_long_type>(ch); } #endif /////////////////////////////////////////////////////////////////////////////// BOOST_SPIRIT_CLASSIC_NAMESPACE_END }} // namespace BOOST_SPIRIT_CLASSIC_NS #endif #include #include