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