You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
366 lines
9.0 KiB
366 lines
9.0 KiB
/*============================================================================= |
|
Copyright (c) 2001-2003 Joel de Guzman |
|
Copyright (c) 2001-2003 Daniel Nuffer |
|
http://spirit.sourceforge.net/ |
|
|
|
Use, modification and distribution is subject to 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_IPP |
|
#define BOOST_SPIRIT_CHSET_IPP |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
#include <boost/limits.hpp> |
|
#include <boost/spirit/home/classic/utility/chset.hpp> |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
namespace boost { namespace spirit { |
|
|
|
BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
// |
|
// chset class |
|
// |
|
/////////////////////////////////////////////////////////////////////////////// |
|
namespace utility { namespace impl { |
|
template <typename CharT> |
|
inline void |
|
detach(boost::shared_ptr<basic_chset<CharT> >& ptr) |
|
{ |
|
if (!ptr.unique()) |
|
ptr = boost::shared_ptr<basic_chset<CharT> > |
|
(new basic_chset<CharT>(*ptr)); |
|
} |
|
|
|
template <typename CharT> |
|
inline void |
|
detach_clear(boost::shared_ptr<basic_chset<CharT> >& ptr) |
|
{ |
|
if (ptr.unique()) |
|
ptr->clear(); |
|
else |
|
ptr.reset(new basic_chset<CharT>()); |
|
} |
|
|
|
template <typename CharT, typename CharT2> |
|
void construct_chset(boost::shared_ptr<basic_chset<CharT> >& ptr, |
|
CharT2 const* definition) |
|
{ |
|
CharT2 ch = *definition++; |
|
while (ch) |
|
{ |
|
CharT2 next = *definition++; |
|
if (next == '-') |
|
{ |
|
next = *definition++; |
|
if (next == 0) |
|
{ |
|
ptr->set(ch); |
|
ptr->set('-'); |
|
break; |
|
} |
|
ptr->set(ch, next); |
|
} |
|
else |
|
{ |
|
ptr->set(ch); |
|
} |
|
ch = next; |
|
} |
|
} |
|
|
|
////////////////////////////////// |
|
|
|
#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) |
|
|
|
template <typename CharT, typename FakeT> |
|
void chset_negated_set(boost::shared_ptr<basic_chset<CharT> > &ptr, chlit<CharT> const &ch, |
|
FakeT) |
|
{ |
|
if(ch.ch != (std::numeric_limits<CharT>::min)()) { |
|
ptr->set((std::numeric_limits<CharT>::min)(), ch.ch - 1); |
|
} |
|
if(ch.ch != (std::numeric_limits<CharT>::max)()) { |
|
ptr->set(ch.ch + 1, (std::numeric_limits<CharT>::max)()); |
|
} |
|
} |
|
|
|
template <typename CharT, typename FakeT> |
|
void chset_negated_set(boost::shared_ptr<basic_chset<CharT> > &ptr, |
|
spirit::range<CharT> const &rng, FakeT) |
|
{ |
|
if(rng.first != (std::numeric_limits<CharT>::min)()) { |
|
ptr->set((std::numeric_limits<CharT>::min)(), rng.first - 1); |
|
} |
|
if(rng.last != (std::numeric_limits<CharT>::max)()) { |
|
ptr->set(rng.last + 1, (std::numeric_limits<CharT>::max)()); |
|
} |
|
} |
|
|
|
#endif // BOOST_WORKAROUND(BOOST_MSVC, < 1300) |
|
|
|
////////////////////////////////// |
|
|
|
}} // namespace utility::impl |
|
|
|
template <typename CharT> |
|
inline chset<CharT>::chset() |
|
: ptr(new basic_chset<CharT>()) {} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>::chset(chset const& arg_) |
|
: ptr(new basic_chset<CharT>(*arg_.ptr)) {} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>::chset(CharT arg_) |
|
: ptr(new basic_chset<CharT>()) |
|
{ ptr->set(arg_); } |
|
|
|
template <typename CharT> |
|
inline chset<CharT>::chset(anychar_parser /*arg*/) |
|
: ptr(new basic_chset<CharT>()) |
|
{ |
|
ptr->set( |
|
(std::numeric_limits<CharT>::min)(), |
|
(std::numeric_limits<CharT>::max)() |
|
); |
|
} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>::chset(nothing_parser arg_) |
|
: ptr(new basic_chset<CharT>()) {} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>::chset(chlit<CharT> const& arg_) |
|
: ptr(new basic_chset<CharT>()) |
|
{ ptr->set(arg_.ch); } |
|
|
|
template <typename CharT> |
|
inline chset<CharT>::chset(range<CharT> const& arg_) |
|
: ptr(new basic_chset<CharT>()) |
|
{ ptr->set(arg_.first, arg_.last); } |
|
|
|
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) |
|
|
|
template <typename CharT> |
|
inline chset<CharT>::chset(negated_char_parser<chlit<CharT> > const& arg_) |
|
: ptr(new basic_chset<CharT>()) |
|
{ |
|
set(arg_); |
|
} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>::chset(negated_char_parser<range<CharT> > const& arg_) |
|
: ptr(new basic_chset<CharT>()) |
|
{ |
|
set(arg_); |
|
} |
|
|
|
#endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300) |
|
|
|
template <typename CharT> |
|
inline chset<CharT>::~chset() {} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::operator=(chset const& rhs) |
|
{ |
|
ptr = rhs.ptr; |
|
return *this; |
|
} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::operator=(CharT rhs) |
|
{ |
|
utility::impl::detach_clear(ptr); |
|
ptr->set(rhs); |
|
return *this; |
|
} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::operator=(anychar_parser rhs) |
|
{ |
|
utility::impl::detach_clear(ptr); |
|
ptr->set( |
|
(std::numeric_limits<CharT>::min)(), |
|
(std::numeric_limits<CharT>::max)() |
|
); |
|
return *this; |
|
} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::operator=(nothing_parser rhs) |
|
{ |
|
utility::impl::detach_clear(ptr); |
|
return *this; |
|
} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::operator=(chlit<CharT> const& rhs) |
|
{ |
|
utility::impl::detach_clear(ptr); |
|
ptr->set(rhs.ch); |
|
return *this; |
|
} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::operator=(range<CharT> const& rhs) |
|
{ |
|
utility::impl::detach_clear(ptr); |
|
ptr->set(rhs.first, rhs.last); |
|
return *this; |
|
} |
|
|
|
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::operator=(negated_char_parser<chlit<CharT> > const& rhs) |
|
{ |
|
utility::impl::detach_clear(ptr); |
|
set(rhs); |
|
return *this; |
|
} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::operator=(negated_char_parser<range<CharT> > const& rhs) |
|
{ |
|
utility::impl::detach_clear(ptr); |
|
set(rhs); |
|
return *this; |
|
} |
|
|
|
#endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300) |
|
|
|
template <typename CharT> |
|
inline void |
|
chset<CharT>::set(range<CharT> const& arg_) |
|
{ |
|
utility::impl::detach(ptr); |
|
ptr->set(arg_.first, arg_.last); |
|
} |
|
|
|
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) |
|
|
|
template <typename CharT> |
|
inline void |
|
chset<CharT>::set(negated_char_parser<chlit<CharT> > const& arg_) |
|
{ |
|
utility::impl::detach(ptr); |
|
|
|
if(arg_.positive.ch != (std::numeric_limits<CharT>::min)()) { |
|
ptr->set((std::numeric_limits<CharT>::min)(), arg_.positive.ch - 1); |
|
} |
|
if(arg_.positive.ch != (std::numeric_limits<CharT>::max)()) { |
|
ptr->set(arg_.positive.ch + 1, (std::numeric_limits<CharT>::max)()); |
|
} |
|
} |
|
|
|
template <typename CharT> |
|
inline void |
|
chset<CharT>::set(negated_char_parser<range<CharT> > const& arg_) |
|
{ |
|
utility::impl::detach(ptr); |
|
|
|
if(arg_.positive.first != (std::numeric_limits<CharT>::min)()) { |
|
ptr->set((std::numeric_limits<CharT>::min)(), arg_.positive.first - 1); |
|
} |
|
if(arg_.positive.last != (std::numeric_limits<CharT>::max)()) { |
|
ptr->set(arg_.positive.last + 1, (std::numeric_limits<CharT>::max)()); |
|
} |
|
} |
|
|
|
#endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300) |
|
|
|
template <typename CharT> |
|
inline void |
|
chset<CharT>::clear(range<CharT> const& arg_) |
|
{ |
|
utility::impl::detach(ptr); |
|
ptr->clear(arg_.first, arg_.last); |
|
} |
|
|
|
template <typename CharT> |
|
inline void |
|
chset<CharT>::clear(negated_char_parser<range<CharT> > const& arg_) |
|
{ |
|
utility::impl::detach(ptr); |
|
|
|
if(arg_.positive.first != (std::numeric_limits<CharT>::min)()) { |
|
ptr->clear((std::numeric_limits<CharT>::min)(), arg_.positive.first - 1); |
|
} |
|
if(arg_.positive.last != (std::numeric_limits<CharT>::max)()) { |
|
ptr->clear(arg_.positive.last + 1, (std::numeric_limits<CharT>::max)()); |
|
} |
|
} |
|
|
|
template <typename CharT> |
|
inline bool |
|
chset<CharT>::test(CharT ch) const |
|
{ return ptr->test(ch); } |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::inverse() |
|
{ |
|
utility::impl::detach(ptr); |
|
ptr->inverse(); |
|
return *this; |
|
} |
|
|
|
template <typename CharT> |
|
inline void |
|
chset<CharT>::swap(chset& x) |
|
{ ptr.swap(x.ptr); } |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::operator|=(chset const& x) |
|
{ |
|
utility::impl::detach(ptr); |
|
*ptr |= *x.ptr; |
|
return *this; |
|
} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::operator&=(chset const& x) |
|
{ |
|
utility::impl::detach(ptr); |
|
*ptr &= *x.ptr; |
|
return *this; |
|
} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::operator-=(chset const& x) |
|
{ |
|
utility::impl::detach(ptr); |
|
*ptr -= *x.ptr; |
|
return *this; |
|
} |
|
|
|
template <typename CharT> |
|
inline chset<CharT>& |
|
chset<CharT>::operator^=(chset const& x) |
|
{ |
|
utility::impl::detach(ptr); |
|
*ptr ^= *x.ptr; |
|
return *this; |
|
} |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
BOOST_SPIRIT_CLASSIC_NAMESPACE_END |
|
|
|
}} // namespace boost::spirit |
|
|
|
#endif |
|
|
|
|