/** * @file fl_stack.h * @brief Fixed-length stack * * @date Jul 9, 2014 * @author Andrey Belomutskiy, (c) 2012-2020 */ #pragma once template class FLStack { public: FLStack(); void push(T value); void reset(); T pop(); T get(int index); bool remove(T value); int size(); bool isEmpty(); private: int currentSize; T values[MAXSIZE]; }; template FLStack::FLStack() { reset(); memset(values, 0, sizeof(values)); } template bool FLStack::isEmpty() { return currentSize == 0; } template void FLStack::reset() { currentSize = 0; } template bool FLStack::remove(T value) { for (int i = 0; i < currentSize; i++) { if (values[i] == value) { values[0] = values[currentSize - 1]; currentSize--; return true; } } return false; } template void FLStack::push(T value) { if (currentSize >= MAXSIZE) { firmwareError(ERROR_FL_STACK_OVERFLOW, "FLstack overflow"); return; //warning() } values[currentSize++] = value; } template T FLStack::pop() { if (currentSize == 0) { firmwareError(CUSTOM_FLSTACK, "FLStack is empty"); } return values[--currentSize]; } /** * @return element at the specified index */ template T FLStack::get(int index) { efiAssert(CUSTOM_ERR_ASSERT, index >= 0 && index < MAXSIZE, "FLget", values[0]); return values[index]; } template int FLStack::size() { return currentSize; } template class ArrayList { public: ArrayList(); int size; Type elements[Dimention]; void reset(void); Type *add(void); void removeAt(int index); }; template ArrayList::ArrayList(void) { memset(&elements, 0, sizeof(elements)); reset(); } template void ArrayList::removeAt(int index) { efiAssertVoid(CUSTOM_ERR_ARRAY_REMOVE, index >= 0 && index < size, "invalid index"); memcpy(&elements[index], &elements[size - 1], sizeof(Type)); memset(&elements[size - 1], 0, sizeof(Type)); size--; } template void ArrayList::reset(void) { size = 0; } template Type * ArrayList::add(void) { efiAssert(CUSTOM_ERR_ASSERT, size < Dimention, "add() too many elements", (Type *)NULL); return &elements[size++]; }