1*35238bceSAndroid Build Coastguard Worker #ifndef _DEMODULARCOUNTER_HPP 2*35238bceSAndroid Build Coastguard Worker #define _DEMODULARCOUNTER_HPP 3*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * drawElements C++ Base Library 5*35238bceSAndroid Build Coastguard Worker * ----------------------------- 6*35238bceSAndroid Build Coastguard Worker * 7*35238bceSAndroid Build Coastguard Worker * Copyright 2023 Valve Corporation. 8*35238bceSAndroid Build Coastguard Worker * 9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker * 13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker * 15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker * limitations under the License. 20*35238bceSAndroid Build Coastguard Worker * 21*35238bceSAndroid Build Coastguard Worker *//*! 22*35238bceSAndroid Build Coastguard Worker * \file 23*35238bceSAndroid Build Coastguard Worker * \brief Modular counter helper class. 24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker #include <type_traits> 27*35238bceSAndroid Build Coastguard Worker #include <cstdint> 28*35238bceSAndroid Build Coastguard Worker 29*35238bceSAndroid Build Coastguard Worker namespace de 30*35238bceSAndroid Build Coastguard Worker { 31*35238bceSAndroid Build Coastguard Worker 32*35238bceSAndroid Build Coastguard Worker template <typename T> 33*35238bceSAndroid Build Coastguard Worker class ModularCounter 34*35238bceSAndroid Build Coastguard Worker { 35*35238bceSAndroid Build Coastguard Worker static_assert(std::is_unsigned<T>::value, "Invalid underlying type"); 36*35238bceSAndroid Build Coastguard Worker 37*35238bceSAndroid Build Coastguard Worker public: 38*35238bceSAndroid Build Coastguard Worker typedef T value_type; 39*35238bceSAndroid Build Coastguard Worker ModularCounter(T period,T initialValue=T{0})40*35238bceSAndroid Build Coastguard Worker explicit ModularCounter(T period, T initialValue = T{0}) : m_period(period), m_value(initialValue) 41*35238bceSAndroid Build Coastguard Worker { 42*35238bceSAndroid Build Coastguard Worker } 43*35238bceSAndroid Build Coastguard Worker operator ++()44*35238bceSAndroid Build Coastguard Worker ModularCounter &operator++() 45*35238bceSAndroid Build Coastguard Worker { 46*35238bceSAndroid Build Coastguard Worker m_value = ((m_value + T{1}) % m_period); 47*35238bceSAndroid Build Coastguard Worker return *this; 48*35238bceSAndroid Build Coastguard Worker } operator --()49*35238bceSAndroid Build Coastguard Worker ModularCounter &operator--() 50*35238bceSAndroid Build Coastguard Worker { 51*35238bceSAndroid Build Coastguard Worker m_value = ((m_value - T{1}) % m_period); 52*35238bceSAndroid Build Coastguard Worker return *this; 53*35238bceSAndroid Build Coastguard Worker } operator ++(int)54*35238bceSAndroid Build Coastguard Worker ModularCounter operator++(int) 55*35238bceSAndroid Build Coastguard Worker { 56*35238bceSAndroid Build Coastguard Worker ModularCounter ret(*this); 57*35238bceSAndroid Build Coastguard Worker ++(*this); 58*35238bceSAndroid Build Coastguard Worker return ret; 59*35238bceSAndroid Build Coastguard Worker } operator --(int)60*35238bceSAndroid Build Coastguard Worker ModularCounter operator--(int) 61*35238bceSAndroid Build Coastguard Worker { 62*35238bceSAndroid Build Coastguard Worker ModularCounter ret(*this); 63*35238bceSAndroid Build Coastguard Worker --(*this); 64*35238bceSAndroid Build Coastguard Worker return ret; 65*35238bceSAndroid Build Coastguard Worker } operator T(void)66*35238bceSAndroid Build Coastguard Worker operator T(void) 67*35238bceSAndroid Build Coastguard Worker { 68*35238bceSAndroid Build Coastguard Worker return m_value; 69*35238bceSAndroid Build Coastguard Worker } 70*35238bceSAndroid Build Coastguard Worker 71*35238bceSAndroid Build Coastguard Worker protected: 72*35238bceSAndroid Build Coastguard Worker const T m_period; 73*35238bceSAndroid Build Coastguard Worker T m_value; 74*35238bceSAndroid Build Coastguard Worker }; 75*35238bceSAndroid Build Coastguard Worker 76*35238bceSAndroid Build Coastguard Worker using ModCounter64 = ModularCounter<uint64_t>; 77*35238bceSAndroid Build Coastguard Worker using ModCounter32 = ModularCounter<uint32_t>; 78*35238bceSAndroid Build Coastguard Worker 79*35238bceSAndroid Build Coastguard Worker } // namespace de 80*35238bceSAndroid Build Coastguard Worker 81*35238bceSAndroid Build Coastguard Worker #endif // _DEMODULARCOUNTER_HPP 82