]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/signals2/include/boost/signals2/slot_base.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / signals2 / include / boost / signals2 / slot_base.hpp
CommitLineData
7c673cae
FG
1// Boost.Signals2 library
2
3// Copyright Frank Mori Hess 2007-2008.
4// Copyright Timmo Stange 2007.
5// Copyright Douglas Gregor 2001-2004. Use, modification and
6// distribution is subject to the Boost Software License, Version
7// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8// http://www.boost.org/LICENSE_1_0.txt)
9
10// For more information, see http://www.boost.org
11
12#ifndef BOOST_SIGNALS2_SLOT_BASE_HPP
13#define BOOST_SIGNALS2_SLOT_BASE_HPP
14
15#include <boost/shared_ptr.hpp>
16#include <boost/weak_ptr.hpp>
17#include <boost/signals2/detail/foreign_ptr.hpp>
18#include <boost/signals2/expired_slot.hpp>
19#include <boost/signals2/signal_base.hpp>
20#include <boost/variant/apply_visitor.hpp>
21#include <boost/variant/variant.hpp>
22#include <vector>
23
24namespace boost
25{
26 namespace signals2
27 {
28 namespace detail
29 {
30 class tracked_objects_visitor;
31 class trackable_pointee;
32
33 typedef boost::variant<boost::weak_ptr<trackable_pointee>, boost::weak_ptr<void>, detail::foreign_void_weak_ptr > void_weak_ptr_variant;
34 typedef boost::variant<boost::shared_ptr<void>, detail::foreign_void_shared_ptr > void_shared_ptr_variant;
35 class lock_weak_ptr_visitor
36 {
37 public:
38 typedef void_shared_ptr_variant result_type;
39 template<typename WeakPtr>
40 result_type operator()(const WeakPtr &wp) const
41 {
42 return wp.lock();
43 }
44 // overload to prevent incrementing use count of shared_ptr associated
45 // with signals2::trackable objects
46 result_type operator()(const weak_ptr<trackable_pointee> &) const
47 {
48 return boost::shared_ptr<void>();
49 }
50 };
51 class expired_weak_ptr_visitor
52 {
53 public:
54 typedef bool result_type;
55 template<typename WeakPtr>
56 bool operator()(const WeakPtr &wp) const
57 {
58 return wp.expired();
59 }
60 };
61 }
62
63 class slot_base
64 {
65 public:
66 typedef std::vector<detail::void_weak_ptr_variant> tracked_container_type;
67 typedef std::vector<detail::void_shared_ptr_variant> locked_container_type;
68
69 const tracked_container_type& tracked_objects() const {return _tracked_objects;}
70 #ifndef BOOST_NO_EXCEPTIONS
71 locked_container_type lock() const
72 {
73 locked_container_type locked_objects;
74 tracked_container_type::const_iterator it;
75 for(it = tracked_objects().begin(); it != tracked_objects().end(); ++it)
76 {
77 locked_objects.push_back(apply_visitor(detail::lock_weak_ptr_visitor(), *it));
78 if(apply_visitor(detail::expired_weak_ptr_visitor(), *it))
79 {
80 throw expired_slot();
81 }
82 }
83 return locked_objects;
84 }
85 #endif
86 bool expired() const
87 {
88 tracked_container_type::const_iterator it;
89 for(it = tracked_objects().begin(); it != tracked_objects().end(); ++it)
90 {
91 if(apply_visitor(detail::expired_weak_ptr_visitor(), *it)) return true;
92 }
93 return false;
94 }
95 protected:
96 friend class detail::tracked_objects_visitor;
97
98 void track_signal(const signal_base &signal)
99 {
100 _tracked_objects.push_back(signal.lock_pimpl());
101 }
102
103 tracked_container_type _tracked_objects;
104 };
105 }
106} // end namespace boost
107
108#endif // BOOST_SIGNALS2_SLOT_BASE_HPP