| /* |
| * Copyright 2014 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "SkTDArray.h" |
| |
| #ifndef GrTraceMarkerSet_DEFINED |
| #define GrTraceMarkerSet_DEFINED |
| |
| class GrGpuTraceMarker { |
| public: |
| GrGpuTraceMarker(const char* marker, int idCounter) : fMarker(marker), fID(idCounter) {} |
| |
| bool operator<(const GrGpuTraceMarker& rhs) const { |
| return this->fMarker < rhs.fMarker || (this->fMarker == rhs.fMarker && this->fID < rhs.fID); |
| } |
| |
| bool operator==(const GrGpuTraceMarker& rhs) const { |
| return (this->fID == rhs.fID && this->fMarker == rhs.fMarker); |
| } |
| |
| const char* fMarker; |
| int fID; |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| class SkString; |
| |
| class GrTraceMarkerSet { |
| public: |
| GrTraceMarkerSet() {} |
| |
| GrTraceMarkerSet(const GrTraceMarkerSet& other); |
| |
| // Adds marker to the set. |
| void add(const GrGpuTraceMarker& marker); |
| // Adds all markers from one set into this set. |
| void addSet(const GrTraceMarkerSet& markerSet); |
| |
| void remove(const GrGpuTraceMarker& marker); |
| |
| int count() const; |
| |
| /** |
| * First sorts fMarkerArray and returns a string of the format |
| * MarkerName1(#,#,...)%MarkerName2(#,#,...):... where MarkerName is the |
| * marker string used in the TraceMarker and the (#,#,..) is a list of instance |
| * id's for the the given marker string |
| */ |
| SkString toString() const; |
| |
| SkString toStringLast() const; |
| |
| class Iter; |
| |
| Iter begin() const; |
| |
| Iter end() const; |
| |
| private: |
| mutable SkTDArray<GrGpuTraceMarker> fMarkerArray; |
| }; |
| |
| class GrTraceMarkerSet::Iter { |
| public: |
| Iter() {}; |
| Iter& operator=(const Iter& i) { |
| fCurrentIndex = i.fCurrentIndex; |
| fMarkers = i.fMarkers; |
| return *this; |
| } |
| bool operator==(const Iter& i) const { |
| return fCurrentIndex == i.fCurrentIndex && fMarkers == i.fMarkers; |
| } |
| bool operator!=(const Iter& i) const { return !(*this == i); } |
| const GrGpuTraceMarker& operator*() const { return fMarkers->fMarkerArray[fCurrentIndex]; } |
| Iter& operator++() { |
| SkASSERT(*this != fMarkers->end()); |
| ++fCurrentIndex; |
| return *this; |
| } |
| |
| private: |
| friend class GrTraceMarkerSet; |
| Iter(const GrTraceMarkerSet* markers, int index) |
| : fMarkers(markers), fCurrentIndex(index) { |
| SkASSERT(markers); |
| } |
| |
| const GrTraceMarkerSet* fMarkers; |
| int fCurrentIndex; |
| }; |
| |
| #endif |