8#ifndef INCLUDED_BDLMT_SIGNALER
9#define INCLUDED_BDLMT_SIGNALER
240#include <bdlscm_version.h>
268#include <bsl_cstddef.h>
269#include <bsl_functional.h>
270#include <bsl_memory.h>
271#include <bsl_utility.h>
283class SignalerConnection;
315template <
class t_PROT>
326 TypeOrDefault ArgType;
355template <
class t_SIGNALER,
class t_PROT>
359template <
class t_SIGNALER>
367 void operator()()
const;
370template <
class t_SIGNALER,
class t_ARG1>
378 void operator()(t_ARG1)
const;
381template <
class t_SIGNALER,
class t_ARG1,
class t_ARG2>
389 void operator()(t_ARG1, t_ARG2)
const;
392template <
class t_SIGNALER,
class t_ARG1,
class t_ARG2,
class t_ARG3>
400 void operator()(t_ARG1, t_ARG2, t_ARG3)
const;
403template <
class t_SIGNALER,
415 void operator()(t_ARG1, t_ARG2, t_ARG3, t_ARG4)
const;
418template <
class t_SIGNALER,
425 void(t_ARG1, t_ARG2, t_ARG3, t_ARG4, t_ARG5)> {
432 void operator()(t_ARG1, t_ARG2, t_ARG3, t_ARG4, t_ARG5)
const;
435template <
class t_SIGNALER,
444 void(t_ARG1, t_ARG2, t_ARG3, t_ARG4, t_ARG5, t_ARG6)> {
451 void operator()(t_ARG1, t_ARG2, t_ARG3, t_ARG4, t_ARG5, t_ARG6)
const;
454template <
class t_SIGNALER,
464 void(t_ARG1, t_ARG2, t_ARG3, t_ARG4, t_ARG5, t_ARG6, t_ARG7)> {
471 void operator()(t_ARG1,
480template <
class t_SIGNALER,
491 void(t_ARG1, t_ARG2, t_ARG3, t_ARG4, t_ARG5, t_ARG6, t_ARG7, t_ARG8)> {
498 void operator()(t_ARG1,
508template <
class t_SIGNALER,
534 void operator()(t_ARG1,
601template <class t_PROT>
659 ForwardingNotArg)
const;
669 ForwardingNotArg)
const;
679 ForwardingNotArg)
const;
689 ForwardingNotArg)
const;
699 ForwardingNotArg)
const;
709 ForwardingNotArg)
const;
719 ForwardingNotArg)
const;
729 ForwardingNotArg)
const;
739 ForwardingNotArg)
const;
758 template <
class t_FUNC>
802 void invoke(typename
ArgumentType::ForwardingType1 arg1,
828template <class t_PROT>
890 template <
class t_FUNC>
985 bsl::size_t slotCount()
const;
999template <
class t_PROT>
1060 template <
class t_FUNC>
1155 bsl::
size_t slotCount() const;
1275 bool isConnected() const;
1296 bool d_waitOnDisconnect;
1330 bool waitOnDisconnect =
false);
1443template <class t_SIGNALER>
1447 static_cast<const t_SIGNALER *
>(
this)->d_signalerNodePtr->invoke(
1459template <
class t_SIGNALER,
class t_ARG1>
1464 static_cast<const t_SIGNALER *
>(
this)->d_signalerNodePtr->invoke(
1476template <
class t_SIGNALER,
class t_ARG1,
class t_ARG2>
1482 static_cast<const t_SIGNALER *
>(
this)->d_signalerNodePtr->invoke(
1494template <
class t_SIGNALER,
class t_ARG1,
class t_ARG2,
class t_ARG3>
1501 static_cast<const t_SIGNALER *
>(
this)->d_signalerNodePtr->invoke(
1513template <
class t_SIGNALER,
class t_ARG1,
1521 t_ARG4)>::operator()(
1527 static_cast<const t_SIGNALER *
>(
this)->d_signalerNodePtr->invoke(
1539template <
class t_SIGNALER,
class t_ARG1,
1550 operator()(t_ARG1 arg1,
1556 static_cast<const t_SIGNALER *
>(
this)->d_signalerNodePtr->invoke(
1568template <
class t_SIGNALER,
class t_ARG1,
1581 operator()(t_ARG1 arg1,
1588 static_cast<const t_SIGNALER *
>(
this)->d_signalerNodePtr->invoke(
1600template <
class t_SIGNALER,
class t_ARG1,
1615 t_ARG7)>::operator()(t_ARG1 arg1,
1623 static_cast<const t_SIGNALER *
>(
this)->d_signalerNodePtr->invoke(
1635template <
class t_SIGNALER,
class t_ARG1,
1652 t_ARG8)>::operator()(t_ARG1 arg1,
1661 static_cast<const t_SIGNALER *
>(
this)->d_signalerNodePtr->invoke(
1673template <
class t_SIGNALER,
class t_ARG1,
1693 t_ARG9)>::operator()(t_ARG1 arg1,
1703 static_cast<const t_SIGNALER *
>(
this)->d_signalerNodePtr->invoke(
1720template <
class t_PROT>
1731 ForwardingNotArg)
const
1736template <
class t_PROT>
1738void Signaler_SlotNode<t_PROT>::doInvoke(
1740 typename ArgumentType::ForwardingType1 arg1,
1748 ForwardingNotArg)
const
1755template <
class t_PROT>
1757void Signaler_SlotNode<t_PROT>::doInvoke(
1759 typename ArgumentType::ForwardingType1 arg1,
1760 typename ArgumentType::ForwardingType2 arg2,
1767 ForwardingNotArg)
const
1774template <
class t_PROT>
1776void Signaler_SlotNode<t_PROT>::doInvoke(
1778 typename ArgumentType::ForwardingType1 arg1,
1779 typename ArgumentType::ForwardingType2 arg2,
1780 typename ArgumentType::ForwardingType3 arg3,
1786 ForwardingNotArg)
const
1790 d_func(arg1, arg2, arg3);
1793template <
class t_PROT>
1795void Signaler_SlotNode<t_PROT>::doInvoke(
1797 typename ArgumentType::ForwardingType1 arg1,
1798 typename ArgumentType::ForwardingType2 arg2,
1799 typename ArgumentType::ForwardingType3 arg3,
1800 typename ArgumentType::ForwardingType4 arg4,
1805 ForwardingNotArg)
const
1809 d_func(arg1, arg2, arg3, arg4);
1812template <
class t_PROT>
1814void Signaler_SlotNode<t_PROT>::doInvoke(
1816 typename ArgumentType::ForwardingType1 arg1,
1817 typename ArgumentType::ForwardingType2 arg2,
1818 typename ArgumentType::ForwardingType3 arg3,
1819 typename ArgumentType::ForwardingType4 arg4,
1820 typename ArgumentType::ForwardingType5 arg5,
1824 ForwardingNotArg)
const
1828 d_func(arg1, arg2, arg3, arg4, arg5);
1831template <
class t_PROT>
1833void Signaler_SlotNode<t_PROT>::doInvoke(
1835 typename ArgumentType::ForwardingType1 arg1,
1836 typename ArgumentType::ForwardingType2 arg2,
1837 typename ArgumentType::ForwardingType3 arg3,
1838 typename ArgumentType::ForwardingType4 arg4,
1839 typename ArgumentType::ForwardingType5 arg5,
1840 typename ArgumentType::ForwardingType6 arg6,
1843 ForwardingNotArg)
const
1847 d_func(arg1, arg2, arg3, arg4, arg5, arg6);
1850template <
class t_PROT>
1852void Signaler_SlotNode<t_PROT>::doInvoke(
1854 typename ArgumentType::ForwardingType1 arg1,
1855 typename ArgumentType::ForwardingType2 arg2,
1856 typename ArgumentType::ForwardingType3 arg3,
1857 typename ArgumentType::ForwardingType4 arg4,
1858 typename ArgumentType::ForwardingType5 arg5,
1859 typename ArgumentType::ForwardingType6 arg6,
1860 typename ArgumentType::ForwardingType7 arg7,
1862 ForwardingNotArg)
const
1866 d_func(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
1869template <
class t_PROT>
1871void Signaler_SlotNode<t_PROT>::doInvoke(
1873 typename ArgumentType::ForwardingType1 arg1,
1874 typename ArgumentType::ForwardingType2 arg2,
1875 typename ArgumentType::ForwardingType3 arg3,
1876 typename ArgumentType::ForwardingType4 arg4,
1877 typename ArgumentType::ForwardingType5 arg5,
1878 typename ArgumentType::ForwardingType6 arg6,
1879 typename ArgumentType::ForwardingType7 arg7,
1880 typename ArgumentType::ForwardingType8 arg8,
1881 ForwardingNotArg)
const
1885 d_func(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
1888template <
class t_PROT>
1890void Signaler_SlotNode<t_PROT>::doInvoke(
1892 typename ArgumentType::ForwardingType1 arg1,
1893 typename ArgumentType::ForwardingType2 arg2,
1894 typename ArgumentType::ForwardingType3 arg3,
1895 typename ArgumentType::ForwardingType4 arg4,
1896 typename ArgumentType::ForwardingType5 arg5,
1897 typename ArgumentType::ForwardingType6 arg6,
1898 typename ArgumentType::ForwardingType7 arg7,
1899 typename ArgumentType::ForwardingType8 arg8,
1900 typename ArgumentType::ForwardingType9 arg9)
const
1904 d_func(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
1908template <
class t_PROT>
1909template <
class t_FUNC>
1915: d_slotMapKey(slotMapKey)
1916, d_isConnected(true)
1917, d_signalerNodePtr(signalerNodePtr)
1918, d_func(
bsl::allocator_arg,
1927template <
class t_PROT>
1938 if (signalerNodePtr) {
1939 signalerNodePtr->notifyDisconnected(d_slotMapKey);
1943template <
class t_PROT>
1947 const bool wasConnected = d_isConnected.
testAndSwap(
true,
false);
1952 if (signalerNodePtr) {
1954 signalerNodePtr->notifyDisconnected(d_slotMapKey);
1959 signalerNodePtr->synchronizeWait();
1963template <
class t_PROT>
1967 d_isConnected =
false;
1971template <
class t_PROT>
1989 if (!d_isConnected) {
1998 arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
2001template <
class t_PROT>
2005 return d_isConnected;
2013template <
class t_PROT>
2016, d_slotMap(allocator)
2023template <
class t_PROT>
2047 SlotPairHandle slotHandle;
2048 if (d_slotMap.front(&slotHandle) != 0) {
2055 const SlotNode *slotNodePtr = &*slotHandle.data();
2056 const SlotMapKey slotMapKey = slotHandle.key();
2061 arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
2063 if (0 != d_slotMap.skipForward(&slotHandle)) {
2069 if (0 != d_slotMap.findUpperBound(&slotHandle, slotMapKey)) {
2075 }
while (slotHandle);
2078template <
class t_PROT>
2079template <
class t_FUNC>
2086 const SlotMapKey slotMapKey(group, ++d_keyId);
2091 d_slotMap.allocator(),
2092 this->weak_from_this(),
2095 d_slotMap.allocator());
2099 d_slotMap.addR(slotMapKey, slotNodePtr);
2107template <
class t_PROT>
2110 SlotPairHandle slotHandle;
2114 while (d_slotMap.front(&slotHandle) == 0) {
2117 slotHandle.data()->notifyDisconnected();
2121 d_slotMap.remove(slotHandle);
2125template <
class t_PROT>
2128 disconnectAllSlots();
2132template <
class t_PROT>
2139 SlotPairHandle slotHandle;
2141 while (0 == d_slotMap.findLowerBound(&slotHandle, boundary) &&
2142 slotHandle.key().first == group) {
2146 slotHandle.data()->notifyDisconnected();
2148 SlotPairHandle condemned(slotHandle);
2150 if (0 != d_slotMap.skipForward(&slotHandle)) {
2151 slotHandle.release();
2156 d_slotMap.remove(condemned);
2157 }
while (slotHandle && slotHandle.key().first == group);
2161template <
class t_PROT>
2165 disconnectGroup(group);
2169template <
class t_PROT>
2175 if (d_slotMap.find(&slotHandle, slotMapKey) != 0) {
2184 d_slotMap.remove(slotHandle);
2187template <
class t_PROT>
2195template <
class t_PROT>
2199 return d_slotMap.length();
2207template <
class t_PROT>
2211 bslma::Default::allocator(basicAllocator)))
2216template <
class t_PROT>
2220 d_signalerNodePtr->disconnectAllSlots();
2224template <
class t_PROT>
2225template <
class t_FUNC>
2236template <
class t_PROT>
2240 d_signalerNodePtr->disconnectAllSlots();
2243template <
class t_PROT>
2247 d_signalerNodePtr->disconnectAllSlotsAndWait();
2250template <
class t_PROT>
2254 d_signalerNodePtr->disconnectGroup(group);
2257template <
class t_PROT>
2261 d_signalerNodePtr->disconnectGroupAndWait(group);
2265template <
class t_PROT>
2269 return d_signalerNodePtr->slotCount();
2280 d_slotNodeBasePtr.
swap(other.d_slotNodeBasePtr);
2287 return lhs.d_slotNodeBasePtr.rep() == rhs.d_slotNodeBasePtr.rep();
2293 return lhs.d_slotNodeBasePtr.owner_before(rhs.d_slotNodeBasePtr);
2313 return d_connection;
2319 return d_waitOnDisconnect;
#define BSLMF_NESTED_TRAIT_DECLARATION(t_TYPE, t_TRAIT)
Definition bslmf_nestedtraitdeclaration.h:231
Definition bdlcc_skiplist.h:804
SkipListPairHandle< SlotMapKey, bsl::shared_ptr< SlotNode > > PairHandle
Definition bdlcc_skiplist.h:828
Definition bdlmt_signaler.h:1291
bool waitOnDisconnect() const BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2317
const SignalerConnection & connection() const BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2310
SignalerConnectionGuard(bslmf::MovableRef< SignalerConnection > connection, bool waitOnDisconnect=false) BSLS_KEYWORD_NOEXCEPT
SignalerConnectionGuard(const SignalerConnection &connection, bool waitOnDisconnect=false)
SignalerConnectionGuard()
BSLMF_NESTED_TRAIT_DECLARATION(SignalerConnectionGuard, bslmf::IsBitwiseMoveable)
Definition bdlmt_signaler.h:1171
SignalerConnection(bslmf::MovableRef< SignalerConnection > original) BSLS_KEYWORD_NOEXCEPT
SignalerConnection & operator=(bslmf::MovableRef< SignalerConnection > rhs) BSLS_KEYWORD_NOEXCEPT
SignalerConnection()
Create a SignalerConnection object having no associated slot.
void reset() BSLS_KEYWORD_NOEXCEPT
SignalerConnection & operator=(const SignalerConnection &rhs)
SignalerConnection(const SignalerConnection &original) BSLS_KEYWORD_NOEXCEPT
void swap(SignalerConnection &other) BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2278
Definition bdlmt_signaler.h:830
SignalerConnection connect(BSLS_COMPILERFEATURES_FORWARD_REF(t_FUNC) slot, int group)
Definition bdlmt_signaler.h:2080
void synchronizeWait() BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2189
void disconnectGroup(int group) BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2133
void disconnectAllSlots() BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2108
void notifyDisconnected(SlotMapKey slotMapKey) BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2170
void disconnectGroupAndWait(int group) BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2162
void invoke(typename ArgumentType::ForwardingType1 arg1, typename ArgumentType::ForwardingType2 arg2, typename ArgumentType::ForwardingType3 arg3, typename ArgumentType::ForwardingType4 arg4, typename ArgumentType::ForwardingType5 arg5, typename ArgumentType::ForwardingType6 arg6, typename ArgumentType::ForwardingType7 arg7, typename ArgumentType::ForwardingType8 arg8, typename ArgumentType::ForwardingType9 arg9) const
Definition bdlmt_signaler.h:2025
void disconnectAllSlotsAndWait() BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2126
bsl::size_t slotCount() const
Definition bdlmt_signaler.h:2197
Definition bdlmt_signaler.h:554
virtual ~Signaler_SlotNode_Base()
Virtual d'tor.
virtual bool isConnected() const =0
virtual void disconnectAndWait() BSLS_KEYWORD_NOEXCEPT=0
virtual void disconnect() BSLS_KEYWORD_NOEXCEPT=0
Definition bdlmt_signaler.h:602
void disconnectAndWait() BSLS_KEYWORD_NOEXCEPT BSLS_KEYWORD_OVERRIDE
Definition bdlmt_signaler.h:1945
bsl::pair< int, unsigned > SlotMapKey
Definition bdlmt_signaler.h:616
void notifyDisconnected() BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:1965
void invoke(typename ArgumentType::ForwardingType1 arg1, typename ArgumentType::ForwardingType2 arg2, typename ArgumentType::ForwardingType3 arg3, typename ArgumentType::ForwardingType4 arg4, typename ArgumentType::ForwardingType5 arg5, typename ArgumentType::ForwardingType6 arg6, typename ArgumentType::ForwardingType7 arg7, typename ArgumentType::ForwardingType8 arg8, typename ArgumentType::ForwardingType9 arg9) const
Definition bdlmt_signaler.h:1973
void disconnect() BSLS_KEYWORD_NOEXCEPT BSLS_KEYWORD_OVERRIDE
Definition bdlmt_signaler.h:1929
bool isConnected() const BSLS_KEYWORD_OVERRIDE
Definition bdlmt_signaler.h:2003
~Signaler_SlotNode()=default
Destroy this object.
Definition bdlmt_signaler.h:1000
SignalerConnection connect(BSLS_COMPILERFEATURES_FORWARD_REF(t_FUNC) slot, int group=0)
Definition bdlmt_signaler.h:2227
void disconnectGroupAndWait(int group) BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2259
void disconnectGroup(int group) BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2252
void disconnectAllSlots() BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2238
void disconnectAllSlotsAndWait() BSLS_KEYWORD_NOEXCEPT
Definition bdlmt_signaler.h:2245
void ResultType
Definition bdlmt_signaler.h:1004
~Signaler()
Definition bdlmt_signaler.h:2218
bsl::size_t slotCount() const
Definition bdlmt_signaler.h:2267
Forward declaration.
Definition bslstl_function.h:946
Definition bslstl_pair.h:1280
Definition bslstl_sharedptr.h:1838
Definition bslstl_sharedptr.h:3773
void swap(weak_ptr &other) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:6004
bool expired() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:6025
Definition bslma_allocator.h:545
Provide a namespace for the forwardToTarget function.
Definition bslmf_forwardingtype.h:456
Imp::Type Type
Definition bslmf_forwardingtype.h:441
Definition bslmf_movableref.h:752
Definition bslmt_readlockguard.h:287
Definition bslmt_readerwritermutex.h:244
Definition bslmt_writelockguard.h:221
Definition bsls_atomic.h:1490
bool testAndSwap(bool compareValue, bool swapValue)
Definition bsls_atomic.h:2500
Definition bsls_atomic.h:1050
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_COMPILERFEATURES_FORWARD_REF(T)
Definition bsls_compilerfeatures.h:2343
#define BSLS_COMPILERFEATURES_FORWARD(T, V)
Definition bsls_compilerfeatures.h:2349
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_DELETED
Definition bsls_keyword.h:651
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
#define BSLS_KEYWORD_OVERRIDE
Definition bsls_keyword.h:695
Definition bdlmt_eventscheduler.h:550
Definition bdlat_valuetypefunctions.h:939
Definition baljsn_encoder_testtypes.h:76
Definition bdlbb_blob.h:579
Definition bdlmt_signaler.h:316
Forward< 5 >::Type ForwardingType5
Definition bdlmt_signaler.h:340
Forward< 6 >::Type ForwardingType6
Definition bdlmt_signaler.h:341
Forward< 4 >::Type ForwardingType4
Definition bdlmt_signaler.h:339
Forward< 9 >::Type ForwardingType9
Definition bdlmt_signaler.h:344
Forward< 3 >::Type ForwardingType3
Definition bdlmt_signaler.h:338
bslmf::ForwardingType< Signaler_NotArg >::Type ForwardingNotArg
Definition bdlmt_signaler.h:334
Forward< 1 >::Type ForwardingType1
Definition bdlmt_signaler.h:336
Forward< 2 >::Type ForwardingType2
Definition bdlmt_signaler.h:337
Forward< 7 >::Type ForwardingType7
Definition bdlmt_signaler.h:342
Forward< 8 >::Type ForwardingType8
Definition bdlmt_signaler.h:343
Definition bdlmt_signaler.h:356
Definition bdlmt_signaler.h:292
Definition bslmf_integralconstant.h:261
Definition bslma_usesbslmaallocator.h:344
Definition bslmf_functionpointertraits.h:147
Definition bslmf_isbitwisemoveable.h:718
Definition bslmf_typelist.h:1631