Serenity Operating System
1/*
2 * Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/Vector.h>
10
11namespace AK {
12
13template<typename T, size_t stack_size>
14class Stack {
15public:
16 Stack() = default;
17 ~Stack() = default;
18
19 bool push(T const& item)
20 {
21 if (m_stack.size() >= stack_size)
22 return false;
23
24 m_stack.unchecked_append(item);
25 return true;
26 }
27
28 bool push(T&& item)
29 {
30 if (m_stack.size() >= stack_size)
31 return false;
32
33 m_stack.unchecked_append(move(item));
34 return true;
35 }
36
37 bool is_empty() const
38 {
39 return m_stack.is_empty();
40 }
41
42 size_t size() const
43 {
44 return m_stack.size();
45 }
46
47 bool pop()
48 {
49 if (is_empty())
50 return false;
51
52 m_stack.resize_and_keep_capacity(m_stack.size() - 1);
53 return true;
54 }
55
56 T& top()
57 {
58 return m_stack.last();
59 }
60
61 T const& top() const
62 {
63 return m_stack.last();
64 }
65
66 bool contains_slow(T const& value) const
67 {
68 return m_stack.contains_slow(value);
69 }
70
71private:
72 Vector<T, stack_size> m_stack;
73};
74
75}
76
77#if USING_AK_GLOBALLY
78using AK::Stack;
79#endif