1 /*=============================================================================
2 Copyright (c) 2003 Martin Wille
3 http://spirit.sourceforge.net/
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
8 #ifndef BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP
9 #define BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP
11 ///////////////////////////////////////////////////////////////////////////////
12 #include <boost/spirit/home/classic/namespace.hpp>
13 #include <boost/thread/lock_types.hpp>
14 #if !defined(BOOST_SPIRIT_COMPOSITE_HPP)
15 #include <boost/spirit/home/classic/core/composite.hpp>
18 ///////////////////////////////////////////////////////////////////////////////
19 namespace boost { namespace spirit {
21 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
23 ///////////////////////////////////////////////////////////////////////////
25 // scoped_lock_parser class
27 // implements locking of a mutex during execution of
28 // the parse method of an embedded parser
30 ///////////////////////////////////////////////////////////////////////////
31 template <typename MutexT, typename ParserT>
32 struct scoped_lock_parser
33 : public unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >
35 typedef scoped_lock_parser<MutexT, ParserT> self_t;
36 typedef MutexT mutex_t;
37 typedef ParserT parser_t;
39 template <typename ScannerT>
42 typedef typename parser_result<parser_t, ScannerT>::type type;
45 scoped_lock_parser(mutex_t &m, parser_t const &p)
46 : unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >(p)
51 template <typename ScannerT>
52 typename parser_result<self_t, ScannerT>::type
53 parse(ScannerT const &scan) const
55 typedef boost::unique_lock<mutex_t> scoped_lock_t;
56 scoped_lock_t lock(mutex);
57 return this->subject().parse(scan);
63 ///////////////////////////////////////////////////////////////////////////
65 // scoped_lock_parser_gen
67 // generator for scoped_lock_parser objects
68 // operator[] returns scoped_lock_parser according to its argument
70 ///////////////////////////////////////////////////////////////////////////
71 template <typename MutexT>
72 struct scoped_lock_parser_gen
74 typedef MutexT mutex_t;
75 explicit scoped_lock_parser_gen(mutex_t &m) : mutex(m) {}
77 template<typename ParserT>
81 typename as_parser<ParserT>::type
83 operator[](ParserT const &p) const
85 typedef ::BOOST_SPIRIT_CLASSIC_NS::as_parser<ParserT> as_parser_t;
86 typedef typename as_parser_t::type parser_t;
88 return scoped_lock_parser<mutex_t, parser_t>
89 (mutex, as_parser_t::convert(p));
96 ///////////////////////////////////////////////////////////////////////////
98 // scoped_lock_d parser directive
100 // constructs a scoped_lock_parser generator from its argument
102 ///////////////////////////////////////////////////////////////////////////
103 template <typename MutexT>
104 scoped_lock_parser_gen<MutexT>
105 scoped_lock_d(MutexT &mutex)
107 return scoped_lock_parser_gen<MutexT>(mutex);
110 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
112 }} // namespace BOOST_SPIRIT_CLASSIC_NS
113 #endif // BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP