7373#ifdef ZMQ_CPP11
7474#include < chrono>
7575#include < tuple>
76- #include < functional>
77- #include < unordered_map>
7876#include < memory>
7977#endif
8078
@@ -492,6 +490,12 @@ class message_t
492490 return os.str ();
493491 }
494492
493+ void swap (message_t &other) ZMQ_NOTHROW
494+ {
495+ // this assumes zmq::msg_t from libzmq is trivially relocatable
496+ std::swap (msg, other.msg );
497+ }
498+
495499 private:
496500 // The underlying message
497501 zmq_msg_t msg;
@@ -502,6 +506,11 @@ class message_t
502506 void operator =(const message_t &) ZMQ_DELETED_FUNCTION;
503507};
504508
509+ inline void swap (message_t &a, message_t &b) ZMQ_NOTHROW
510+ {
511+ a.swap (b);
512+ }
513+
505514class context_t
506515{
507516 public:
@@ -570,13 +579,22 @@ class context_t
570579
571580 operator bool () const ZMQ_NOTHROW { return ptr != ZMQ_NULLPTR; }
572581
582+ void swap (context_t &other) ZMQ_NOTHROW
583+ {
584+ std::swap (ptr, other.ptr );
585+ }
586+
573587 private:
574588 void *ptr;
575589
576590 context_t (const context_t &) ZMQ_DELETED_FUNCTION;
577591 void operator =(const context_t &) ZMQ_DELETED_FUNCTION;
578592};
579593
594+ inline void swap (context_t &a, context_t &b) ZMQ_NOTHROW {
595+ a.swap (b);
596+ }
597+
580598#ifdef ZMQ_CPP11
581599enum class socket_type : int
582600{
@@ -783,6 +801,12 @@ class socket_t
783801 }
784802#endif
785803
804+ void swap (socket_t &other) ZMQ_NOTHROW
805+ {
806+ std::swap (ptr, other.ptr );
807+ std::swap (ctxptr, other.ctxptr );
808+ }
809+
786810 private:
787811 void *ptr;
788812 void *ctxptr;
@@ -791,6 +815,10 @@ class socket_t
791815 void operator =(const socket_t &) ZMQ_DELETED_FUNCTION;
792816};
793817
818+ inline void swap (socket_t &a, socket_t &b) ZMQ_NOTHROW {
819+ a.swap (b);
820+ }
821+
794822ZMQ_DEPRECATED (" from 4.3.1, use proxy taking socket_t objects" )
795823inline void proxy (void *frontend, void *backend, void *capture)
796824{
@@ -1147,6 +1175,8 @@ class monitor_t
11471175template <typename T = void > class poller_t
11481176{
11491177 public:
1178+ poller_t () = default ;
1179+
11501180 void add (zmq::socket_t &socket, short events, T *user_data)
11511181 {
11521182 if (0
@@ -1192,17 +1222,19 @@ template<typename T = void> class poller_t
11921222 }
11931223
11941224 private:
1195- std::unique_ptr<void , std::function< void (void *)> > poller_ptr{
1225+ std::unique_ptr<void , void (*)( void *)> poller_ptr{
11961226 []() {
11971227 auto poller_new = zmq_poller_new ();
11981228 if (poller_new)
11991229 return poller_new;
12001230 throw error_t ();
1201- }(),
1202- [](void *ptr) {
1203- int rc = zmq_poller_destroy (&ptr);
1204- ZMQ_ASSERT (rc == 0 );
1205- }};
1231+ }(), &destroy_poller};
1232+
1233+ static void destroy_poller (void *ptr)
1234+ {
1235+ int rc = zmq_poller_destroy (&ptr);
1236+ ZMQ_ASSERT (rc == 0 );
1237+ }
12061238};
12071239#endif // defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_CPP11) && defined(ZMQ_HAVE_POLLER)
12081240
0 commit comments