1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef RecordTestUtils_DEFINED 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define RecordTestUtils_DEFINED 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRecord.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRecords.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Test.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// If the command we're reading is a U, set ptr to it, otherwise set it to nullptr. 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottemplate <typename U> 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct ReadAs { 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ReadAs() : ptr(nullptr), type(SkRecords::Type(~0)) {} 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const U* ptr; 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRecords::Type type; 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void operator()(const U& r) { ptr = &r; type = U::kType; } 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot template <typename T> 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void operator()(const T&) { type = U::kType; } 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Assert that the ith command in record is of type T, and return it. 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottemplate <typename T> 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic const T* assert_type(skiatest::Reporter* r, const SkRecord& record, int index) { 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ReadAs<T> reader; 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot record.visit(index, reader); 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(r, T::kType == reader.type); 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(r, SkToBool(reader.ptr)); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return reader.ptr; 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottemplate <typename DrawT> struct MatchType { 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot template <typename T> int operator()(const T&) { return 0; } 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int operator()(const DrawT&) { return 1; } 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottemplate <typename DrawT> int count_instances_of_type(const SkRecord& record) { 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot MatchType<DrawT> matcher; 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int counter = 0; 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < record.count(); i++) { 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot counter += record.visit(i, matcher); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return counter; 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottemplate <typename DrawT> int find_first_instances_of_type(const SkRecord& record) { 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot MatchType<DrawT> matcher; 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < record.count(); i++) { 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (record.visit(i, matcher)) { 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return i; 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return -1; 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif//RecordTestUtils_DEFINED 64