AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
ordered_set.h
1#ifndef ALGORITHMS_ORDERED_SET_H
2#define ALGORITHMS_ORDERED_SET_H
3
4#include "downward/utils/collections.h"
5#include "downward/utils/hash.h"
6#include "downward/utils/rng.h"
7
8#include <cassert>
9#include <vector>
10
11namespace ordered_set {
12/*
13 Combine vector and unordered_set to store a set of elements, ordered
14 by insertion time.
15*/
16template <typename T>
17class OrderedSet {
18 std::vector<T> ordered_items;
19 utils::HashSet<T> unordered_items;
20
21public:
22 bool empty() const
23 {
24 assert(unordered_items.size() == ordered_items.size());
25 return ordered_items.empty();
26 }
27
28 int size() const
29 {
30 assert(unordered_items.size() == ordered_items.size());
31 return ordered_items.size();
32 }
33
34 void clear()
35 {
36 ordered_items.clear();
37 unordered_items.clear();
38 assert(empty());
39 }
40
41 /*
42 If item is not yet included in the set, append it to the end. If
43 it is included, do nothing.
44 */
45 void insert(const T& item)
46 {
47 auto result = unordered_items.insert(item);
48 bool inserted = result.second;
49 if (inserted) {
50 ordered_items.push_back(item);
51 }
52 assert(unordered_items.size() == ordered_items.size());
53 }
54
55 bool contains(const T& item) const
56 {
57 return unordered_items.count(item) != 0;
58 }
59
60 void shuffle(utils::RandomNumberGenerator& rng)
61 {
62 rng.shuffle(ordered_items);
63 }
64
65 const T& operator[](int pos) const
66 {
67 assert(utils::in_bounds(pos, ordered_items));
68 return ordered_items[pos];
69 }
70
71 const std::vector<T>& get_as_vector() const { return ordered_items; }
72
73 std::vector<T> pop_as_vector()
74 {
75 std::vector<T> items = std::move(ordered_items);
76 unordered_items.clear();
77 assert(empty());
78 return items;
79 }
80
81 typename std::vector<T>::const_iterator begin() const
82 {
83 return ordered_items.begin();
84 }
85
86 typename std::vector<T>::const_iterator end() const
87 {
88 return ordered_items.end();
89 }
90};
91} // namespace ordered_set
92
93#endif