Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2003 Joel de Guzman Chris@16: Copyright (c) 2001-2003 Daniel Nuffer Chris@16: http://spirit.sourceforge.net/ Chris@16: Chris@16: Use, modification and distribution is subject to the Boost Software Chris@16: License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: http://www.boost.org/LICENSE_1_0.txt) Chris@16: =============================================================================*/ Chris@16: #ifndef BOOST_SPIRIT_CHSET_IPP Chris@16: #define BOOST_SPIRIT_CHSET_IPP Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: #include Chris@16: #include Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: namespace boost { namespace spirit { Chris@16: Chris@16: BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // chset class Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: namespace utility { namespace impl { Chris@16: template Chris@16: inline void Chris@16: detach(boost::shared_ptr >& ptr) Chris@16: { Chris@16: if (!ptr.unique()) Chris@16: ptr = boost::shared_ptr > Chris@16: (new basic_chset(*ptr)); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void Chris@16: detach_clear(boost::shared_ptr >& ptr) Chris@16: { Chris@16: if (ptr.unique()) Chris@16: ptr->clear(); Chris@16: else Chris@16: ptr.reset(new basic_chset()); Chris@16: } Chris@16: Chris@16: template Chris@16: void construct_chset(boost::shared_ptr >& ptr, Chris@16: CharT2 const* definition) Chris@16: { Chris@16: CharT2 ch = *definition++; Chris@16: while (ch) Chris@16: { Chris@16: CharT2 next = *definition++; Chris@16: if (next == '-') Chris@16: { Chris@16: next = *definition++; Chris@16: if (next == 0) Chris@16: { Chris@16: ptr->set(ch); Chris@16: ptr->set('-'); Chris@16: break; Chris@16: } Chris@16: ptr->set(ch, next); Chris@16: } Chris@16: else Chris@16: { Chris@16: ptr->set(ch); Chris@16: } Chris@16: ch = next; Chris@16: } Chris@16: } Chris@16: Chris@16: }} // namespace utility::impl Chris@16: Chris@16: template Chris@16: inline chset::chset() Chris@16: : ptr(new basic_chset()) {} Chris@16: Chris@16: template Chris@16: inline chset::chset(chset const& arg_) Chris@16: : ptr(new basic_chset(*arg_.ptr)) {} Chris@16: Chris@16: template Chris@16: inline chset::chset(CharT arg_) Chris@16: : ptr(new basic_chset()) Chris@16: { ptr->set(arg_); } Chris@16: Chris@16: template Chris@16: inline chset::chset(anychar_parser /*arg*/) Chris@16: : ptr(new basic_chset()) Chris@16: { Chris@16: ptr->set( Chris@16: (std::numeric_limits::min)(), Chris@16: (std::numeric_limits::max)() Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset::chset(nothing_parser arg_) Chris@16: : ptr(new basic_chset()) {} Chris@16: Chris@16: template Chris@16: inline chset::chset(chlit const& arg_) Chris@16: : ptr(new basic_chset()) Chris@16: { ptr->set(arg_.ch); } Chris@16: Chris@16: template Chris@16: inline chset::chset(range const& arg_) Chris@16: : ptr(new basic_chset()) Chris@16: { ptr->set(arg_.first, arg_.last); } Chris@16: Chris@16: template Chris@16: inline chset::chset(negated_char_parser > const& arg_) Chris@16: : ptr(new basic_chset()) Chris@16: { Chris@16: set(arg_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset::chset(negated_char_parser > const& arg_) Chris@16: : ptr(new basic_chset()) Chris@16: { Chris@16: set(arg_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset::~chset() {} Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::operator=(chset const& rhs) Chris@16: { Chris@16: ptr = rhs.ptr; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::operator=(CharT rhs) Chris@16: { Chris@16: utility::impl::detach_clear(ptr); Chris@16: ptr->set(rhs); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::operator=(anychar_parser rhs) Chris@16: { Chris@16: utility::impl::detach_clear(ptr); Chris@16: ptr->set( Chris@16: (std::numeric_limits::min)(), Chris@16: (std::numeric_limits::max)() Chris@16: ); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::operator=(nothing_parser rhs) Chris@16: { Chris@16: utility::impl::detach_clear(ptr); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::operator=(chlit const& rhs) Chris@16: { Chris@16: utility::impl::detach_clear(ptr); Chris@16: ptr->set(rhs.ch); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::operator=(range const& rhs) Chris@16: { Chris@16: utility::impl::detach_clear(ptr); Chris@16: ptr->set(rhs.first, rhs.last); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::operator=(negated_char_parser > const& rhs) Chris@16: { Chris@16: utility::impl::detach_clear(ptr); Chris@16: set(rhs); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::operator=(negated_char_parser > const& rhs) Chris@16: { Chris@16: utility::impl::detach_clear(ptr); Chris@16: set(rhs); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline void Chris@16: chset::set(range const& arg_) Chris@16: { Chris@16: utility::impl::detach(ptr); Chris@16: ptr->set(arg_.first, arg_.last); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void Chris@16: chset::set(negated_char_parser > const& arg_) Chris@16: { Chris@16: utility::impl::detach(ptr); Chris@16: Chris@16: if(arg_.positive.ch != (std::numeric_limits::min)()) { Chris@16: ptr->set((std::numeric_limits::min)(), arg_.positive.ch - 1); Chris@16: } Chris@16: if(arg_.positive.ch != (std::numeric_limits::max)()) { Chris@16: ptr->set(arg_.positive.ch + 1, (std::numeric_limits::max)()); Chris@16: } Chris@16: } Chris@16: Chris@16: template Chris@16: inline void Chris@16: chset::set(negated_char_parser > const& arg_) Chris@16: { Chris@16: utility::impl::detach(ptr); Chris@16: Chris@16: if(arg_.positive.first != (std::numeric_limits::min)()) { Chris@16: ptr->set((std::numeric_limits::min)(), arg_.positive.first - 1); Chris@16: } Chris@16: if(arg_.positive.last != (std::numeric_limits::max)()) { Chris@16: ptr->set(arg_.positive.last + 1, (std::numeric_limits::max)()); Chris@16: } Chris@16: } Chris@16: Chris@16: template Chris@16: inline void Chris@16: chset::clear(range const& arg_) Chris@16: { Chris@16: utility::impl::detach(ptr); Chris@16: ptr->clear(arg_.first, arg_.last); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void Chris@16: chset::clear(negated_char_parser > const& arg_) Chris@16: { Chris@16: utility::impl::detach(ptr); Chris@16: Chris@16: if(arg_.positive.first != (std::numeric_limits::min)()) { Chris@16: ptr->clear((std::numeric_limits::min)(), arg_.positive.first - 1); Chris@16: } Chris@16: if(arg_.positive.last != (std::numeric_limits::max)()) { Chris@16: ptr->clear(arg_.positive.last + 1, (std::numeric_limits::max)()); Chris@16: } Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool Chris@16: chset::test(CharT ch) const Chris@16: { return ptr->test(ch); } Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::inverse() Chris@16: { Chris@16: utility::impl::detach(ptr); Chris@16: ptr->inverse(); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline void Chris@16: chset::swap(chset& x) Chris@16: { ptr.swap(x.ptr); } Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::operator|=(chset const& x) Chris@16: { Chris@16: utility::impl::detach(ptr); Chris@16: *ptr |= *x.ptr; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::operator&=(chset const& x) Chris@16: { Chris@16: utility::impl::detach(ptr); Chris@16: *ptr &= *x.ptr; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::operator-=(chset const& x) Chris@16: { Chris@16: utility::impl::detach(ptr); Chris@16: *ptr -= *x.ptr; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template Chris@16: inline chset& Chris@16: chset::operator^=(chset const& x) Chris@16: { Chris@16: utility::impl::detach(ptr); Chris@16: *ptr ^= *x.ptr; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: BOOST_SPIRIT_CLASSIC_NAMESPACE_END Chris@16: Chris@16: }} // namespace boost::spirit Chris@16: Chris@16: #endif Chris@16: