Platform.Data.Doublets C++
Loading...
Searching...
No Matches
Stack.h
Go to the documentation of this file.
2{
3 template <typename...>
4 class Stack;
5 template <std::integral TLinkAddress>
6 class Stack<TLinkAddress> : public LinksOperatorBase<TLinkAddress>, IStack<TLinkAddress>
7 {
8 private:
9 TLinkAddress _stack = 0;
10
11 public:
12 bool IsEmpty()
13 {
14 return this->Peek() == _stack;
15 }
16
17 public:
18 Stack(ILinks<TLinkAddress>& storage, TLinkAddress stack) : base(storage)
19 {
20 return _stack = stack;
21 }
22
23 private:
24 TLinkAddress GetStackMarker()
25 {
26 return _links.GetSource(_stack);
27 }
28
29 private:
30 TLinkAddress GetTop()
31 {
32 return _links.GetTarget(_stack);
33 }
34
35 public:
37 {
38 return _links.GetTarget(this->GetTop());
39 }
40
41 public:
43 {
44 auto element = this->Peek();
45 if (element != _stack)
46 {
47 auto top = this->GetTop();
48 auto previousTop = _links.GetSource(top);
49 _links.Update(_stack, this->GetStackMarker(), previousTop);
50 _links.Delete(top);
51 }
52 return element;
53 }
54
55 public:
56 void Push(TLinkAddress element)
57 {
58 _links.Update(_stack, this->GetStackMarker(), _links.GetOrCreate(this->GetTop(), element));
59 }
60 };
61} // namespace Platform::Data::Doublets::Stacks
void Push(TLinkAddress element)
Definition Stack.h:56
Stack(ILinks< TLinkAddress > &storage, TLinkAddress stack)
Definition Stack.h:18