Improvements to UniqueDeferredQueue and UniqueNonrepeatingDeferredQueue
diff --git a/src/support/unique_deferring_queue.h b/src/support/unique_deferring_queue.h
index cbf9d76..c8780ce 100644
--- a/src/support/unique_deferring_queue.h
+++ b/src/support/unique_deferring_queue.h
@@ -30,27 +30,20 @@
 
 namespace wasm {
 
-template<typename T> struct UniqueDeferredQueue {
-  // implemented as an internal queue, plus a map
-  // that says how many times an element appears. we
-  // can then skip non-final appearances. this lets us
-  // avoid needing to remove elements from the middle
-  // when there are duplicates.
-  std::queue<T> data;
-  std::unordered_map<T, size_t> count;
-
-  size_t size() { return data.size(); }
-  bool empty() { return size() == 0; }
+template<typename T> class UniqueDeferredQueue {
+public:
+  size_t size() const { return data.size(); }
+  bool empty() const { return size() == 0; }
 
   void push(T item) {
-    data.push(item);
     count[item]++;
+    data.push(std::move(item));
   }
 
   T pop() {
     while (1) {
       assert(!empty());
-      T item = data.front();
+      T item = std::move(data.front());
       count[item]--;
       data.pop();
       if (count[item] == 0) {
@@ -65,17 +58,28 @@
     std::swap(data, empty);
     count.clear();
   }
+
+private:
+  // implemented as an internal queue, plus a map
+  // that says how many times an element appears. we
+  // can then skip non-final appearances. this lets us
+  // avoid needing to remove elements from the middle
+  // when there are duplicates.
+  std::queue<T> data;
+  std::unordered_map<T, size_t> count;
 };
 
 // As UniqueDeferredQueue, but once an item has been processed through the queue
 // (that is, popped) it will be ignored from then on in later pushes.
 template<typename T>
-struct UniqueNonrepeatingDeferredQueue : UniqueDeferredQueue<T> {
-  std::unordered_set<T> processed;
+class UniqueNonrepeatingDeferredQueue : private UniqueDeferredQueue<T> {
+public:
+  using UniqueDeferredQueue<T>::size;
+  using UniqueDeferredQueue<T>::empty;
 
   void push(T item) {
     if (!processed.contains(item)) {
-      UniqueDeferredQueue<T>::push(item);
+      UniqueDeferredQueue<T>::push(std::move(item));
     }
   }
 
@@ -84,6 +88,9 @@
     processed.insert(ret);
     return ret;
   }
+
+private:
+  std::unordered_set<T> processed;
 };
 
 } // namespace wasm