acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
aaa__list_impl.h
1#pragma once
2
3
4template<class TYPE, class ARG_TYPE>
5typename list<TYPE, ARG_TYPE>::node * list<TYPE, ARG_TYPE>::add_head(ARG_TYPE newElement)
6{
7
8 ASSERT_OK(this);
9
10 typename list < TYPE, ARG_TYPE >::node * pnodeNew = aaa_primitive_new typename list < TYPE, ARG_TYPE >::node(newElement, nullptr, this->m_phead);
11
12 if(this->m_phead != nullptr)
13 this->m_phead->m_pprevious = pnodeNew;
14 else
15 this->m_ptail = pnodeNew;
16
17 this->m_phead = pnodeNew;
18
19 this->m_count++;
20
21 return pnodeNew;
22
23}
24
25template<class TYPE, class ARG_TYPE>
26typename list<TYPE, ARG_TYPE>::node * list<TYPE, ARG_TYPE>::add_tail(ARG_TYPE newElement)
27{
28 ASSERT_OK(this);
29
30 auto pnodeNew = aaa_primitive_new typename list < TYPE, ARG_TYPE >::node(newElement, this->m_ptail, nullptr);
31
32 pnodeNew->m_value = newElement;
33
34 if (this->m_ptail != nullptr)
35 this->m_ptail->m_pnext = pnodeNew;
36 else
37 this->m_phead = pnodeNew;
38
39 this->m_ptail = pnodeNew;
40
41 this->m_count++;
42
43 return pnodeNew;
44
45}
46
47
48template<class TYPE, class ARG_TYPE>
49typename list<TYPE, ARG_TYPE>::node * list<TYPE, ARG_TYPE>::insert_before(typename list<TYPE, ARG_TYPE>::node * position, ARG_TYPE newElement)
50{
51 ASSERT_OK(this);
52
53 if (position == nullptr)
54 return add_head(newElement); // insert before nothing -> head of the list
55
56 // Insert it before position
57 auto pOldNode = position;
58 auto pnodeNew = aaa_primitive_new typename list < TYPE, ARG_TYPE >::node(newElement, pOldNode->m_pprevious, pOldNode);
59 pnodeNew->m_value = newElement;
60
61 if (pOldNode->m_pprevious != nullptr)
62 {
63 ASSERT(is_memory_segment_ok(pOldNode->m_pprevious, sizeof(typename list < TYPE, ARG_TYPE >::node)));
64 pOldNode->m_pprevious->m_pnext = pnodeNew;
65 }
66 else
67 {
68 ASSERT(pOldNode == this->m_phead);
69 this->m_phead = pnodeNew;
70 }
71 pOldNode->m_pprevious = pnodeNew;
72 return pnodeNew;
73}
74
75template<class TYPE, class ARG_TYPE>
76typename list<TYPE, ARG_TYPE>::node * list<TYPE, ARG_TYPE>::insert_after(typename list<TYPE, ARG_TYPE>::node * position, ARG_TYPE newElement)
77{
78 ASSERT_OK(this);
79
80 if (position == nullptr)
81 return add_tail(newElement); // insert after nothing -> tail of the list
82
83 // Insert it before position
84 auto pOldNode = position;
85 ASSERT(is_memory_segment_ok(pOldNode, sizeof(typename list < TYPE, ARG_TYPE >::node)));
86 auto pnodeNew = aaa_primitive_new typename list < TYPE, ARG_TYPE >::node(newElement, pOldNode, pOldNode->m_pnext);
87 pnodeNew->m_value = newElement;
88
89 if (pOldNode->m_pnext != nullptr)
90 {
91 ASSERT(is_memory_segment_ok(pOldNode->m_pnext, sizeof(typename list < TYPE, ARG_TYPE >::node)));
92 pOldNode->m_pnext->m_pprevious = pnodeNew;
93 }
94 else
95 {
96 ASSERT(pOldNode == this->m_ptail);
97 this->m_ptail = pnodeNew;
98 }
99 pOldNode->m_pnext = pnodeNew;
100 return pnodeNew;
101}
102
103
104
105
106
107
108//string_list::node * string_list::find(const string & searchValue, node * startAfter) const
109//{
110//
111// if (::is_set(startAfter))
112// {
113//
114// return ::find_payload(*this, searchValue, iterator(startAfter, this));
115//
116// }
117// else
118// {
119//
120// return ::find_payload(*this, searchValue);
121//
122// }
123//
124//}
125
126
127template<class TYPE, class ARG_TYPE>
128void list<TYPE, ARG_TYPE>::dump(dump_context& dumpcontext) const
129{
130
131 matter::dump(dumpcontext);
132
133 //dumpcontext << "with " << this->m_count << " elements";
134
135 //if (dumpcontext.GetDepth() > 0)
136 //{
137
138 // auto pnode = this->get_head();
139
140 // while (::is_set(pnode))
141 // {
142
143 // dumpcontext << "\n";
144
145 // dump_elements(dumpcontext, &pnode->m_value, 1);
146
147 // pnode = pnode->m_pnext;
148
149 // }
150
151 //}
152
153 //dumpcontext << "\n";
154
155}
156
157
158//template < typename TYPE >
159//inline stream& operator <<(stream& stream, const string_list& list)
160//{
161//
162// stream << list.get_count();
163//
164// for (auto& pitem : list)
165// {
166// stream << *pitem;
167// }
168//
169// return stream;
170//
171//}
172//
173//
174//template < typename TYPE >
175//inline stream& operator >>(stream& stream, string_list& list)
176//{
177//
178// ::i32 iSize;
179// stream >> iSize;
180// string str;
181// for (::i32 i = 0; i < iSize; i++)
182// {
183// stream >> str;
184// list.add_tail(str);
185// }
186// return stream;
187//}
188//
189
190
191