diff --git a/include/crucible/fs.h b/include/crucible/fs.h index c0bfef5..d208cca 100644 --- a/include/crucible/fs.h +++ b/include/crucible/fs.h @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -150,6 +151,7 @@ namespace crucible { BtrfsIoctlSearchHeader(); vector m_data; size_t set_data(const vector &v, size_t offset); + bool operator<(const BtrfsIoctlSearchHeader &that) const; }; ostream & operator<<(ostream &os, const btrfs_ioctl_search_header &hdr); @@ -164,7 +166,8 @@ namespace crucible { void next_min(const BtrfsIoctlSearchHeader& ref); size_t m_buf_size; - vector m_result; + set m_result; + }; ostream & operator<<(ostream &os, const btrfs_ioctl_search_key &key); diff --git a/lib/fs.cc b/lib/fs.cc index 16e5649..9f6d4b7 100644 --- a/lib/fs.cc +++ b/lib/fs.cc @@ -707,6 +707,12 @@ namespace crucible { return offset + len; } + bool + BtrfsIoctlSearchHeader::operator<(const BtrfsIoctlSearchHeader &that) const + { + return tie(objectid, type, offset, len, transid) < tie(that.objectid, that.type, that.offset, that.len, that.transid); + } + bool BtrfsIoctlSearchKey::do_ioctl_nothrow(int fd) { @@ -727,13 +733,12 @@ namespace crucible { static_cast(*this) = ioctl_ptr->key; m_result.clear(); - m_result.reserve(nr_items); size_t offset = pointer_distance(ioctl_ptr->buf, ioctl_ptr); for (decltype(nr_items) i = 0; i < nr_items; ++i) { BtrfsIoctlSearchHeader item; offset = item.set_data(ioctl_arg, offset); - m_result.push_back(item); + m_result.insert(item); } return true;