rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
fl_stack.h
Go to the documentation of this file.
1/**
2 * @file fl_stack.h
3 * @brief Fixed-length stack
4 *
5 * @date Jul 9, 2014
6 * @author Andrey Belomutskiy, (c) 2012-2020
7 */
8
9#pragma once
10
11#include "error_handling.h"
12
13template<typename T, int MAXSIZE>
14class FLStack {
15public:
16 FLStack();
17 void push(T value);
18 void reset();
19 T pop();
20 T get(int index);
21 bool remove(T value);
22 int size();
23 bool isEmpty();
24private:
26 T values[MAXSIZE];
27};
28
29template<typename T, int MAXSIZE>
31 reset();
32 memset(values, 0, sizeof(values));
33}
34
35template<typename T, int MAXSIZE>
37 return currentSize == 0;
38}
39
40template<typename T, int MAXSIZE>
42 currentSize = 0;
43}
44
45template<typename T, int MAXSIZE>
47 for (int i = 0; i < currentSize; i++) {
48 if (values[i] == value) {
49 values[0] = values[currentSize - 1];
50 currentSize--;
51 return true;
52 }
53 }
54 return false;
55}
56
57template<typename T, int MAXSIZE>
59 if (currentSize >= MAXSIZE) {
61 return;
62 //warning()
63 }
64 values[currentSize++] = value;
65}
66
67template<typename T, int MAXSIZE>
69 if (currentSize == 0) {
70 firmwareError(ObdCode::CUSTOM_FLSTACK, "FLStack is empty");
71 }
72 return values[--currentSize];
73}
74
75/**
76 * @return element at the specified index
77 */
78template<typename T, int MAXSIZE>
80 efiAssert(ObdCode::CUSTOM_ERR_ASSERT, index >= 0 && index < MAXSIZE, "FLget", values[0]);
81 return values[index];
82}
83
84template<typename T, int MAXSIZE>
86 return currentSize;
87}
88
89template<class Type, int Dimention>
90class ArrayList {
91public:
92 ArrayList();
93 int size;
94 Type elements[Dimention];
95 void reset(void);
96 Type *add(void);
97 void removeAt(int index);
98};
99
100template<class Type, int Dimention>
102 memset(&elements, 0, sizeof(elements));
103 reset();
104}
105
106template<class Type, int Dimention>
108 efiAssertVoid(ObdCode::CUSTOM_ERR_ARRAY_REMOVE, index >= 0 && index < size, "invalid index");
109 memcpy(&elements[index], &elements[size - 1], sizeof(Type));
110 memset(&elements[size - 1], 0, sizeof(Type));
111 size--;
112}
113
114template<class Type, int Dimention>
116 size = 0;
117}
118
119template<class Type, int Dimention>
121 efiAssert(ObdCode::CUSTOM_ERR_ASSERT, size < Dimention, "add() too many elements", (Type *)NULL);
122 return &elements[size++];
123}
void reset(void)
Definition fl_stack.h:115
int size
Definition fl_stack.h:93
Type * add(void)
Definition fl_stack.h:120
void removeAt(int index)
Definition fl_stack.h:107
Type elements[Dimention]
Definition fl_stack.h:94
T values[MAXSIZE]
Definition fl_stack.h:26
int currentSize
Definition fl_stack.h:25
int size()
Definition fl_stack.h:85
bool isEmpty()
Definition fl_stack.h:36
void push(T value)
Definition fl_stack.h:58
T pop()
Definition fl_stack.h:68
void reset()
Definition fl_stack.h:41
T get(int index)
Definition fl_stack.h:79
FLStack()
Definition fl_stack.h:30
bool remove(T value)
Definition fl_stack.h:46
void firmwareError(ObdCode code, const char *fmt,...)
@ CUSTOM_FLSTACK
@ ERROR_FL_STACK_OVERFLOW
@ CUSTOM_ERR_ASSERT
@ CUSTOM_ERR_ARRAY_REMOVE
composite packet size