diff --git a/src/support/sorted_vector.h b/src/support/sorted_vector.h index 11e6173c64e..4d0e8046882 100644 --- a/src/support/sorted_vector.h +++ b/src/support/sorted_vector.h @@ -26,7 +26,7 @@ namespace wasm { -template struct SortedVector : public std::vector { +template struct SortedVector : private std::vector { using Base = std::vector; using Base::back; using Base::begin; @@ -34,14 +34,20 @@ template struct SortedVector : public std::vector { using Base::empty; using Base::end; using Base::erase; - using Base::push_back; - using Base::resize; using Base::size; using typename Base::const_iterator; using typename Base::iterator; +private: + // Resize is dangerous, as adding new items may break the order. We only use + // this internally (and carefully). + using Base::resize; + +public: SortedVector() = default; + bool operator==(const SortedVector&) const = default; + SortedVector merge(const SortedVector& other) const { SortedVector ret; ret.resize(size() + other.size()); @@ -75,7 +81,7 @@ template struct SortedVector : public std::vector { T& insert(T x) { if (empty() || back() < x) { - push_back(std::move(x)); + Base::push_back(std::move(x)); return back(); } auto it = std::lower_bound(begin(), end(), x); @@ -162,12 +168,6 @@ template struct SortedVector : public std::vector { resize(write); } - void verify() const { - for (Index i = 1; i < size(); i++) { - assert((*this)[i - 1] < (*this)[i]); - } - } - void dump(const char* str = nullptr) const { std::cout << "SortedVector " << (str ? str : "") << ": "; for (const auto& x : *this) {