Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/Analysis/include/Luau/OrderedSet.h
2727 views
1
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
2
3
#pragma once
4
5
#include <vector>
6
#include "Luau/DenseHash.h"
7
8
namespace Luau
9
{
10
11
template<typename T>
12
struct OrderedSet
13
{
14
static_assert(std::is_pointer_v<T>, "OrderedSet can only be used with pointers!");
15
using iterator = typename std::vector<T>::iterator;
16
using const_iterator = typename std::vector<T>::const_iterator;
17
18
bool empty() const
19
{
20
return elements.empty();
21
}
22
23
size_t size() const
24
{
25
return elements.size();
26
}
27
28
void insert(T t)
29
{
30
if (!elementSet.contains(t))
31
{
32
elementSet.insert(t);
33
elements.push_back(t);
34
}
35
}
36
37
iterator begin()
38
{
39
return elements.begin();
40
}
41
42
const_iterator begin() const
43
{
44
return elements.begin();
45
}
46
47
iterator end()
48
{
49
return elements.end();
50
}
51
52
const_iterator end() const
53
{
54
return elements.end();
55
}
56
57
/// Move the underlying vector out of the OrderedSet.
58
std::vector<T> takeVector()
59
{
60
elementSet.clear();
61
return std::move(elements);
62
}
63
64
private:
65
std::vector<T> elements;
66
DenseHashSet<T> elementSet{nullptr};
67
};
68
69
} // namespace Luau
70