| /* | |
| * Copyright 2015 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef RecordTestUtils_DEFINED | |
| #define RecordTestUtils_DEFINED | |
| #include "src/core/SkRecord.h" | |
| #include "src/core/SkRecords.h" | |
| #include "tests/Test.h" | |
| // If the command we're reading is a U, set ptr to it, otherwise set it to nullptr. | |
| template <typename U> | |
| struct ReadAs { | |
| ReadAs() : ptr(nullptr), type(SkRecords::Type(~0)) {} | |
| const U* ptr; | |
| SkRecords::Type type; | |
| void operator()(const U& r) { ptr = &r; type = U::kType; } | |
| template <typename T> | |
| void operator()(const T&) { type = U::kType; } | |
| }; | |
| // Assert that the ith command in record is of type T, and return it. | |
| template <typename T> | |
| static const T* assert_type(skiatest::Reporter* r, const SkRecord& record, int index) { | |
| ReadAs<T> reader; | |
| record.visit(index, reader); | |
| REPORTER_ASSERT(r, T::kType == reader.type); | |
| REPORTER_ASSERT(r, SkToBool(reader.ptr)); | |
| return reader.ptr; | |
| } | |
| template <typename DrawT> struct MatchType { | |
| template <typename T> int operator()(const T&) { return 0; } | |
| int operator()(const DrawT&) { return 1; } | |
| }; | |
| template <typename DrawT> int count_instances_of_type(const SkRecord& record) { | |
| MatchType<DrawT> matcher; | |
| int counter = 0; | |
| for (int i = 0; i < record.count(); i++) { | |
| counter += record.visit(i, matcher); | |
| } | |
| return counter; | |
| } | |
| template <typename DrawT> int find_first_instances_of_type(const SkRecord& record) { | |
| MatchType<DrawT> matcher; | |
| for (int i = 0; i < record.count(); i++) { | |
| if (record.visit(i, matcher)) { | |
| return i; | |
| } | |
| } | |
| return -1; | |
| } | |
| #endif//RecordTestUtils_DEFINED |