annotate DEPENDENCIES/generic/include/boost/signals/detail/signal_base.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Boost.Signals library
Chris@16 2
Chris@16 3 // Copyright Douglas Gregor 2001-2004. Use, modification and
Chris@16 4 // distribution is subject to the Boost Software License, Version
Chris@16 5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 6 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 7
Chris@16 8 // For more information, see http://www.boost.org
Chris@16 9
Chris@16 10 #ifndef BOOST_SIGNALS_SIGNAL_BASE_HEADER
Chris@16 11 #define BOOST_SIGNALS_SIGNAL_BASE_HEADER
Chris@16 12
Chris@16 13 #include <boost/signals/detail/config.hpp>
Chris@16 14 #include <boost/signals/detail/signals_common.hpp>
Chris@16 15 #include <boost/signals/detail/named_slot_map.hpp>
Chris@16 16 #include <boost/signals/connection.hpp>
Chris@16 17 #include <boost/signals/trackable.hpp>
Chris@16 18 #include <boost/signals/slot.hpp>
Chris@16 19 #include <boost/smart_ptr.hpp>
Chris@101 20 #include <boost/noncopyable.hpp>
Chris@16 21 #include <boost/function/function2.hpp>
Chris@16 22 #include <utility>
Chris@16 23 #include <vector>
Chris@16 24
Chris@16 25 #ifdef BOOST_HAS_ABI_HEADERS
Chris@16 26 # include BOOST_ABI_PREFIX
Chris@16 27 #endif
Chris@16 28
Chris@16 29 namespace boost {
Chris@16 30 namespace BOOST_SIGNALS_NAMESPACE {
Chris@16 31 namespace detail {
Chris@16 32 // Must be constructed before calling the slots, because it safely
Chris@16 33 // manages call depth
Chris@16 34 class BOOST_SIGNALS_DECL call_notification {
Chris@16 35 public:
Chris@16 36 call_notification(const shared_ptr<signal_base_impl>&);
Chris@16 37 ~call_notification();
Chris@16 38
Chris@16 39 shared_ptr<signal_base_impl> impl;
Chris@16 40 };
Chris@16 41
Chris@16 42 // Implementation of base class for all signals. It handles the
Chris@16 43 // management of the underlying slot lists.
Chris@16 44 class BOOST_SIGNALS_DECL signal_base_impl {
Chris@16 45 public:
Chris@16 46 friend class call_notification;
Chris@16 47
Chris@16 48 typedef function2<bool, stored_group, stored_group> compare_type;
Chris@16 49
Chris@16 50 // Make sure that an exception does not cause the "clearing" flag to
Chris@16 51 // remain set
Chris@16 52 class temporarily_set_clearing {
Chris@16 53 public:
Chris@16 54 temporarily_set_clearing(signal_base_impl* b) : base(b)
Chris@16 55 {
Chris@16 56 base->flags.clearing = true;
Chris@16 57 }
Chris@16 58
Chris@16 59 ~temporarily_set_clearing()
Chris@16 60 {
Chris@16 61 base->flags.clearing = false;
Chris@16 62 }
Chris@16 63
Chris@16 64 private:
Chris@16 65 signal_base_impl* base;
Chris@16 66 };
Chris@16 67
Chris@16 68 friend class temporarily_set_clearing;
Chris@16 69
Chris@16 70 signal_base_impl(const compare_type&, const any&);
Chris@16 71 ~signal_base_impl();
Chris@16 72
Chris@16 73 // Disconnect all slots connected to this signal
Chris@16 74 void disconnect_all_slots();
Chris@16 75
Chris@16 76 // Are there any connected slots?
Chris@16 77 bool empty() const;
Chris@16 78
Chris@16 79 // The number of connected slots
Chris@16 80 std::size_t num_slots() const;
Chris@16 81
Chris@16 82 // Disconnect all slots in the given group
Chris@16 83 void disconnect(const stored_group&);
Chris@16 84
Chris@16 85 // We're being notified that a slot has disconnected
Chris@16 86 static void slot_disconnected(void* obj, void* data);
Chris@16 87
Chris@16 88 connection connect_slot(const any& slot,
Chris@16 89 const stored_group& name,
Chris@16 90 shared_ptr<slot_base::data_t> data,
Chris@16 91 connect_position at);
Chris@16 92
Chris@16 93 private:
Chris@16 94 // Remove all of the slots that have been marked "disconnected"
Chris@16 95 void remove_disconnected_slots() const;
Chris@16 96
Chris@16 97 public:
Chris@16 98 // Our call depth when invoking slots (> 1 when we have a loop)
Chris@16 99 mutable int call_depth;
Chris@16 100
Chris@16 101 struct {
Chris@16 102 // True if some slots have disconnected, but we were not able to
Chris@16 103 // remove them from the list of slots because there are valid
Chris@16 104 // iterators into the slot list
Chris@16 105 mutable bool delayed_disconnect:1;
Chris@16 106
Chris@16 107 // True if we are disconnecting all disconnected slots
Chris@16 108 bool clearing:1;
Chris@16 109 } flags;
Chris@16 110
Chris@16 111 // Slots
Chris@16 112 mutable named_slot_map slots_;
Chris@16 113 any combiner_;
Chris@16 114
Chris@16 115 // Types
Chris@16 116 typedef named_slot_map::iterator iterator;
Chris@16 117 };
Chris@16 118
Chris@16 119 class BOOST_SIGNALS_DECL signal_base : public noncopyable {
Chris@16 120 public:
Chris@16 121 typedef signal_base_impl::compare_type compare_type;
Chris@16 122
Chris@16 123 friend class call_notification;
Chris@16 124
Chris@16 125 signal_base(const compare_type& comp, const any& combiner);
Chris@16 126 ~signal_base();
Chris@16 127
Chris@16 128 public:
Chris@16 129 // Disconnect all slots connected to this signal
Chris@16 130 void disconnect_all_slots() { impl->disconnect_all_slots(); }
Chris@16 131
Chris@16 132 // Are there any connected slots?
Chris@16 133 bool empty() const { return impl->empty(); }
Chris@16 134
Chris@16 135 // How many slots are connected?
Chris@16 136 std::size_t num_slots() const { return impl->num_slots(); }
Chris@16 137
Chris@16 138 protected:
Chris@16 139 connection connect_slot(const any& slot,
Chris@16 140 const stored_group& name,
Chris@16 141 shared_ptr<slot_base::data_t> data,
Chris@16 142 connect_position at)
Chris@16 143 {
Chris@16 144 return impl->connect_slot(slot, name, data, at);
Chris@16 145 }
Chris@16 146
Chris@16 147 typedef named_slot_map::iterator iterator;
Chris@16 148
Chris@16 149 shared_ptr<signal_base_impl> impl;
Chris@16 150 };
Chris@16 151 } // end namespace detail
Chris@16 152 } // end namespace BOOST_SIGNALS_NAMESPACE
Chris@16 153 } // end namespace boost
Chris@16 154
Chris@16 155 #ifdef BOOST_HAS_ABI_HEADERS
Chris@16 156 # include BOOST_ABI_SUFFIX
Chris@16 157 #endif
Chris@16 158
Chris@16 159 #endif // BOOST_SIGNALS_SIGNAL_BASE_HEADER