1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2021 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #pragma once 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker #include <memory> 9*89c4ff92SAndroid Build Coastguard Worker #include <stdint.h> 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker namespace arm 12*89c4ff92SAndroid Build Coastguard Worker { 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker namespace pipe 15*89c4ff92SAndroid Build Coastguard Worker { 16*89c4ff92SAndroid Build Coastguard Worker 17*89c4ff92SAndroid Build Coastguard Worker static constexpr uint64_t MIN_STATIC_GUID = 1llu << 63; 18*89c4ff92SAndroid Build Coastguard Worker 19*89c4ff92SAndroid Build Coastguard Worker class ProfilingGuid 20*89c4ff92SAndroid Build Coastguard Worker { 21*89c4ff92SAndroid Build Coastguard Worker public: ProfilingGuid()22*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid() : m_Guid(0) {} 23*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid(uint64_t guid)24*89c4ff92SAndroid Build Coastguard Worker ProfilingGuid(uint64_t guid) : m_Guid(guid) {} 25*89c4ff92SAndroid Build Coastguard Worker operator uint64_t() const26*89c4ff92SAndroid Build Coastguard Worker operator uint64_t() const { return m_Guid; } 27*89c4ff92SAndroid Build Coastguard Worker operator ==(const ProfilingGuid & other) const28*89c4ff92SAndroid Build Coastguard Worker bool operator==(const ProfilingGuid& other) const 29*89c4ff92SAndroid Build Coastguard Worker { 30*89c4ff92SAndroid Build Coastguard Worker return m_Guid == other.m_Guid; 31*89c4ff92SAndroid Build Coastguard Worker } 32*89c4ff92SAndroid Build Coastguard Worker operator !=(const ProfilingGuid & other) const33*89c4ff92SAndroid Build Coastguard Worker bool operator!=(const ProfilingGuid& other) const 34*89c4ff92SAndroid Build Coastguard Worker { 35*89c4ff92SAndroid Build Coastguard Worker return m_Guid != other.m_Guid; 36*89c4ff92SAndroid Build Coastguard Worker } 37*89c4ff92SAndroid Build Coastguard Worker operator <(const ProfilingGuid & other) const38*89c4ff92SAndroid Build Coastguard Worker bool operator<(const ProfilingGuid& other) const 39*89c4ff92SAndroid Build Coastguard Worker { 40*89c4ff92SAndroid Build Coastguard Worker return m_Guid < other.m_Guid; 41*89c4ff92SAndroid Build Coastguard Worker } 42*89c4ff92SAndroid Build Coastguard Worker operator <=(const ProfilingGuid & other) const43*89c4ff92SAndroid Build Coastguard Worker bool operator<=(const ProfilingGuid& other) const 44*89c4ff92SAndroid Build Coastguard Worker { 45*89c4ff92SAndroid Build Coastguard Worker return m_Guid <= other.m_Guid; 46*89c4ff92SAndroid Build Coastguard Worker } 47*89c4ff92SAndroid Build Coastguard Worker operator >(const ProfilingGuid & other) const48*89c4ff92SAndroid Build Coastguard Worker bool operator>(const ProfilingGuid& other) const 49*89c4ff92SAndroid Build Coastguard Worker { 50*89c4ff92SAndroid Build Coastguard Worker return m_Guid > other.m_Guid; 51*89c4ff92SAndroid Build Coastguard Worker } 52*89c4ff92SAndroid Build Coastguard Worker operator >=(const ProfilingGuid & other) const53*89c4ff92SAndroid Build Coastguard Worker bool operator>=(const ProfilingGuid& other) const 54*89c4ff92SAndroid Build Coastguard Worker { 55*89c4ff92SAndroid Build Coastguard Worker return m_Guid >= other.m_Guid; 56*89c4ff92SAndroid Build Coastguard Worker } 57*89c4ff92SAndroid Build Coastguard Worker 58*89c4ff92SAndroid Build Coastguard Worker protected: 59*89c4ff92SAndroid Build Coastguard Worker uint64_t m_Guid; 60*89c4ff92SAndroid Build Coastguard Worker }; 61*89c4ff92SAndroid Build Coastguard Worker 62*89c4ff92SAndroid Build Coastguard Worker /// Strongly typed guids to distinguish between those generated at runtime, and those that are statically defined. 63*89c4ff92SAndroid Build Coastguard Worker struct ProfilingDynamicGuid : public ProfilingGuid 64*89c4ff92SAndroid Build Coastguard Worker { 65*89c4ff92SAndroid Build Coastguard Worker using ProfilingGuid::ProfilingGuid; 66*89c4ff92SAndroid Build Coastguard Worker }; 67*89c4ff92SAndroid Build Coastguard Worker 68*89c4ff92SAndroid Build Coastguard Worker struct ProfilingStaticGuid : public ProfilingGuid 69*89c4ff92SAndroid Build Coastguard Worker { 70*89c4ff92SAndroid Build Coastguard Worker using ProfilingGuid::ProfilingGuid; 71*89c4ff92SAndroid Build Coastguard Worker }; 72*89c4ff92SAndroid Build Coastguard Worker 73*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 74*89c4ff92SAndroid Build Coastguard Worker 75*89c4ff92SAndroid Build Coastguard Worker } // namespace arm 76*89c4ff92SAndroid Build Coastguard Worker 77*89c4ff92SAndroid Build Coastguard Worker 78*89c4ff92SAndroid Build Coastguard Worker 79*89c4ff92SAndroid Build Coastguard Worker namespace std 80*89c4ff92SAndroid Build Coastguard Worker { 81*89c4ff92SAndroid Build Coastguard Worker /// make ProfilingGuid hashable 82*89c4ff92SAndroid Build Coastguard Worker template <> 83*89c4ff92SAndroid Build Coastguard Worker struct hash<arm::pipe::ProfilingGuid> 84*89c4ff92SAndroid Build Coastguard Worker { operator ()std::hash85*89c4ff92SAndroid Build Coastguard Worker std::size_t operator()(arm::pipe::ProfilingGuid const& guid) const noexcept 86*89c4ff92SAndroid Build Coastguard Worker { 87*89c4ff92SAndroid Build Coastguard Worker return hash<uint64_t>()(uint64_t(guid)); 88*89c4ff92SAndroid Build Coastguard Worker } 89*89c4ff92SAndroid Build Coastguard Worker }; 90*89c4ff92SAndroid Build Coastguard Worker 91*89c4ff92SAndroid Build Coastguard Worker /// make ProfilingDynamicGuid hashable 92*89c4ff92SAndroid Build Coastguard Worker template <> 93*89c4ff92SAndroid Build Coastguard Worker struct hash<arm::pipe::ProfilingDynamicGuid> 94*89c4ff92SAndroid Build Coastguard Worker { operator ()std::hash95*89c4ff92SAndroid Build Coastguard Worker std::size_t operator()(arm::pipe::ProfilingDynamicGuid const& guid) const noexcept 96*89c4ff92SAndroid Build Coastguard Worker { 97*89c4ff92SAndroid Build Coastguard Worker return hash<uint64_t>()(uint64_t(guid)); 98*89c4ff92SAndroid Build Coastguard Worker } 99*89c4ff92SAndroid Build Coastguard Worker }; 100*89c4ff92SAndroid Build Coastguard Worker 101*89c4ff92SAndroid Build Coastguard Worker /// make ProfilingStaticGuid hashable 102*89c4ff92SAndroid Build Coastguard Worker template <> 103*89c4ff92SAndroid Build Coastguard Worker struct hash<arm::pipe::ProfilingStaticGuid> 104*89c4ff92SAndroid Build Coastguard Worker { operator ()std::hash105*89c4ff92SAndroid Build Coastguard Worker std::size_t operator()(arm::pipe::ProfilingStaticGuid const& guid) const noexcept 106*89c4ff92SAndroid Build Coastguard Worker { 107*89c4ff92SAndroid Build Coastguard Worker return hash<uint64_t>()(uint64_t(guid)); 108*89c4ff92SAndroid Build Coastguard Worker } 109*89c4ff92SAndroid Build Coastguard Worker }; 110*89c4ff92SAndroid Build Coastguard Worker 111*89c4ff92SAndroid Build Coastguard Worker } // namespace std