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.
		
		
		
		
		
			
		
			
				
					
					
						
							112 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
	
	
							112 lines
						
					
					
						
							3.7 KiB
						
					
					
				| /*============================================================================= | |
|     Copyright (c) 2003 Martin Wille | |
|     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_UTILITY_SCOPED_LOCK_HPP | |
| #define BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP | |
|  | |
| /////////////////////////////////////////////////////////////////////////////// | |
| #include <boost/spirit/home/classic/namespace.hpp> | |
| #if !defined(BOOST_SPIRIT_COMPOSITE_HPP) | |
| #include <boost/spirit/home/classic/core/composite.hpp> | |
| #endif | |
|  | |
| /////////////////////////////////////////////////////////////////////////////// | |
| namespace boost { namespace spirit { | |
| 
 | |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN | |
| 
 | |
|     /////////////////////////////////////////////////////////////////////////// | |
|     // | |
|     // scoped_lock_parser class | |
|     // | |
|     //      implements locking of a mutex during execution of | |
|     //      the parse method of an embedded parser | |
|     // | |
|     /////////////////////////////////////////////////////////////////////////// | |
|     template <typename MutexT, typename ParserT> | |
|     struct scoped_lock_parser | |
|         : public unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > > | |
|     { | |
|         typedef scoped_lock_parser<MutexT, ParserT> self_t; | |
|         typedef MutexT      mutex_t; | |
|         typedef ParserT     parser_t; | |
| 
 | |
|         template <typename ScannerT> | |
|         struct result | |
|         { | |
|             typedef typename parser_result<parser_t, ScannerT>::type type; | |
|         }; | |
| 
 | |
|         scoped_lock_parser(mutex_t &m, parser_t const &p) | |
|             : unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >(p) | |
|             , mutex(m) | |
|         {} | |
| 
 | |
| 
 | |
|         template <typename ScannerT> | |
|         typename parser_result<self_t, ScannerT>::type | |
|         parse(ScannerT const &scan) const | |
|         { | |
|             typedef typename  mutex_t::scoped_lock scoped_lock_t; | |
|             scoped_lock_t lock(mutex); | |
|             return this->subject().parse(scan); | |
|         } | |
| 
 | |
|         mutex_t &mutex; | |
|     }; | |
| 
 | |
|     /////////////////////////////////////////////////////////////////////////// | |
|     // | |
|     // scoped_lock_parser_gen | |
|     // | |
|     //      generator for scoped_lock_parser objects | |
|     //      operator[] returns scoped_lock_parser according to its argument | |
|     // | |
|     /////////////////////////////////////////////////////////////////////////// | |
|     template <typename MutexT> | |
|     struct scoped_lock_parser_gen | |
|     { | |
|         typedef MutexT mutex_t; | |
|         explicit scoped_lock_parser_gen(mutex_t &m) : mutex(m) {} | |
| 
 | |
|         template<typename ParserT> | |
|         scoped_lock_parser | |
|         < | |
|             MutexT, | |
|             typename as_parser<ParserT>::type | |
|         > | |
|         operator[](ParserT const &p) const | |
|         { | |
|             typedef ::BOOST_SPIRIT_CLASSIC_NS::as_parser<ParserT> as_parser_t; | |
|             typedef typename as_parser_t::type parser_t; | |
| 
 | |
|             return scoped_lock_parser<mutex_t, parser_t> | |
|                 (mutex, as_parser_t::convert(p)); | |
|         } | |
| 
 | |
|         mutex_t &mutex; | |
|     }; | |
| 
 | |
| 
 | |
|     /////////////////////////////////////////////////////////////////////////// | |
|     // | |
|     // scoped_lock_d parser directive | |
|     // | |
|     //      constructs a scoped_lock_parser generator from its argument | |
|     // | |
|     /////////////////////////////////////////////////////////////////////////// | |
|     template <typename MutexT> | |
|     scoped_lock_parser_gen<MutexT> | |
|     scoped_lock_d(MutexT &mutex) | |
|     { | |
|         return scoped_lock_parser_gen<MutexT>(mutex); | |
|     } | |
| 
 | |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_END | |
| 
 | |
| }} // namespace BOOST_SPIRIT_CLASSIC_NS | |
| #endif // BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP
 | |
| 
 |