From 3f060de38174a5821450c8919e390a70d1a1d5d6 Mon Sep 17 00:00:00 2001 From: Matias Fontanini Date: Mon, 28 Jan 2013 17:56:59 -0300 Subject: [PATCH] PacketWriter is now movable. --- include/packet_writer.h | 23 +++++++++++++++++++++++ include/tins.h | 1 + src/packet_writer.cpp | 20 ++++++++++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/include/packet_writer.h b/include/packet_writer.h index 58ab1d1..28258f5 100644 --- a/include/packet_writer.h +++ b/include/packet_writer.h @@ -34,6 +34,7 @@ #include #include #include "utils.h" +#include "cxxstd.h" namespace Tins { class PDU; @@ -65,6 +66,28 @@ public: */ PacketWriter(const std::string &file_name, LinkType lt); + #if TINS_IS_CXX11 + /** + * \brief Move constructor. + * + * Note that calling PacketWriter::write on an previously moved + * object will lead to undefined behaviour. + * + * \param rhs The PacketWriter to be moved. + */ + PacketWriter(PacketWriter &&rhs) noexcept; + + /** + * \brief Move assignment operator. + * + * Note that calling PacketWriter::write on an previously moved + * object will lead to undefined behaviour. + * + * \param rhs The PacketWriter to be moved. + */ + PacketWriter& operator=(PacketWriter &&rhs) noexcept; + #endif + /** * Destructor. */ diff --git a/include/tins.h b/include/tins.h index d34a202..50b266c 100644 --- a/include/tins.h +++ b/include/tins.h @@ -62,5 +62,6 @@ #include "packet.h" #include "timestamp.h" #include "sll.h" +#include "dhcpv6.h" #endif // TINS_TINS_H diff --git a/src/packet_writer.cpp b/src/packet_writer.cpp index 60ba3b7..daa5595 100644 --- a/src/packet_writer.cpp +++ b/src/packet_writer.cpp @@ -47,9 +47,25 @@ PacketWriter::PacketWriter(const std::string &file_name, LinkType lt) { } } +#if TINS_IS_CXX11 +PacketWriter::PacketWriter(PacketWriter &&rhs) noexcept { + *this = std::move(rhs); +} + +PacketWriter& PacketWriter::operator=(PacketWriter &&rhs) noexcept { + handle = 0; + dumper = 0; + std::swap(handle, rhs.handle); + std::swap(dumper, rhs.dumper); + return *this; +} +#endif + PacketWriter::~PacketWriter() { - pcap_dump_close(dumper); - pcap_close(handle); + if(dumper && handle) { + pcap_dump_close(dumper); + pcap_close(handle); + } } void PacketWriter::write(PDU &pdu) {