/*============================================================================= | |
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 <boost/shared_ptr.hpp> | |
#include <boost/spirit/home/classic/namespace.hpp> | |
#include <boost/spirit/home/classic/core/primitives/primitives.hpp> | |
#include <boost/spirit/home/classic/utility/impl/chset/basic_chset.hpp> | |
/////////////////////////////////////////////////////////////////////////////// | |
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 <typename CharT, typename CharT2> | |
void construct_chset(boost::shared_ptr<basic_chset<CharT> >& ptr, | |
CharT2 const* definition); | |
}} // namespace utility::impl | |
/////////////////////////////////////////////////////////////////////////////// | |
// | |
// chset class | |
// | |
/////////////////////////////////////////////////////////////////////////////// | |
template <typename CharT = char> | |
class chset: public char_parser<chset<CharT> > { | |
public: | |
chset(); | |
chset(chset const& arg_); | |
explicit chset(CharT arg_); | |
explicit chset(anychar_parser arg_); | |
explicit chset(nothing_parser arg_); | |
explicit chset(chlit<CharT> const& arg_); | |
explicit chset(range<CharT> const& arg_); | |
explicit chset(negated_char_parser<chlit<CharT> > const& arg_); | |
explicit chset(negated_char_parser<range<CharT> > const& arg_); | |
template <typename CharT2> | |
explicit chset(CharT2 const* definition) | |
: ptr(new basic_chset<CharT>()) | |
{ | |
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<CharT> const& rhs); | |
chset& operator=(range<CharT> const& rhs); | |
chset& operator=(negated_char_parser<chlit<CharT> > const& rhs); | |
chset& operator=(negated_char_parser<range<CharT> > const& rhs); | |
void set(range<CharT> const& arg_); | |
void set(negated_char_parser<chlit<CharT> > const& arg_); | |
void set(negated_char_parser<range<CharT> > const& arg_); | |
void clear(range<CharT> const& arg_); | |
void clear(negated_char_parser<range<CharT> > 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<basic_chset<CharT> > ptr; | |
}; | |
/////////////////////////////////////////////////////////////////////////////// | |
// | |
// Generator functions | |
// | |
/////////////////////////////////////////////////////////////////////////////// | |
template <typename CharT> | |
inline chset<CharT> | |
chset_p(chlit<CharT> const& arg_) | |
{ return chset<CharT>(arg_); } | |
////////////////////////////////// | |
template <typename CharT> | |
inline chset<CharT> | |
chset_p(range<CharT> const& arg_) | |
{ return chset<CharT>(arg_); } | |
template <typename CharT> | |
inline chset<CharT> | |
chset_p(negated_char_parser<chlit<CharT> > const& arg_) | |
{ return chset<CharT>(arg_); } | |
template <typename CharT> | |
inline chset<CharT> | |
chset_p(negated_char_parser<range<CharT> > const& arg_) | |
{ return chset<CharT>(arg_); } | |
////////////////////////////////// | |
inline chset<char> | |
chset_p(char const* init) | |
{ return chset<char>(init); } | |
////////////////////////////////// | |
inline chset<wchar_t> | |
chset_p(wchar_t const* init) | |
{ return chset<wchar_t>(init); } | |
////////////////////////////////// | |
inline chset<char> | |
chset_p(char ch) | |
{ return chset<char>(ch); } | |
////////////////////////////////// | |
inline chset<wchar_t> | |
chset_p(wchar_t ch) | |
{ return chset<wchar_t>(ch); } | |
////////////////////////////////// | |
inline chset<int> | |
chset_p(int ch) | |
{ return chset<int>(ch); } | |
////////////////////////////////// | |
inline chset<unsigned int> | |
chset_p(unsigned int ch) | |
{ return chset<unsigned int>(ch); } | |
////////////////////////////////// | |
inline chset<short> | |
chset_p(short ch) | |
{ return chset<short>(ch); } | |
#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) | |
////////////////////////////////// | |
inline chset<unsigned short> | |
chset_p(unsigned short ch) | |
{ return chset<unsigned short>(ch); } | |
#endif | |
////////////////////////////////// | |
inline chset<long> | |
chset_p(long ch) | |
{ return chset<long>(ch); } | |
////////////////////////////////// | |
inline chset<unsigned long> | |
chset_p(unsigned long ch) | |
{ return chset<unsigned long>(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 <boost/spirit/home/classic/utility/impl/chset.ipp> | |
#include <boost/spirit/home/classic/utility/chset_operators.hpp> |