1
2/*
3 * Copyright 2014 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#include "SkTDArray.h"
10
11#ifndef GrTraceMarkerSet_DEFINED
12#define GrTraceMarkerSet_DEFINED
13
14class GrGpuTraceMarker {
15public:
16    GrGpuTraceMarker() {};
17    GrGpuTraceMarker(const char* marker, int idCounter) : fMarker(marker), fID(idCounter) {}
18
19    bool operator<(const GrGpuTraceMarker& rhs) const {
20        return this->fMarker < rhs.fMarker || (this->fMarker == rhs.fMarker && this->fID < rhs.fID);
21    }
22
23    bool operator==(const GrGpuTraceMarker& rhs) const {
24        return (this->fID == rhs.fID && this->fMarker == rhs.fMarker);
25    }
26
27    const char* fMarker;
28    int fID;
29};
30
31///////////////////////////////////////////////////////////////////////////////
32
33class SkString;
34
35class GrTraceMarkerSet {
36public:
37    GrTraceMarkerSet() {}
38
39    GrTraceMarkerSet(const GrTraceMarkerSet& other);
40
41    // Adds marker to the set.
42    void add(const GrGpuTraceMarker& marker);
43    // Adds all markers from one set into this set.
44    void addSet(const GrTraceMarkerSet& markerSet);
45
46    void remove(const GrGpuTraceMarker& marker);
47
48    int count() const;
49
50    /**
51     * First sorts fMarkerArray and returns a string of the format
52     * MarkerName1(#,#,...)%MarkerName2(#,#,...):... where MarkerName is the
53     * marker string used in the TraceMarker and the (#,#,..) is a list of instance
54     * id's for the the given marker string
55     */
56    SkString toString() const;
57
58    class Iter;
59
60    Iter begin() const;
61
62    Iter end() const;
63
64private:
65    mutable SkTDArray<GrGpuTraceMarker> fMarkerArray;
66};
67
68class GrTraceMarkerSet::Iter {
69public:
70    Iter() {};
71    Iter& operator=(const Iter& i) {
72        fCurrentIndex = i.fCurrentIndex;
73        fMarkers = i.fMarkers;
74        return *this;
75    }
76    bool operator==(const Iter& i) const {
77        return fCurrentIndex == i.fCurrentIndex && fMarkers == i.fMarkers;
78    }
79    bool operator!=(const Iter& i) const { return !(*this == i); }
80    const GrGpuTraceMarker& operator*() const { return fMarkers->fMarkerArray[fCurrentIndex]; }
81    Iter& operator++() {
82        SkASSERT(*this != fMarkers->end());
83        ++fCurrentIndex;
84        return *this;
85    }
86
87private:
88    friend class GrTraceMarkerSet;
89    Iter(const GrTraceMarkerSet* markers, int index)
90            : fMarkers(markers), fCurrentIndex(index) {
91        SkASSERT(markers);
92    }
93
94    const GrTraceMarkerSet* fMarkers;
95    int fCurrentIndex;
96};
97
98#endif
99