xref: /third_party/skia/tests/UtilsTest.cpp (revision cb93a386)
1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h"
9cb93a386Sopenharmony_ci#include "include/core/SkSpan.h"
10cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h"
11cb93a386Sopenharmony_ci#include "src/core/SkEnumerate.h"
12cb93a386Sopenharmony_ci#include "src/core/SkTSearch.h"
13cb93a386Sopenharmony_ci#include "src/core/SkTSort.h"
14cb93a386Sopenharmony_ci#include "src/core/SkZip.h"
15cb93a386Sopenharmony_ci#include "tests/Test.h"
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_ci#include <array>
18cb93a386Sopenharmony_ci#include <initializer_list>
19cb93a386Sopenharmony_ci#include <tuple>
20cb93a386Sopenharmony_ci#include <vector>
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_ciclass RefClass : public SkRefCnt {
23cb93a386Sopenharmony_cipublic:
24cb93a386Sopenharmony_ci    RefClass(int n) : fN(n) {}
25cb93a386Sopenharmony_ci    int get() const { return fN; }
26cb93a386Sopenharmony_ci
27cb93a386Sopenharmony_ciprivate:
28cb93a386Sopenharmony_ci    int fN;
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_ci    using INHERITED = SkRefCnt;
31cb93a386Sopenharmony_ci};
32cb93a386Sopenharmony_ci
33cb93a386Sopenharmony_cistatic void test_autounref(skiatest::Reporter* reporter) {
34cb93a386Sopenharmony_ci    RefClass obj(0);
35cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, obj.unique());
36cb93a386Sopenharmony_ci
37cb93a386Sopenharmony_ci    sk_sp<RefClass> tmp(&obj);
38cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, &obj == tmp.get());
39cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, obj.unique());
40cb93a386Sopenharmony_ci
41cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, &obj == tmp.release());
42cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, obj.unique());
43cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, nullptr == tmp.release());
44cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, nullptr == tmp.get());
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_ci    obj.ref();
47cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, !obj.unique());
48cb93a386Sopenharmony_ci    {
49cb93a386Sopenharmony_ci        sk_sp<RefClass> tmp2(&obj);
50cb93a386Sopenharmony_ci    }
51cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, obj.unique());
52cb93a386Sopenharmony_ci}
53cb93a386Sopenharmony_ci
54cb93a386Sopenharmony_cistatic void test_autostarray(skiatest::Reporter* reporter) {
55cb93a386Sopenharmony_ci    RefClass obj0(0);
56cb93a386Sopenharmony_ci    RefClass obj1(1);
57cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, obj0.unique());
58cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, obj1.unique());
59cb93a386Sopenharmony_ci
60cb93a386Sopenharmony_ci    {
61cb93a386Sopenharmony_ci        SkAutoSTArray<2, sk_sp<RefClass> > tmp;
62cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, 0 == tmp.count());
63cb93a386Sopenharmony_ci
64cb93a386Sopenharmony_ci        tmp.reset(0);   // test out reset(0) when already at 0
65cb93a386Sopenharmony_ci        tmp.reset(4);   // this should force a new allocation
66cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, 4 == tmp.count());
67cb93a386Sopenharmony_ci        tmp[0].reset(SkRef(&obj0));
68cb93a386Sopenharmony_ci        tmp[1].reset(SkRef(&obj1));
69cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, !obj0.unique());
70cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, !obj1.unique());
71cb93a386Sopenharmony_ci
72cb93a386Sopenharmony_ci        // test out reset with data in the array (and a new allocation)
73cb93a386Sopenharmony_ci        tmp.reset(0);
74cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, 0 == tmp.count());
75cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, obj0.unique());
76cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, obj1.unique());
77cb93a386Sopenharmony_ci
78cb93a386Sopenharmony_ci        tmp.reset(2);   // this should use the preexisting allocation
79cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, 2 == tmp.count());
80cb93a386Sopenharmony_ci        tmp[0].reset(SkRef(&obj0));
81cb93a386Sopenharmony_ci        tmp[1].reset(SkRef(&obj1));
82cb93a386Sopenharmony_ci    }
83cb93a386Sopenharmony_ci
84cb93a386Sopenharmony_ci    // test out destructor with data in the array (and using existing allocation)
85cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, obj0.unique());
86cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, obj1.unique());
87cb93a386Sopenharmony_ci
88cb93a386Sopenharmony_ci    {
89cb93a386Sopenharmony_ci        // test out allocating ctor (this should allocate new memory)
90cb93a386Sopenharmony_ci        SkAutoSTArray<2, sk_sp<RefClass> > tmp(4);
91cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, 4 == tmp.count());
92cb93a386Sopenharmony_ci
93cb93a386Sopenharmony_ci        tmp[0].reset(SkRef(&obj0));
94cb93a386Sopenharmony_ci        tmp[1].reset(SkRef(&obj1));
95cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, !obj0.unique());
96cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, !obj1.unique());
97cb93a386Sopenharmony_ci
98cb93a386Sopenharmony_ci        // Test out resut with data in the array and malloced storage
99cb93a386Sopenharmony_ci        tmp.reset(0);
100cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, obj0.unique());
101cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, obj1.unique());
102cb93a386Sopenharmony_ci
103cb93a386Sopenharmony_ci        tmp.reset(2);   // this should use the preexisting storage
104cb93a386Sopenharmony_ci        tmp[0].reset(SkRef(&obj0));
105cb93a386Sopenharmony_ci        tmp[1].reset(SkRef(&obj1));
106cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, !obj0.unique());
107cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, !obj1.unique());
108cb93a386Sopenharmony_ci
109cb93a386Sopenharmony_ci        tmp.reset(4);   // this should force a new malloc
110cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, obj0.unique());
111cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, obj1.unique());
112cb93a386Sopenharmony_ci
113cb93a386Sopenharmony_ci        tmp[0].reset(SkRef(&obj0));
114cb93a386Sopenharmony_ci        tmp[1].reset(SkRef(&obj1));
115cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, !obj0.unique());
116cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, !obj1.unique());
117cb93a386Sopenharmony_ci    }
118cb93a386Sopenharmony_ci
119cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, obj0.unique());
120cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, obj1.unique());
121cb93a386Sopenharmony_ci}
122cb93a386Sopenharmony_ci
123cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////
124cb93a386Sopenharmony_ci
125cb93a386Sopenharmony_ci#define kSEARCH_COUNT   91
126cb93a386Sopenharmony_ci
127cb93a386Sopenharmony_cistatic void test_search(skiatest::Reporter* reporter) {
128cb93a386Sopenharmony_ci    int         i, array[kSEARCH_COUNT];
129cb93a386Sopenharmony_ci    SkRandom    rand;
130cb93a386Sopenharmony_ci
131cb93a386Sopenharmony_ci    for (i = 0; i < kSEARCH_COUNT; i++) {
132cb93a386Sopenharmony_ci        array[i] = rand.nextS();
133cb93a386Sopenharmony_ci    }
134cb93a386Sopenharmony_ci
135cb93a386Sopenharmony_ci    SkTHeapSort<int>(array, kSEARCH_COUNT);
136cb93a386Sopenharmony_ci    // make sure we got sorted properly
137cb93a386Sopenharmony_ci    for (i = 1; i < kSEARCH_COUNT; i++) {
138cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, array[i-1] <= array[i]);
139cb93a386Sopenharmony_ci    }
140cb93a386Sopenharmony_ci
141cb93a386Sopenharmony_ci    // make sure we can find all of our values
142cb93a386Sopenharmony_ci    for (i = 0; i < kSEARCH_COUNT; i++) {
143cb93a386Sopenharmony_ci        int index = SkTSearch<int>(array, kSEARCH_COUNT, array[i], sizeof(int));
144cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, index == i);
145cb93a386Sopenharmony_ci    }
146cb93a386Sopenharmony_ci
147cb93a386Sopenharmony_ci    // make sure that random values are either found, or the correct
148cb93a386Sopenharmony_ci    // insertion index is returned
149cb93a386Sopenharmony_ci    for (i = 0; i < 10000; i++) {
150cb93a386Sopenharmony_ci        int value = rand.nextS();
151cb93a386Sopenharmony_ci        int index = SkTSearch<int>(array, kSEARCH_COUNT, value, sizeof(int));
152cb93a386Sopenharmony_ci
153cb93a386Sopenharmony_ci        if (index >= 0) {
154cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter,
155cb93a386Sopenharmony_ci                            index < kSEARCH_COUNT && array[index] == value);
156cb93a386Sopenharmony_ci        } else {
157cb93a386Sopenharmony_ci            index = ~index;
158cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, index <= kSEARCH_COUNT);
159cb93a386Sopenharmony_ci            if (index < kSEARCH_COUNT) {
160cb93a386Sopenharmony_ci                REPORTER_ASSERT(reporter, value < array[index]);
161cb93a386Sopenharmony_ci                if (index > 0) {
162cb93a386Sopenharmony_ci                    REPORTER_ASSERT(reporter, value > array[index - 1]);
163cb93a386Sopenharmony_ci                }
164cb93a386Sopenharmony_ci            } else {
165cb93a386Sopenharmony_ci                // we should append the new value
166cb93a386Sopenharmony_ci                REPORTER_ASSERT(reporter, value > array[kSEARCH_COUNT - 1]);
167cb93a386Sopenharmony_ci            }
168cb93a386Sopenharmony_ci        }
169cb93a386Sopenharmony_ci    }
170cb93a386Sopenharmony_ci}
171cb93a386Sopenharmony_ci
172cb93a386Sopenharmony_ciDEF_TEST(Utils, reporter) {
173cb93a386Sopenharmony_ci    test_search(reporter);
174cb93a386Sopenharmony_ci    test_autounref(reporter);
175cb93a386Sopenharmony_ci    test_autostarray(reporter);
176cb93a386Sopenharmony_ci}
177cb93a386Sopenharmony_ci
178cb93a386Sopenharmony_ciDEF_TEST(SkSpan, reporter) {
179cb93a386Sopenharmony_ci    // Test constness preservation for SkMakeSpan.
180cb93a386Sopenharmony_ci    {
181cb93a386Sopenharmony_ci        std::vector<int> v = {{1, 2, 3, 4, 5}};
182cb93a386Sopenharmony_ci        auto s = SkMakeSpan(v);
183cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, s[3] == 4);
184cb93a386Sopenharmony_ci        s[3] = 100;
185cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, s[3] == 100);
186cb93a386Sopenharmony_ci    }
187cb93a386Sopenharmony_ci
188cb93a386Sopenharmony_ci    {
189cb93a386Sopenharmony_ci        std::vector<int> t = {{1, 2, 3, 4, 5}};
190cb93a386Sopenharmony_ci        const std::vector<int>& v = t;
191cb93a386Sopenharmony_ci        auto s = SkMakeSpan(v);
192cb93a386Sopenharmony_ci        //s[3] = 100; // Should fail to compile
193cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, s[3] == 4);
194cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, t[3] == 4);
195cb93a386Sopenharmony_ci        t[3] = 100;
196cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, s[3] == 100);
197cb93a386Sopenharmony_ci    }
198cb93a386Sopenharmony_ci
199cb93a386Sopenharmony_ci    {
200cb93a386Sopenharmony_ci        std::array<int, 5> v = {{1, 2, 3, 4, 5}};
201cb93a386Sopenharmony_ci        auto s = SkMakeSpan(v);
202cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, s[3] == 4);
203cb93a386Sopenharmony_ci        s[3] = 100;
204cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, s[3] == 100);
205cb93a386Sopenharmony_ci        auto s1 = s.subspan(1,3);
206cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, s1.size() == 3);
207cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, s1.front() == 2);
208cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, s1.back() == 100);
209cb93a386Sopenharmony_ci    }
210cb93a386Sopenharmony_ci
211cb93a386Sopenharmony_ci    {
212cb93a386Sopenharmony_ci        std::array<int, 5> t = {{1, 2, 3, 4, 5}};
213cb93a386Sopenharmony_ci        const std::array<int, 5>& v = t;
214cb93a386Sopenharmony_ci        auto s = SkMakeSpan(v);
215cb93a386Sopenharmony_ci        //s[3] = 100; // Should fail to compile
216cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, s[3] == 4);
217cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, t[3] == 4);
218cb93a386Sopenharmony_ci        t[3] = 100;
219cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, s[3] == 100);
220cb93a386Sopenharmony_ci    }
221cb93a386Sopenharmony_ci
222cb93a386Sopenharmony_ci    {
223cb93a386Sopenharmony_ci        std::vector<int> v;
224cb93a386Sopenharmony_ci        auto s = SkMakeSpan(v);
225cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, s.empty());
226cb93a386Sopenharmony_ci    }
227cb93a386Sopenharmony_ci}
228cb93a386Sopenharmony_ci
229cb93a386Sopenharmony_ciDEF_TEST(SkEnumerate, reporter) {
230cb93a386Sopenharmony_ci
231cb93a386Sopenharmony_ci    int A[] = {1, 2, 3, 4};
232cb93a386Sopenharmony_ci    auto enumeration = SkMakeEnumerate(A);
233cb93a386Sopenharmony_ci
234cb93a386Sopenharmony_ci    size_t check = 0;
235cb93a386Sopenharmony_ci    for (auto [i, v] : enumeration) {
236cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i == check);
237cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, v == (int)check+1);
238cb93a386Sopenharmony_ci
239cb93a386Sopenharmony_ci        check++;
240cb93a386Sopenharmony_ci    }
241cb93a386Sopenharmony_ci
242cb93a386Sopenharmony_ci    check = 0;
243cb93a386Sopenharmony_ci    for (auto [i, v] : SkMakeEnumerate(A)) {
244cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i == check);
245cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, v == (int)check+1);
246cb93a386Sopenharmony_ci
247cb93a386Sopenharmony_ci        check++;
248cb93a386Sopenharmony_ci    }
249cb93a386Sopenharmony_ci
250cb93a386Sopenharmony_ci    check = 0;
251cb93a386Sopenharmony_ci    std::vector<int> vec = {1, 2, 3, 4};
252cb93a386Sopenharmony_ci    for (auto [i, v] : SkMakeEnumerate(vec)) {
253cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i == check);
254cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, v == (int)check+1);
255cb93a386Sopenharmony_ci        check++;
256cb93a386Sopenharmony_ci    }
257cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, check == 4);
258cb93a386Sopenharmony_ci
259cb93a386Sopenharmony_ci    check = 0;
260cb93a386Sopenharmony_ci    for (auto [i, v] : SkMakeEnumerate(SkMakeSpan(vec))) {
261cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i == check);
262cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, v == (int)check+1);
263cb93a386Sopenharmony_ci        check++;
264cb93a386Sopenharmony_ci    }
265cb93a386Sopenharmony_ci
266cb93a386Sopenharmony_ci    {
267cb93a386Sopenharmony_ci        auto e = SkMakeEnumerate(SkMakeSpan(vec)).first(2);
268cb93a386Sopenharmony_ci        for (auto[i, v] : e) {
269cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, v == (int) i + 1);
270cb93a386Sopenharmony_ci        }
271cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, e.size() == 2);
272cb93a386Sopenharmony_ci    }
273cb93a386Sopenharmony_ci
274cb93a386Sopenharmony_ci    {
275cb93a386Sopenharmony_ci        auto e = SkMakeEnumerate(SkMakeSpan(vec)).last(2);
276cb93a386Sopenharmony_ci        for (auto[i, v] : e) {
277cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, v == (int) i + 1);
278cb93a386Sopenharmony_ci        }
279cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, e.size() == 2);
280cb93a386Sopenharmony_ci    }
281cb93a386Sopenharmony_ci
282cb93a386Sopenharmony_ci    {
283cb93a386Sopenharmony_ci        auto e = SkMakeEnumerate(SkMakeSpan(vec)).subspan(1, 2);
284cb93a386Sopenharmony_ci        for (auto[i, v] : e) {
285cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, v == (int) i + 1);
286cb93a386Sopenharmony_ci        }
287cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, e.size() == 2);
288cb93a386Sopenharmony_ci    }
289cb93a386Sopenharmony_ci
290cb93a386Sopenharmony_ci    {
291cb93a386Sopenharmony_ci        struct I {
292cb93a386Sopenharmony_ci            I() = default;
293cb93a386Sopenharmony_ci            I(const I&) = default;
294cb93a386Sopenharmony_ci            I(int v) : i{v} { }
295cb93a386Sopenharmony_ci            ~I() {}
296cb93a386Sopenharmony_ci            int i;
297cb93a386Sopenharmony_ci        };
298cb93a386Sopenharmony_ci
299cb93a386Sopenharmony_ci        I is[10];
300cb93a386Sopenharmony_ci        auto s = SkMakeSpan(is);
301cb93a386Sopenharmony_ci        for (auto [i, v] : SkMakeEnumerate(s)) {
302cb93a386Sopenharmony_ci            new (&v) I(i);
303cb93a386Sopenharmony_ci        }
304cb93a386Sopenharmony_ci
305cb93a386Sopenharmony_ci        for (size_t i = 0; i < s.size(); i++) {
306cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s[i].i == (int)i);
307cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, is[i].i == (int)i);
308cb93a386Sopenharmony_ci        }
309cb93a386Sopenharmony_ci    }
310cb93a386Sopenharmony_ci
311cb93a386Sopenharmony_ci    {
312cb93a386Sopenharmony_ci        std::unique_ptr<int> is[10];
313cb93a386Sopenharmony_ci        std::unique_ptr<int> os[10];
314cb93a386Sopenharmony_ci        auto s = SkMakeSpan(is);
315cb93a386Sopenharmony_ci        for (auto [i, v] : SkMakeEnumerate(s)) {
316cb93a386Sopenharmony_ci            v = std::make_unique<int>(i);
317cb93a386Sopenharmony_ci        }
318cb93a386Sopenharmony_ci
319cb93a386Sopenharmony_ci        for (auto [i, v] : SkMakeEnumerate(SkMakeSpan(os))) {
320cb93a386Sopenharmony_ci            v = std::move(s[i]);
321cb93a386Sopenharmony_ci        }
322cb93a386Sopenharmony_ci
323cb93a386Sopenharmony_ci        for (size_t i = 0; i < s.size(); i++) {
324cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, *os[i] == (int)i);
325cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, is[i] == nullptr);
326cb93a386Sopenharmony_ci        }
327cb93a386Sopenharmony_ci    }
328cb93a386Sopenharmony_ci
329cb93a386Sopenharmony_ci    {
330cb93a386Sopenharmony_ci        std::unique_ptr<int> is[10];
331cb93a386Sopenharmony_ci        std::unique_ptr<int> os[10];
332cb93a386Sopenharmony_ci        auto s = SkMakeSpan(is);
333cb93a386Sopenharmony_ci        for (auto [i, v] : SkMakeEnumerate(s)) {
334cb93a386Sopenharmony_ci            v = std::make_unique<int>(i);
335cb93a386Sopenharmony_ci        }
336cb93a386Sopenharmony_ci
337cb93a386Sopenharmony_ci        for (auto [i, ov, iv] : SkMakeEnumerate(SkMakeZip(os, is))) {
338cb93a386Sopenharmony_ci            ov = std::move(iv);
339cb93a386Sopenharmony_ci        }
340cb93a386Sopenharmony_ci
341cb93a386Sopenharmony_ci        for (size_t i = 0; i < s.size(); i++) {
342cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, *os[i] == (int)i);
343cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, is[i] == nullptr);
344cb93a386Sopenharmony_ci        }
345cb93a386Sopenharmony_ci    }
346cb93a386Sopenharmony_ci}
347cb93a386Sopenharmony_ci
348cb93a386Sopenharmony_ciDEF_TEST(SkZip, reporter) {
349cb93a386Sopenharmony_ci    uint16_t A[] = {1, 2, 3, 4};
350cb93a386Sopenharmony_ci    const float B[] = {10.f, 20.f, 30.f, 40.f};
351cb93a386Sopenharmony_ci    std::vector<int> C = {{20, 30, 40, 50}};
352cb93a386Sopenharmony_ci    std::array<int, 4> D = {{100, 200, 300, 400}};
353cb93a386Sopenharmony_ci    SkSpan<int> S = SkMakeSpan(C);
354cb93a386Sopenharmony_ci
355cb93a386Sopenharmony_ci    // Check SkZip calls
356cb93a386Sopenharmony_ci    SkZip<uint16_t, const float, int, int, int>
357cb93a386Sopenharmony_ci            z{4, &A[0], &B[0], C.data(), D.data(), S.data()};
358cb93a386Sopenharmony_ci
359cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, z.size() == 4);
360cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, !z.empty());
361cb93a386Sopenharmony_ci
362cb93a386Sopenharmony_ci    {
363cb93a386Sopenharmony_ci        // Check front
364cb93a386Sopenharmony_ci        auto t = z.front();
365cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, std::get<0>(t) == 1);
366cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, std::get<1>(t) == 10.f);
367cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, std::get<2>(t) == 20);
368cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, std::get<3>(t) == 100);
369cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, std::get<4>(t) == 20);
370cb93a386Sopenharmony_ci    }
371cb93a386Sopenharmony_ci
372cb93a386Sopenharmony_ci    {
373cb93a386Sopenharmony_ci        // Check back
374cb93a386Sopenharmony_ci        auto t = z.back();
375cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, std::get<0>(t) == 4);
376cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, std::get<1>(t) == 40.f);
377cb93a386Sopenharmony_ci    }
378cb93a386Sopenharmony_ci
379cb93a386Sopenharmony_ci    {
380cb93a386Sopenharmony_ci        // Check ranged-for
381cb93a386Sopenharmony_ci        int i = 0;
382cb93a386Sopenharmony_ci        for (auto [a, b, c, d, s] : z) {
383cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i]);
384cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i]);
385cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i]);
386cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i]);
387cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i]);
388cb93a386Sopenharmony_ci
389cb93a386Sopenharmony_ci            i++;
390cb93a386Sopenharmony_ci        }
391cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i = 4);
392cb93a386Sopenharmony_ci    }
393cb93a386Sopenharmony_ci
394cb93a386Sopenharmony_ci    {
395cb93a386Sopenharmony_ci        // Check first(n)
396cb93a386Sopenharmony_ci        int i = 0;
397cb93a386Sopenharmony_ci        for (auto [a, b, c, d, s] : z.first(2)) {
398cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i]);
399cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i]);
400cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i]);
401cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i]);
402cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i]);
403cb93a386Sopenharmony_ci
404cb93a386Sopenharmony_ci            i++;
405cb93a386Sopenharmony_ci        }
406cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i = 2);
407cb93a386Sopenharmony_ci    }
408cb93a386Sopenharmony_ci
409cb93a386Sopenharmony_ci    {
410cb93a386Sopenharmony_ci        // Check last(n)
411cb93a386Sopenharmony_ci        int i = 0;
412cb93a386Sopenharmony_ci        for (auto t : z.last(2)) {
413cb93a386Sopenharmony_ci            uint16_t a; float b; int c; int d; int s;
414cb93a386Sopenharmony_ci            std::tie(a, b, c, d, s) = t;
415cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i + 2]);
416cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i + 2]);
417cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i + 2]);
418cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i + 2]);
419cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i + 2]);
420cb93a386Sopenharmony_ci
421cb93a386Sopenharmony_ci            i++;
422cb93a386Sopenharmony_ci        }
423cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i = 2);
424cb93a386Sopenharmony_ci    }
425cb93a386Sopenharmony_ci
426cb93a386Sopenharmony_ci    {
427cb93a386Sopenharmony_ci        // Check subspan(offset, count)
428cb93a386Sopenharmony_ci        int i = 0;
429cb93a386Sopenharmony_ci        for (auto t : z.subspan(1, 2)) {
430cb93a386Sopenharmony_ci            uint16_t a; float b; int c; int d; int s;
431cb93a386Sopenharmony_ci            std::tie(a, b, c, d, s) = t;
432cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i + 1]);
433cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i + 1]);
434cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i + 1]);
435cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i + 1]);
436cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i + 1]);
437cb93a386Sopenharmony_ci
438cb93a386Sopenharmony_ci            i++;
439cb93a386Sopenharmony_ci        }
440cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i = 2);
441cb93a386Sopenharmony_ci    }
442cb93a386Sopenharmony_ci
443cb93a386Sopenharmony_ci    {
444cb93a386Sopenharmony_ci        // Check copy.
445cb93a386Sopenharmony_ci        auto zz{z};
446cb93a386Sopenharmony_ci        int i = 0;
447cb93a386Sopenharmony_ci        for (auto [a, b, c, d, s] : zz) {
448cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i]);
449cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i]);
450cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i]);
451cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i]);
452cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i]);
453cb93a386Sopenharmony_ci
454cb93a386Sopenharmony_ci            i++;
455cb93a386Sopenharmony_ci        }
456cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i = 4);
457cb93a386Sopenharmony_ci    }
458cb93a386Sopenharmony_ci
459cb93a386Sopenharmony_ci    {
460cb93a386Sopenharmony_ci        // Check const restricting copy
461cb93a386Sopenharmony_ci        SkZip<const uint16_t, const float, const int, int, int> cz = z;
462cb93a386Sopenharmony_ci        int i = 0;
463cb93a386Sopenharmony_ci        for (auto [a, b, c, d, s] : cz) {
464cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i]);
465cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i]);
466cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i]);
467cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i]);
468cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i]);
469cb93a386Sopenharmony_ci
470cb93a386Sopenharmony_ci            i++;
471cb93a386Sopenharmony_ci        }
472cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i = 4);
473cb93a386Sopenharmony_ci    }
474cb93a386Sopenharmony_ci
475cb93a386Sopenharmony_ci    {
476cb93a386Sopenharmony_ci        // Check data() returns all the original pointers
477cb93a386Sopenharmony_ci        auto ptrs = z.data();
478cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter,
479cb93a386Sopenharmony_ci                ptrs == std::make_tuple(&A[0], &B[0], C.data(), D.data(), S.data()));
480cb93a386Sopenharmony_ci    }
481cb93a386Sopenharmony_ci
482cb93a386Sopenharmony_ci    {
483cb93a386Sopenharmony_ci        // Check index getter
484cb93a386Sopenharmony_ci        auto span = z.get<1>();
485cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, span[1] == 20.f);
486cb93a386Sopenharmony_ci    }
487cb93a386Sopenharmony_ci
488cb93a386Sopenharmony_ci    // The following mutates the data.
489cb93a386Sopenharmony_ci    {
490cb93a386Sopenharmony_ci        // Check indexing
491cb93a386Sopenharmony_ci        auto [a, b, c, d, e] = z[1];
492cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, a == 2);
493cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, b == 20.f);
494cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, c == 30);
495cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, d == 200);
496cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, e == 30);
497cb93a386Sopenharmony_ci
498cb93a386Sopenharmony_ci        // Check correct refs returned.
499cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, &a == &A[1]);
500cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, &b == &B[1]);
501cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, &c == &C[1]);
502cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, &d == &D[1]);
503cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, &e == &S[1]);
504cb93a386Sopenharmony_ci
505cb93a386Sopenharmony_ci        // Check assignment
506cb93a386Sopenharmony_ci        a = 20;
507cb93a386Sopenharmony_ci        // std::get<1>(t) = 300.f; // is const
508cb93a386Sopenharmony_ci        c = 300;
509cb93a386Sopenharmony_ci        d = 2000;
510cb93a386Sopenharmony_ci        e = 300;
511cb93a386Sopenharmony_ci
512cb93a386Sopenharmony_ci        auto t1 = z[1];
513cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, std::get<0>(t1) == 20);
514cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, std::get<1>(t1) == 20.f);
515cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, std::get<2>(t1) == 300);
516cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, std::get<3>(t1) == 2000);
517cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, std::get<4>(t1) == 300);
518cb93a386Sopenharmony_ci    }
519cb93a386Sopenharmony_ci}
520cb93a386Sopenharmony_ci
521cb93a386Sopenharmony_ciDEF_TEST(SkMakeZip, reporter) {
522cb93a386Sopenharmony_ci    uint16_t A[] = {1, 2, 3, 4};
523cb93a386Sopenharmony_ci    const float B[] = {10.f, 20.f, 30.f, 40.f};
524cb93a386Sopenharmony_ci    const std::vector<int> C = {{20, 30, 40, 50}};
525cb93a386Sopenharmony_ci    std::array<int, 4> D = {{100, 200, 300, 400}};
526cb93a386Sopenharmony_ci    SkSpan<const int> S = SkMakeSpan(C);
527cb93a386Sopenharmony_ci    uint16_t* P = &A[0];
528cb93a386Sopenharmony_ci    {
529cb93a386Sopenharmony_ci        // Check make zip
530cb93a386Sopenharmony_ci        auto zz = SkMakeZip(&A[0], B, C, D, S, P);
531cb93a386Sopenharmony_ci
532cb93a386Sopenharmony_ci        int i = 0;
533cb93a386Sopenharmony_ci        for (auto [a, b, c, d, s, p] : zz) {
534cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i]);
535cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i]);
536cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i]);
537cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i]);
538cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i]);
539cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, p == P[i]);
540cb93a386Sopenharmony_ci
541cb93a386Sopenharmony_ci            i++;
542cb93a386Sopenharmony_ci        }
543cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i = 4);
544cb93a386Sopenharmony_ci    }
545cb93a386Sopenharmony_ci
546cb93a386Sopenharmony_ci    {
547cb93a386Sopenharmony_ci        // Check SkMakeZip in ranged for check OneSize calc of B.
548cb93a386Sopenharmony_ci        int i = 0;
549cb93a386Sopenharmony_ci        for (auto [a, b, c, d, s] : SkMakeZip(&A[0], B, C, D, S)) {
550cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i]);
551cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i]);
552cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i]);
553cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i]);
554cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i]);
555cb93a386Sopenharmony_ci
556cb93a386Sopenharmony_ci            i++;
557cb93a386Sopenharmony_ci        }
558cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i = 4);
559cb93a386Sopenharmony_ci    }
560cb93a386Sopenharmony_ci
561cb93a386Sopenharmony_ci    {
562cb93a386Sopenharmony_ci        // Check SkMakeZip in ranged for OneSize of C
563cb93a386Sopenharmony_ci        int i = 0;
564cb93a386Sopenharmony_ci        for (auto [a, b, c, d, s] : SkMakeZip(&A[0], &B[0], C, D, S)) {
565cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i]);
566cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i]);
567cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i]);
568cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i]);
569cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i]);
570cb93a386Sopenharmony_ci
571cb93a386Sopenharmony_ci            i++;
572cb93a386Sopenharmony_ci        }
573cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i = 4);
574cb93a386Sopenharmony_ci    }
575cb93a386Sopenharmony_ci
576cb93a386Sopenharmony_ci    {
577cb93a386Sopenharmony_ci        // Check SkMakeZip in ranged for OneSize for S
578cb93a386Sopenharmony_ci        int i = 0;
579cb93a386Sopenharmony_ci        for (auto [s, a, b, c, d] : SkMakeZip(S, A, B, C, D)) {
580cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i]);
581cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i]);
582cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i]);
583cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i]);
584cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i]);
585cb93a386Sopenharmony_ci
586cb93a386Sopenharmony_ci            i++;
587cb93a386Sopenharmony_ci        }
588cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i = 4);
589cb93a386Sopenharmony_ci    }
590cb93a386Sopenharmony_ci
591cb93a386Sopenharmony_ci    {
592cb93a386Sopenharmony_ci        // Check SkMakeZip in ranged for
593cb93a386Sopenharmony_ci        int i = 0;
594cb93a386Sopenharmony_ci        for (auto [c, s, a, b, d] : SkMakeZip(C, S, A, B, D)) {
595cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i]);
596cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i]);
597cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i]);
598cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i]);
599cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i]);
600cb93a386Sopenharmony_ci
601cb93a386Sopenharmony_ci            i++;
602cb93a386Sopenharmony_ci        }
603cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, i = 4);
604cb93a386Sopenharmony_ci    }
605cb93a386Sopenharmony_ci
606cb93a386Sopenharmony_ci    {
607cb93a386Sopenharmony_ci        // Check SkEnumerate and SkMakeZip in ranged for
608cb93a386Sopenharmony_ci        auto zz = SkMakeZip(A, B, C, D, S);
609cb93a386Sopenharmony_ci        for (auto [i, a, b, c, d, s] : SkMakeEnumerate(zz)) {
610cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i]);
611cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i]);
612cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i]);
613cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i]);
614cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i]);
615cb93a386Sopenharmony_ci        }
616cb93a386Sopenharmony_ci    }
617cb93a386Sopenharmony_ci
618cb93a386Sopenharmony_ci    {
619cb93a386Sopenharmony_ci        // Check SkEnumerate and SkMakeZip in ranged for
620cb93a386Sopenharmony_ci        const auto& zz = SkMakeZip(A, B, C, D, S);
621cb93a386Sopenharmony_ci        for (auto [i, a, b, c, d, s] : SkMakeEnumerate(zz)) {
622cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i]);
623cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i]);
624cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i]);
625cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i]);
626cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i]);
627cb93a386Sopenharmony_ci        }
628cb93a386Sopenharmony_ci    }
629cb93a386Sopenharmony_ci
630cb93a386Sopenharmony_ci    {
631cb93a386Sopenharmony_ci        // Check SkEnumerate and SkMakeZip in ranged for
632cb93a386Sopenharmony_ci        for (auto [i, a, b, c, d, s] : SkMakeEnumerate(SkMakeZip(A, B, C, D, S))) {
633cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, a == A[i]);
634cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, b == B[i]);
635cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, c == C[i]);
636cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, d == D[i]);
637cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, s == S[i]);
638cb93a386Sopenharmony_ci        }
639cb93a386Sopenharmony_ci    }
640cb93a386Sopenharmony_ci
641cb93a386Sopenharmony_ci    {
642cb93a386Sopenharmony_ci        std::vector<int>v;
643cb93a386Sopenharmony_ci        auto z = SkMakeZip(v);
644cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, z.empty());
645cb93a386Sopenharmony_ci    }
646cb93a386Sopenharmony_ci
647cb93a386Sopenharmony_ci    {
648cb93a386Sopenharmony_ci        constexpr static uint16_t cA[] = {1, 2, 3, 4};
649cb93a386Sopenharmony_ci        // Not constexpr in stdc++11 library.
650cb93a386Sopenharmony_ci        //constexpr static std::array<int, 4> cD = {{100, 200, 300, 400}};
651cb93a386Sopenharmony_ci        constexpr static const uint16_t* cP = &cA[0];
652cb93a386Sopenharmony_ci        constexpr auto z = SkMakeZip(cA, cP);
653cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, !z.empty());
654cb93a386Sopenharmony_ci    }
655cb93a386Sopenharmony_ci}
656