Serenity Operating System
at master 79 lines 1.3 kB view raw
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