]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // Copyright (c) 2001, Daniel C. Nuffer |
2 | // Copyright (c) 2001-2011 Hartmut Kaiser | |
3 | // | |
4 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | |
5 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
6 | ||
7 | #if !defined(BOOST_SPIRIT_ITERATOR_FIRST_OWNER_POLICY_MAR_16_2007_1108AM) | |
8 | #define BOOST_SPIRIT_ITERATOR_FIRST_OWNER_POLICY_MAR_16_2007_1108AM | |
9 | ||
10 | #include <boost/spirit/home/support/iterators/multi_pass_fwd.hpp> | |
11 | #include <boost/spirit/home/support/iterators/detail/multi_pass.hpp> | |
12 | ||
13 | namespace boost { namespace spirit { namespace iterator_policies | |
14 | { | |
15 | /////////////////////////////////////////////////////////////////////////// | |
16 | // class first_owner | |
17 | // Implementation of an OwnershipPolicy used by multi_pass | |
18 | // This ownership policy dictates that the first iterator created will | |
19 | // determine the lifespan of the shared components. This works well for | |
20 | // spirit, since no dynamic allocation of iterators is done, and all | |
21 | // copies are make on the stack. | |
22 | // | |
23 | // There is a caveat about using this policy together with the std_deque | |
24 | // StoragePolicy. Since first_owner always returns false from unique(), | |
25 | // std_deque will only release the queued data if clear_queue() is called. | |
26 | /////////////////////////////////////////////////////////////////////////// | |
27 | struct first_owner | |
28 | { | |
29 | /////////////////////////////////////////////////////////////////////// | |
30 | struct unique : detail::default_ownership_policy | |
31 | { | |
32 | unique() : first(true) {} | |
33 | unique(unique const&) : first(false) {} | |
34 | ||
35 | // return true to indicate deletion of resources | |
36 | template <typename MultiPass> | |
37 | static bool release(MultiPass& mp) | |
38 | { | |
39 | return mp.first; | |
40 | } | |
41 | ||
42 | // use swap from default policy | |
43 | // if we're the first, we still remain the first, even if assigned | |
44 | // to, so don't swap first. swap is only called from operator= | |
45 | ||
46 | template <typename MultiPass> | |
47 | static bool is_unique(MultiPass const&) | |
48 | { | |
49 | return false; // no way to know, so always return false | |
50 | } | |
51 | ||
52 | protected: | |
53 | bool first; | |
54 | }; | |
55 | ||
56 | //////////////////////////////////////////////////////////////////////// | |
57 | struct shared {}; // no shared data | |
58 | }; | |
59 | ||
60 | }}} | |
61 | ||
62 | #endif |