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 14 class GrGpuTraceMarker { 15 public: GrGpuTraceMarker()16 GrGpuTraceMarker() {}; GrGpuTraceMarker(const char * marker,int idCounter)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 33 class SkString; 34 35 class GrTraceMarkerSet { 36 public: GrTraceMarkerSet()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 SkString toStringLast() const; 59 60 class Iter; 61 62 Iter begin() const; 63 64 Iter end() const; 65 66 private: 67 mutable SkTDArray<GrGpuTraceMarker> fMarkerArray; 68 }; 69 70 class GrTraceMarkerSet::Iter { 71 public: Iter()72 Iter() {}; 73 Iter& operator=(const Iter& i) { 74 fCurrentIndex = i.fCurrentIndex; 75 fMarkers = i.fMarkers; 76 return *this; 77 } 78 bool operator==(const Iter& i) const { 79 return fCurrentIndex == i.fCurrentIndex && fMarkers == i.fMarkers; 80 } 81 bool operator!=(const Iter& i) const { return !(*this == i); } 82 const GrGpuTraceMarker& operator*() const { return fMarkers->fMarkerArray[fCurrentIndex]; } 83 Iter& operator++() { 84 SkASSERT(*this != fMarkers->end()); 85 ++fCurrentIndex; 86 return *this; 87 } 88 89 private: 90 friend class GrTraceMarkerSet; Iter(const GrTraceMarkerSet * markers,int index)91 Iter(const GrTraceMarkerSet* markers, int index) 92 : fMarkers(markers), fCurrentIndex(index) { 93 SkASSERT(markers); 94 } 95 96 const GrTraceMarkerSet* fMarkers; 97 int fCurrentIndex; 98 }; 99 100 #endif 101