summaryrefslogtreecommitdiff
path: root/dev-libs/boost/files/boost-1.84.0-signals2-patch1.patch
blob: 9c07bd8f06cf406377c9b34ecc3a94f2822b33f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
https://github.com/boostorg/signals2/issues/70

From 2ba258f7b465e7bde14663ca3a966019b4ec3694 Mon Sep 17 00:00:00 2001
From: Frank Mori Hess <fmh6jj@gmail.com>
Date: Sat, 30 Dec 2023 14:34:58 -0500
Subject: [PATCH] Fix disconnect by slot when the slot is another signal.

--- a/boost/signals2/detail/signal_template.hpp
+++ b/boost/signals2/detail/signal_template.hpp
@@ -103,9 +103,9 @@ namespace boost
               BOOST_SIGNALS2_FORWARDED_ARGS(BOOST_SIGNALS2_NUM_ARGS));
         }
         template<typename T>
-          bool operator==(const T &other) const
+          bool contains(const T &other) const
         {
-          return _fun == other;
+          return _fun.contains(other);
         }
       private:
         BOOST_SIGNALS2_BOUND_EXTENDED_SLOT_FUNCTION_N(BOOST_SIGNALS2_NUM_ARGS)()
@@ -115,6 +115,8 @@ namespace boost
         boost::shared_ptr<connection> _connection;
       };
 
+      template<BOOST_SIGNALS2_SIGNAL_TEMPLATE_DECL(BOOST_SIGNALS2_NUM_ARGS)>
+        class BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS);
       template<BOOST_SIGNALS2_SIGNAL_TEMPLATE_DECL(BOOST_SIGNALS2_NUM_ARGS)>
         class BOOST_SIGNALS2_SIGNAL_IMPL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS);
 
@@ -150,6 +152,8 @@ namespace boost
         typedef GroupCompare group_compare_type;
         typedef typename detail::slot_call_iterator_t<slot_invoker,
           typename connection_list_type::iterator, connection_body<group_key_type, slot_type, Mutex> > slot_call_iterator;
+        typedef detail::BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS)
+          <BOOST_SIGNALS2_SIGNAL_TEMPLATE_INSTANTIATION> weak_signal_type;
 
         BOOST_SIGNALS2_SIGNAL_IMPL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS)(const combiner_type &combiner_arg,
           const group_compare_type &group_compare):
@@ -531,13 +535,20 @@ namespace boost
             {
               (*it)->nolock_disconnect(lock);
             }else
-            {
-              // check for wrapped extended slot
+            { // check for wrapped extended slot
               bound_extended_slot_function_type *fp;
               fp = (*it)->slot().slot_function().template target<bound_extended_slot_function_type>();
-              if(fp && function_equal(*fp, slot))
+              if(fp && fp->contains(slot))
               {
                 (*it)->nolock_disconnect(lock);
+              }else
+              { // check for wrapped signal
+                weak_signal_type *fp;
+                fp = (*it)->slot().slot_function().template target<weak_signal_type>();
+                if(fp && fp->contains(slot))
+                {
+                  (*it)->nolock_disconnect(lock);
+                }
               }
             }
           }
@@ -588,8 +599,6 @@ namespace boost
         const boost::shared_ptr<mutex_type> _mutex;
       };
 
-      template<BOOST_SIGNALS2_SIGNAL_TEMPLATE_DECL(BOOST_SIGNALS2_NUM_ARGS)>
-        class BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS);
     }
 
     template<BOOST_SIGNALS2_SIGNAL_TEMPLATE_DEFAULTED_DECL(BOOST_SIGNALS2_NUM_ARGS)>
@@ -603,8 +612,7 @@ namespace boost
       typedef detail::BOOST_SIGNALS2_SIGNAL_IMPL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS)
         <BOOST_SIGNALS2_SIGNAL_TEMPLATE_INSTANTIATION> impl_class;
     public:
-      typedef detail::BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS)
-        <BOOST_SIGNALS2_SIGNAL_TEMPLATE_INSTANTIATION> weak_signal_type;
+      typedef typename impl_class::weak_signal_type weak_signal_type;
       friend class detail::BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS)
         <BOOST_SIGNALS2_SIGNAL_TEMPLATE_INSTANTIATION>;
 
@@ -746,12 +754,24 @@ namespace boost
         using std::swap;
         swap(_pimpl, other._pimpl);
       }
+      bool operator==(const BOOST_SIGNALS2_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS) & other) const
+      {
+        return _pimpl.get() == other._pimpl.get();
+      }
     protected:
       virtual shared_ptr<void> lock_pimpl() const
       {
         return _pimpl;
       }
     private:
+      // explicit private copy constructor to avoid compiler trying to do implicit conversions to signal
+      explicit BOOST_SIGNALS2_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS)(
+        const BOOST_SIGNALS2_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS) & other) BOOST_NOEXCEPT
+      {
+          // noncopyable
+          BOOST_ASSERT(false);
+      }
+
       shared_ptr<impl_class>
         _pimpl;
     };
@@ -802,6 +822,16 @@ namespace boost
             shared_pimpl(_weak_pimpl.lock());
           return (*shared_pimpl)(BOOST_SIGNALS2_SIGNATURE_ARG_NAMES(BOOST_SIGNALS2_NUM_ARGS));
         }
+        bool contains(const BOOST_SIGNALS2_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS)
+          <BOOST_SIGNALS2_SIGNAL_TEMPLATE_INSTANTIATION> &signal) const
+        {
+          return _weak_pimpl.lock().get() == signal._pimpl.get(); 
+        }
+        template <typename T>
+        bool contains(const T&) const
+        {
+          return false;
+        }
       private:
         boost::weak_ptr<detail::BOOST_SIGNALS2_SIGNAL_IMPL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS)
           <BOOST_SIGNALS2_SIGNAL_TEMPLATE_INSTANTIATION> > _weak_pimpl;