7373#ifdef ZMQ_CPP11
7474#include < chrono>
7575#include < tuple>
76- #include < functional>
77- #include < unordered_map>
7876#include < memory>
7977#endif
8078
@@ -476,6 +474,12 @@ class message_t
476474 return os.str ();
477475 }
478476
477+ void swap (message_t &other) ZMQ_NOTHROW
478+ {
479+ // this assumes zmq::msg_t from libzmq is trivially relocatable
480+ std::swap (msg, other.msg );
481+ }
482+
479483 private:
480484 // The underlying message
481485 zmq_msg_t msg;
@@ -486,6 +490,11 @@ class message_t
486490 void operator =(const message_t &) ZMQ_DELETED_FUNCTION;
487491};
488492
493+ inline void swap (message_t &a, message_t &b) ZMQ_NOTHROW
494+ {
495+ a.swap (b);
496+ }
497+
489498class context_t
490499{
491500 public:
@@ -554,13 +563,22 @@ class context_t
554563
555564 operator bool () const ZMQ_NOTHROW { return ptr != ZMQ_NULLPTR; }
556565
566+ void swap (context_t &other) ZMQ_NOTHROW
567+ {
568+ std::swap (ptr, other.ptr );
569+ }
570+
557571 private:
558572 void *ptr;
559573
560574 context_t (const context_t &) ZMQ_DELETED_FUNCTION;
561575 void operator =(const context_t &) ZMQ_DELETED_FUNCTION;
562576};
563577
578+ inline void swap (context_t &a, context_t &b) ZMQ_NOTHROW {
579+ a.swap (b);
580+ }
581+
564582#ifdef ZMQ_CPP11
565583enum class socket_type : int
566584{
@@ -767,6 +785,12 @@ class socket_t
767785 }
768786#endif
769787
788+ void swap (socket_t &other) ZMQ_NOTHROW
789+ {
790+ std::swap (ptr, other.ptr );
791+ std::swap (ctxptr, other.ctxptr );
792+ }
793+
770794 private:
771795 void *ptr;
772796 void *ctxptr;
@@ -775,6 +799,10 @@ class socket_t
775799 void operator =(const socket_t &) ZMQ_DELETED_FUNCTION;
776800};
777801
802+ inline void swap (socket_t &a, socket_t &b) ZMQ_NOTHROW {
803+ a.swap (b);
804+ }
805+
778806ZMQ_DEPRECATED (" from 4.3.1, use proxy taking socket_t objects" )
779807inline void proxy (void *frontend, void *backend, void *capture)
780808{
@@ -1119,6 +1147,8 @@ class monitor_t
11191147template <typename T = void > class poller_t
11201148{
11211149 public:
1150+ poller_t () = default ;
1151+
11221152 void add (zmq::socket_t &socket, short events, T *user_data)
11231153 {
11241154 if (0
@@ -1164,17 +1194,19 @@ template<typename T = void> class poller_t
11641194 }
11651195
11661196 private:
1167- std::unique_ptr<void , std::function< void (void *)> > poller_ptr{
1197+ std::unique_ptr<void , void (*)( void *)> poller_ptr{
11681198 []() {
11691199 auto poller_new = zmq_poller_new ();
11701200 if (poller_new)
11711201 return poller_new;
11721202 throw error_t ();
1173- }(),
1174- [](void *ptr) {
1175- int rc = zmq_poller_destroy (&ptr);
1176- ZMQ_ASSERT (rc == 0 );
1177- }};
1203+ }(), &destroy_poller};
1204+
1205+ static void destroy_poller (void *ptr)
1206+ {
1207+ int rc = zmq_poller_destroy (&ptr);
1208+ ZMQ_ASSERT (rc == 0 );
1209+ }
11781210};
11791211#endif // defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_CPP11) && defined(ZMQ_HAVE_POLLER)
11801212
0 commit comments