summaryrefslogtreecommitdiff
path: root/include/zmq.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/zmq.hpp')
-rw-r--r--include/zmq.hpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/include/zmq.hpp b/include/zmq.hpp
index e147b0e..bfba0f6 100644
--- a/include/zmq.hpp
+++ b/include/zmq.hpp
@@ -27,6 +27,19 @@
#include <cstring>
#include <exception>
+// Detect whether the compiler supports C++11 rvalue references.
+#if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) && defined(__GXX_EXPERIMENTAL_CXX0X__))
+# define ZMQ_HAS_RVALUE_REFS
+#endif
+#if (defined(__clang__))
+# if __has_feature(cxx_rvalue_references)
+# define ZMQ_HAS_RVALUE_REFS
+# endif
+#endif
+#if (defined(_MSC_VER) && (_MSC_VER >= 1600))
+# define ZMQ_HAS_RVALUE_REFS
+#endif
+
namespace zmq
{
@@ -184,8 +197,22 @@ namespace zmq
throw error_t ();
}
+#ifdef ZMQ_HAS_RVALUE_REFS
+ inline context_t(context_t&& rhs) : ptr(rhs.ptr)
+ {
+ rhs.ptr = NULL;
+ }
+ inline context_t& operator=(context_t&& rhs)
+ {
+ std::swap(ptr, rhs.ptr);
+ return *this;
+ }
+#endif
+
inline ~context_t ()
{
+ if (ptr == NULL)
+ return;
int rc = zmq_term (ptr);
assert (rc == 0);
}
@@ -217,6 +244,18 @@ namespace zmq
throw error_t ();
}
+#ifdef ZMQ_HAS_RVALUE_REFS
+ inline socket_t(socket_t&& rhs) : ptr(rhs.ptr)
+ {
+ rhs.ptr = NULL;
+ }
+ inline socket_t& operator=(socket_t&& rhs)
+ {
+ std::swap(ptr, rhs.ptr);
+ return *this;
+ }
+#endif
+
inline ~socket_t ()
{
close();