1 | // Boost.Signals library
|
---|
2 |
|
---|
3 | // Copyright Douglas Gregor 2001-2004. Use, modification and
|
---|
4 | // distribution is subject to the Boost Software License, Version
|
---|
5 | // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
---|
6 | // http://www.boost.org/LICENSE_1_0.txt)
|
---|
7 |
|
---|
8 | // For more information, see http://www.boost.org
|
---|
9 |
|
---|
10 | #ifndef BOOST_SIGNALS_SLOT_CALL_ITERATOR
|
---|
11 | #define BOOST_SIGNALS_SLOT_CALL_ITERATOR
|
---|
12 |
|
---|
13 | #include <memory>
|
---|
14 | #include <boost/iterator/iterator_facade.hpp>
|
---|
15 | #include <boost/smart_ptr.hpp>
|
---|
16 | #include <boost/signals/detail/config.hpp>
|
---|
17 | #include <boost/signals/connection.hpp>
|
---|
18 | #include <boost/optional.hpp>
|
---|
19 |
|
---|
20 | #ifdef BOOST_HAS_ABI_HEADERS
|
---|
21 | # include BOOST_ABI_PREFIX
|
---|
22 | #endif
|
---|
23 |
|
---|
24 | namespace boost {
|
---|
25 | namespace BOOST_SIGNALS_NAMESPACE {
|
---|
26 | namespace detail {
|
---|
27 |
|
---|
28 | // Generates a slot call iterator. Essentially, this is an iterator that:
|
---|
29 | // - skips over disconnected slots in the underlying list
|
---|
30 | // - calls the connected slots when dereferenced
|
---|
31 | // - caches the result of calling the slots
|
---|
32 | template<typename Function, typename Iterator>
|
---|
33 | class slot_call_iterator
|
---|
34 | : public iterator_facade<slot_call_iterator<Function, Iterator>,
|
---|
35 | typename Function::result_type,
|
---|
36 | single_pass_traversal_tag,
|
---|
37 | typename Function::result_type const&>
|
---|
38 | {
|
---|
39 | typedef iterator_facade<slot_call_iterator<Function, Iterator>,
|
---|
40 | typename Function::result_type,
|
---|
41 | single_pass_traversal_tag,
|
---|
42 | typename Function::result_type const&>
|
---|
43 | inherited;
|
---|
44 |
|
---|
45 | typedef typename Function::result_type result_type;
|
---|
46 |
|
---|
47 | friend class iterator_core_access;
|
---|
48 |
|
---|
49 | public:
|
---|
50 | slot_call_iterator(Iterator iter_in, Iterator end_in, Function f,
|
---|
51 | optional<result_type> &c)
|
---|
52 | : iter(iter_in), end(end_in), f(f), cache(&c)
|
---|
53 | {
|
---|
54 | iter = std::find_if(iter, end, is_callable());
|
---|
55 | }
|
---|
56 |
|
---|
57 | typename inherited::reference
|
---|
58 | dereference() const
|
---|
59 | {
|
---|
60 | if (!cache->is_initialized()) {
|
---|
61 | cache->reset(f(*iter));
|
---|
62 | }
|
---|
63 |
|
---|
64 | return cache->get();
|
---|
65 | }
|
---|
66 |
|
---|
67 | void increment()
|
---|
68 | {
|
---|
69 | iter = std::find_if(++iter, end, is_callable());
|
---|
70 | cache->reset();
|
---|
71 | }
|
---|
72 |
|
---|
73 | bool equal(const slot_call_iterator& other) const
|
---|
74 | {
|
---|
75 | iter = std::find_if(iter, end, is_callable());
|
---|
76 | other.iter = std::find_if(other.iter, other.end,
|
---|
77 | is_callable());
|
---|
78 | return iter == other.iter;
|
---|
79 | }
|
---|
80 |
|
---|
81 | private:
|
---|
82 | mutable Iterator iter;
|
---|
83 | Iterator end;
|
---|
84 | Function f;
|
---|
85 | optional<result_type>* cache;
|
---|
86 | };
|
---|
87 | } // end namespace detail
|
---|
88 | } // end namespace BOOST_SIGNALS_NAMESPACE
|
---|
89 | } // end namespace boost
|
---|
90 |
|
---|
91 | #ifdef BOOST_HAS_ABI_HEADERS
|
---|
92 | # include BOOST_ABI_SUFFIX
|
---|
93 | #endif
|
---|
94 |
|
---|
95 | #endif // BOOST_SIGNALS_SLOT_CALL_ITERATOR
|
---|