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 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