1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2019 The SwiftShader Authors. All Rights Reserved. 2*03ce13f7SAndroid Build Coastguard Worker // 3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*03ce13f7SAndroid Build Coastguard Worker // 7*03ce13f7SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 8*03ce13f7SAndroid Build Coastguard Worker // 9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License. 14*03ce13f7SAndroid Build Coastguard Worker 15*03ce13f7SAndroid Build Coastguard Worker #ifndef VK_DEBUG_ID_HPP_ 16*03ce13f7SAndroid Build Coastguard Worker #define VK_DEBUG_ID_HPP_ 17*03ce13f7SAndroid Build Coastguard Worker 18*03ce13f7SAndroid Build Coastguard Worker #include <functional> // std::hash 19*03ce13f7SAndroid Build Coastguard Worker 20*03ce13f7SAndroid Build Coastguard Worker namespace vk { 21*03ce13f7SAndroid Build Coastguard Worker namespace dbg { 22*03ce13f7SAndroid Build Coastguard Worker 23*03ce13f7SAndroid Build Coastguard Worker // ID is a strongly-typed identifier backed by a int. 24*03ce13f7SAndroid Build Coastguard Worker // The template parameter T is not actually used by the implementation of 25*03ce13f7SAndroid Build Coastguard Worker // ID; instead it is used to prevent implicit casts between identifiers of 26*03ce13f7SAndroid Build Coastguard Worker // different T types. 27*03ce13f7SAndroid Build Coastguard Worker // IDs are typically used as a map key to value of type T. 28*03ce13f7SAndroid Build Coastguard Worker template<typename T> 29*03ce13f7SAndroid Build Coastguard Worker class ID 30*03ce13f7SAndroid Build Coastguard Worker { 31*03ce13f7SAndroid Build Coastguard Worker public: 32*03ce13f7SAndroid Build Coastguard Worker ID() = default; 33*03ce13f7SAndroid Build Coastguard Worker 34*03ce13f7SAndroid Build Coastguard Worker inline ID(int id); 35*03ce13f7SAndroid Build Coastguard Worker inline bool operator==(const ID<T> &rhs) const; 36*03ce13f7SAndroid Build Coastguard Worker inline bool operator!=(const ID<T> &rhs) const; 37*03ce13f7SAndroid Build Coastguard Worker inline bool operator<(const ID<T> &rhs) const; 38*03ce13f7SAndroid Build Coastguard Worker inline ID operator++(); 39*03ce13f7SAndroid Build Coastguard Worker inline ID operator++(int); 40*03ce13f7SAndroid Build Coastguard Worker 41*03ce13f7SAndroid Build Coastguard Worker // value returns the numerical value of the identifier. 42*03ce13f7SAndroid Build Coastguard Worker inline int value() const; 43*03ce13f7SAndroid Build Coastguard Worker 44*03ce13f7SAndroid Build Coastguard Worker private: 45*03ce13f7SAndroid Build Coastguard Worker int id = 0; 46*03ce13f7SAndroid Build Coastguard Worker }; 47*03ce13f7SAndroid Build Coastguard Worker 48*03ce13f7SAndroid Build Coastguard Worker template<typename T> ID(int id)49*03ce13f7SAndroid Build Coastguard WorkerID<T>::ID(int id) 50*03ce13f7SAndroid Build Coastguard Worker : id(id) 51*03ce13f7SAndroid Build Coastguard Worker {} 52*03ce13f7SAndroid Build Coastguard Worker 53*03ce13f7SAndroid Build Coastguard Worker template<typename T> operator ==(const ID<T> & rhs) const54*03ce13f7SAndroid Build Coastguard Workerbool ID<T>::operator==(const ID<T> &rhs) const 55*03ce13f7SAndroid Build Coastguard Worker { 56*03ce13f7SAndroid Build Coastguard Worker return id == rhs.id; 57*03ce13f7SAndroid Build Coastguard Worker } 58*03ce13f7SAndroid Build Coastguard Worker 59*03ce13f7SAndroid Build Coastguard Worker template<typename T> operator !=(const ID<T> & rhs) const60*03ce13f7SAndroid Build Coastguard Workerbool ID<T>::operator!=(const ID<T> &rhs) const 61*03ce13f7SAndroid Build Coastguard Worker { 62*03ce13f7SAndroid Build Coastguard Worker return id != rhs.id; 63*03ce13f7SAndroid Build Coastguard Worker } 64*03ce13f7SAndroid Build Coastguard Worker 65*03ce13f7SAndroid Build Coastguard Worker template<typename T> operator <(const ID<T> & rhs) const66*03ce13f7SAndroid Build Coastguard Workerbool ID<T>::operator<(const ID<T> &rhs) const 67*03ce13f7SAndroid Build Coastguard Worker { 68*03ce13f7SAndroid Build Coastguard Worker return id < rhs.id; 69*03ce13f7SAndroid Build Coastguard Worker } 70*03ce13f7SAndroid Build Coastguard Worker 71*03ce13f7SAndroid Build Coastguard Worker template<typename T> operator ++()72*03ce13f7SAndroid Build Coastguard WorkerID<T> ID<T>::operator++() 73*03ce13f7SAndroid Build Coastguard Worker { 74*03ce13f7SAndroid Build Coastguard Worker return ID(++id); 75*03ce13f7SAndroid Build Coastguard Worker } 76*03ce13f7SAndroid Build Coastguard Worker 77*03ce13f7SAndroid Build Coastguard Worker template<typename T> operator ++(int)78*03ce13f7SAndroid Build Coastguard WorkerID<T> ID<T>::operator++(int) 79*03ce13f7SAndroid Build Coastguard Worker { 80*03ce13f7SAndroid Build Coastguard Worker return ID(id++); 81*03ce13f7SAndroid Build Coastguard Worker } 82*03ce13f7SAndroid Build Coastguard Worker 83*03ce13f7SAndroid Build Coastguard Worker template<typename T> value() const84*03ce13f7SAndroid Build Coastguard Workerint ID<T>::value() const 85*03ce13f7SAndroid Build Coastguard Worker { 86*03ce13f7SAndroid Build Coastguard Worker return id; 87*03ce13f7SAndroid Build Coastguard Worker } 88*03ce13f7SAndroid Build Coastguard Worker 89*03ce13f7SAndroid Build Coastguard Worker } // namespace dbg 90*03ce13f7SAndroid Build Coastguard Worker } // namespace vk 91*03ce13f7SAndroid Build Coastguard Worker 92*03ce13f7SAndroid Build Coastguard Worker namespace std { 93*03ce13f7SAndroid Build Coastguard Worker 94*03ce13f7SAndroid Build Coastguard Worker // std::hash implementation for vk::dbg::ID<T> 95*03ce13f7SAndroid Build Coastguard Worker template<typename T> 96*03ce13f7SAndroid Build Coastguard Worker struct hash<vk::dbg::ID<T> > 97*03ce13f7SAndroid Build Coastguard Worker { operator ()std::hash98*03ce13f7SAndroid Build Coastguard Worker std::size_t operator()(const vk::dbg::ID<T> &id) const noexcept 99*03ce13f7SAndroid Build Coastguard Worker { 100*03ce13f7SAndroid Build Coastguard Worker return std::hash<int>()(id.value()); 101*03ce13f7SAndroid Build Coastguard Worker } 102*03ce13f7SAndroid Build Coastguard Worker }; 103*03ce13f7SAndroid Build Coastguard Worker 104*03ce13f7SAndroid Build Coastguard Worker } // namespace std 105*03ce13f7SAndroid Build Coastguard Worker 106*03ce13f7SAndroid Build Coastguard Worker #endif // VK_DEBUG_ID_HPP_ 107