Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
Loading...
Searching...
No Matches
array_utils.cc
Go to the documentation of this file.
1
2/*
3 Aleph_w
4
5 Data structures & Algorithms
6 version 2.0.0b
7 https://github.com/lrleon/Aleph-w
8
9 This file is part of Aleph-w library
10
11 Copyright (c) 2002-2026 Leandro Rabindranath Leon
12
13 Permission is hereby granted, free of charge, to any person obtaining a copy
14 of this software and associated documentation files (the "Software"), to deal
15 in the Software without restriction, including without limitation the rights
16 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17 copies of the Software, and to permit persons to whom the Software is
18 furnished to do so, subject to the following conditions:
19
20 The above copyright notice and this permission notice shall be included in all
21 copies or substantial portions of the Software.
22
23 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 SOFTWARE.
30*/
31
32
33
38# include <gtest/gtest.h>
39
40# include <iostream>
41
42# include <array_utils.H>
43# include <ah-string-utils.H>
44
45using namespace std;
46using namespace testing;
47using namespace Aleph;
48
49struct SimpleArray : public Test
50{
51 size_t n = 17;
52 int * a = nullptr;
54 {
55 for (size_t i = 0; i < n; ++i)
56 a[i] = i;
57 }
58 ~SimpleArray() { delete [] a; }
60 {
61 cout << "a =";
62 for (size_t i = 0; i < n; ++i)
63 cout << " " << a[i];
64 cout << endl
65 << endl;
66 }
67};
68
70{
71 EXPECT_GT(n, 0);
72 open_gap(a, n, 0, 1);
73
74 EXPECT_EQ(a[0], 0);
75
76 for (size_t i = 1; i < n; ++i)
77 EXPECT_EQ(a[i], i - 1);
78}
79
81{
82 EXPECT_GT(n, 0);
83 open_gap(a, n, n - 2, 1);
84
85 for (size_t i = 0; i < n - 2; ++i)
86 EXPECT_EQ(a[i], i);
87
88 EXPECT_EQ(a[n - 2], n - 2);
89
90 for (size_t i = n - 1; i < n; ++i)
91 EXPECT_EQ(a[i], i - 1);
92}
93
95{
96 EXPECT_GT(n, 0);
97 open_gap(a, n, 0, 3);
98 for (size_t i = 0; i < 3; ++i)
99 EXPECT_EQ(a[i], i);
100
101 for (size_t i = 3; i < n; ++i)
102 EXPECT_EQ(a[i], i - 3);
103}
104
106{
107 EXPECT_GT(n, 0);
108 EXPECT_THROW(open_gap(a, n, 0, n + 1), out_of_range);
109 EXPECT_THROW(open_gap(a, n, 0, n + 2), out_of_range);
110 EXPECT_NO_THROW(open_gap(a, n, 0, n));
111
112 EXPECT_NO_THROW(open_gap(a, n, n - 1, 1));
113 EXPECT_NO_THROW(open_gap(a, n, n - 1, 0));
114
115 EXPECT_THROW(open_gap(a, n, n, 0), out_of_range);
116 EXPECT_NO_THROW(open_gap(a, n, n - 1, 0));
117
118 EXPECT_NO_THROW(open_gap(a, n, n - 3, 3));
119 EXPECT_NO_THROW(open_gap(a, n, n - 3 - 1, 3));
120 EXPECT_NO_THROW(open_gap(a, n, n - 3, 2));
121}
122
124{
125 EXPECT_GT(n, 0);
126 close_gap(a, n, 0, 1);
127 for (size_t i = 0; i < n - 1; ++i)
128 EXPECT_EQ(a[i], i + 1);
129 EXPECT_EQ(a[n-1], n - 1);
130}
131
133{
134 EXPECT_GT(n, 0);
135 close_gap(a, n, n - 2, 1);
136 for (size_t i = 0; i < n - 2; ++i)
137 EXPECT_EQ(a[i], i);
138 EXPECT_EQ(a[n - 1], n - 1);
139 EXPECT_EQ(a[n - 1], n - 1);
140}
141
143{
144 EXPECT_GT(n, 0);
145 close_gap(a, n, 0, 3);
146 for (size_t i = 0; i < n - 3; ++i)
147 EXPECT_EQ(a[i], i + 3);
148 for (size_t i = n - 3; i < n; ++i)
149 EXPECT_EQ(a[i], i);
150}
151
153{
154 EXPECT_GT(n, 0);
155 close_gap(a, n, n - 4, 2);
156 for (size_t i = 0; i < n - 4; ++i)
157 EXPECT_EQ(a[i], i);
158 for (size_t i = n - 4; i < n - 2; ++i)
159 EXPECT_EQ(a[i], i + 2);
160 for (size_t i = n - 2; i < n; ++i)
161 EXPECT_EQ(a[i], i);
162}
163
165{
166 EXPECT_GT(n, 0);
167 EXPECT_THROW(close_gap(a, n, n - 1, 2), out_of_range);
168 EXPECT_NO_THROW(close_gap(a, n, n - 1, 0));
169
170 EXPECT_THROW(close_gap(a, n, 0, n + 1), out_of_range);
171 EXPECT_NO_THROW(close_gap(a, n, 0, n - 1));
172}
173
175{
176 EXPECT_GT(n, 0);
177 reverse(a, n);
178 size_t k = 0;
179 for (size_t i = 0; i < n; ++i, ++k)
180 EXPECT_EQ(a[i], n - i - 1);
181 EXPECT_EQ(k, n);
182}
183
185{
186 EXPECT_GT(n, 0);
187
188 rotate_left(a, n, 3);
189 for (size_t i = 0; i < n; ++i)
190 EXPECT_EQ(a[i], (i + 3) % n);
191}
192
194{
195 EXPECT_GT(n, 0);
196
197 rotate_right(a, n, 3);
198 for (size_t i = 0; i < n; ++i)
199 EXPECT_EQ(a[i], (n + i - 3) % n);
200}
201
202struct ComplexArray : public Test
203{
204 size_t n = 19;
205 DynList<int> * a = nullptr;
207 {
208 for (size_t i = 0; i < n; ++i)
209 {
210 a[i].append(i);
211 a[i].append({1, 2, 3});
212 }
213 }
214 ~ComplexArray() { delete [] a; }
215 void print() const
216 {
217 cout << "a =";
218 for (size_t i = 0; i < n; ++i)
219 cout << "(" << join(a[i], ", ") << ")";
220 cout << endl
221 << endl;
222 }
223};
224
226{
227 EXPECT_GT(n, 0);
228 open_gap(a, n, 0, 1);
229 EXPECT_EQ(a[0].get_first(), n - 1);
230 for (size_t i = 1; i < n; ++i)
231 {
232 EXPECT_EQ(a[i].get_first(), i - 1);
233 }
234}
235
237{
238 EXPECT_GT(n, 0);
239 open_gap(a, n, n - 2, 1);
240 for (size_t i = 0; i < n - 2; ++i)
241 EXPECT_EQ(a[i].get_first(), i);
242
243 EXPECT_EQ(a[n - 2].get_first(), n - 1);
244
245 for (size_t i = n - 1; i < n; ++i)
246 EXPECT_EQ(a[i].get_first(), i - 1);
247}
248
250{
251 EXPECT_GT(n, 0);
252 open_gap(a, n, 0, 3);
253 for (size_t i = 3; i < n; ++i)
254 EXPECT_EQ(a[i].get_first(), i - 3);
255}
256
258{
259 EXPECT_GT(n, 0);
260 close_gap(a, n, 0, 1);
261 for (size_t i = 0; i < n - 1; ++i)
262 EXPECT_EQ(a[i].get_first(), i + 1);
263}
264
266{
267 EXPECT_GT(n, 0);
268 close_gap(a, n, n - 2, 1);
269 for (size_t i = 0; i < n - 2; ++i)
270 EXPECT_EQ(a[i].get_first(), i);
271}
272
274{
275 EXPECT_GT(n, 0);
276 close_gap(a, n, 0, 3);
277 for (size_t i = 0; i < n - 3; ++i)
278 EXPECT_EQ(a[i].get_first(), i + 3);
279}
280
282{
283 EXPECT_GT(n, 0);
284 close_gap(a, n, n - 4, 2);
285 for (size_t i = 0; i < n - 4; ++i)
286 EXPECT_EQ(a[i].get_first(), i);
287 for (size_t i = n - 4; i < n - 2; ++i)
288 EXPECT_EQ(a[i].get_first(), i + 2);
289 for (size_t i = n - 2; i < n; ++i)
290 EXPECT_EQ(a[i].get_first(), i - 2);
291}
292
294{
295 EXPECT_GT(n, 0);
296 EXPECT_THROW(open_gap(a, n, 0, n + 1), out_of_range);
297 EXPECT_THROW(open_gap(a, n, 0, n + 2), out_of_range);
298 EXPECT_NO_THROW(open_gap(a, n, 0, n));
299
300 EXPECT_NO_THROW(open_gap(a, n, n - 1, 1));
301 EXPECT_NO_THROW(open_gap(a, n, n - 1, 0));
302
303 EXPECT_THROW(open_gap(a, n, n, 0), out_of_range);
304 EXPECT_NO_THROW(open_gap(a, n, n - 1, 0));
305
306 EXPECT_NO_THROW(open_gap(a, n, n - 3, 3));
307 EXPECT_NO_THROW(open_gap(a, n, n - 3 - 1, 3));
308 EXPECT_NO_THROW(open_gap(a, n, n - 3, 2));
309}
310
312{
313 EXPECT_GT(n, 0);
314 reverse(a, n);
315 size_t k = 0;
316 for (size_t i = 0; i < n; ++i, ++k)
317 EXPECT_EQ(a[i].get_first(), n - i - 1);
318 EXPECT_EQ(k, n);
319}
320
322{
323 EXPECT_GT(n, 0);
324
325 rotate_left(a, n, 3);
326 for (size_t i = 0; i < n; ++i)
327 EXPECT_EQ(a[i].get_first(), (i + 3) % n);
328}
329
331{
332 EXPECT_GT(n, 0);
333
334 rotate_right(a, n, 3);
335 for (size_t i = 0; i < n; ++i)
336 EXPECT_EQ(a[i].get_first(), (n + i - 3) % n);
337}
String manipulation utilities.
Utility functions for array manipulation.
TEST_F(SimpleArray, simple_open_gap_by_copy_left)
Dynamic singly linked list with functional programming support.
Definition htlist.H:1423
T & append(const T &item)
Append a new item by copy.
Definition htlist.H:1562
Main namespace for Aleph-w library functions.
Definition ah-arena.H:89
void reverse(Itor beg, Itor end)
Reverse elements in a range.
Definition ahAlgo.H:1094
void rotate_left(T *ptr, const size_t n, size_t m) noexcept
Rotate array elements left by m positions.
void open_gap(Tarray &ptr, size_t n, size_t pos=0, size_t num_entries=1)
Open a gap in an array by shifting elements right.
Definition array_utils.H:96
std::ostream & join(const C &c, const std::string &sep, std::ostream &out)
Join elements of an Aleph-style container into a stream.
void rotate_right(T *ptr, const size_t n, size_t m) noexcept
Rotate array elements right by m positions.
void close_gap(T *ptr, size_t n, size_t pos, size_t num_entries=1)
Close a gap in an array by shifting elements left.
DynList< T > maps(const C &c, Op op)
Classic map operation.
STL namespace.
void print() const
DynList< int > * a
void print() const noexcept