comparison DEPENDENCIES/generic/include/boost/spirit/home/classic/utility/scoped_lock.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
1 /*=============================================================================
2 Copyright (c) 2003 Martin Wille
3 http://spirit.sourceforge.net/
4
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
10
11 ///////////////////////////////////////////////////////////////////////////////
12 #include <boost/spirit/home/classic/namespace.hpp>
13 #if !defined(BOOST_SPIRIT_COMPOSITE_HPP)
14 #include <boost/spirit/home/classic/core/composite.hpp>
15 #endif
16
17 ///////////////////////////////////////////////////////////////////////////////
18 namespace boost { namespace spirit {
19
20 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
21
22 ///////////////////////////////////////////////////////////////////////////
23 //
24 // scoped_lock_parser class
25 //
26 // implements locking of a mutex during execution of
27 // the parse method of an embedded parser
28 //
29 ///////////////////////////////////////////////////////////////////////////
30 template <typename MutexT, typename ParserT>
31 struct scoped_lock_parser
32 : public unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >
33 {
34 typedef scoped_lock_parser<MutexT, ParserT> self_t;
35 typedef MutexT mutex_t;
36 typedef ParserT parser_t;
37
38 template <typename ScannerT>
39 struct result
40 {
41 typedef typename parser_result<parser_t, ScannerT>::type type;
42 };
43
44 scoped_lock_parser(mutex_t &m, parser_t const &p)
45 : unary< ParserT, parser< scoped_lock_parser<MutexT, ParserT> > >(p)
46 , mutex(m)
47 {}
48
49
50 template <typename ScannerT>
51 typename parser_result<self_t, ScannerT>::type
52 parse(ScannerT const &scan) const
53 {
54 typedef typename mutex_t::scoped_lock scoped_lock_t;
55 scoped_lock_t lock(mutex);
56 return this->subject().parse(scan);
57 }
58
59 mutex_t &mutex;
60 };
61
62 ///////////////////////////////////////////////////////////////////////////
63 //
64 // scoped_lock_parser_gen
65 //
66 // generator for scoped_lock_parser objects
67 // operator[] returns scoped_lock_parser according to its argument
68 //
69 ///////////////////////////////////////////////////////////////////////////
70 template <typename MutexT>
71 struct scoped_lock_parser_gen
72 {
73 typedef MutexT mutex_t;
74 explicit scoped_lock_parser_gen(mutex_t &m) : mutex(m) {}
75
76 template<typename ParserT>
77 scoped_lock_parser
78 <
79 MutexT,
80 typename as_parser<ParserT>::type
81 >
82 operator[](ParserT const &p) const
83 {
84 typedef ::BOOST_SPIRIT_CLASSIC_NS::as_parser<ParserT> as_parser_t;
85 typedef typename as_parser_t::type parser_t;
86
87 return scoped_lock_parser<mutex_t, parser_t>
88 (mutex, as_parser_t::convert(p));
89 }
90
91 mutex_t &mutex;
92 };
93
94
95 ///////////////////////////////////////////////////////////////////////////
96 //
97 // scoped_lock_d parser directive
98 //
99 // constructs a scoped_lock_parser generator from its argument
100 //
101 ///////////////////////////////////////////////////////////////////////////
102 template <typename MutexT>
103 scoped_lock_parser_gen<MutexT>
104 scoped_lock_d(MutexT &mutex)
105 {
106 return scoped_lock_parser_gen<MutexT>(mutex);
107 }
108
109 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
110
111 }} // namespace BOOST_SPIRIT_CLASSIC_NS
112 #endif // BOOST_SPIRIT_UTILITY_SCOPED_LOCK_HPP