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 | |
| 
 | |
| 
 |