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