/*============================================================================= | |
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 | |