1*38e8c45fSAndroid Build Coastguard Worker /* 2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project 3*38e8c45fSAndroid Build Coastguard Worker * Android BPF library - public API 4*38e8c45fSAndroid Build Coastguard Worker * 5*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 8*38e8c45fSAndroid Build Coastguard Worker * 9*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*38e8c45fSAndroid Build Coastguard Worker * 11*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*38e8c45fSAndroid Build Coastguard Worker * limitations under the License. 16*38e8c45fSAndroid Build Coastguard Worker */ 17*38e8c45fSAndroid Build Coastguard Worker 18*38e8c45fSAndroid Build Coastguard Worker #pragma once 19*38e8c45fSAndroid Build Coastguard Worker 20*38e8c45fSAndroid Build Coastguard Worker #include <vector> 21*38e8c45fSAndroid Build Coastguard Worker #include "MultiStateCounter.h" 22*38e8c45fSAndroid Build Coastguard Worker 23*38e8c45fSAndroid Build Coastguard Worker namespace android { 24*38e8c45fSAndroid Build Coastguard Worker namespace battery { 25*38e8c45fSAndroid Build Coastguard Worker 26*38e8c45fSAndroid Build Coastguard Worker /** 27*38e8c45fSAndroid Build Coastguard Worker * Wrapper for an array of uint64's. 28*38e8c45fSAndroid Build Coastguard Worker */ 29*38e8c45fSAndroid Build Coastguard Worker class Uint64Array { 30*38e8c45fSAndroid Build Coastguard Worker protected: 31*38e8c45fSAndroid Build Coastguard Worker size_t mSize; 32*38e8c45fSAndroid Build Coastguard Worker 33*38e8c45fSAndroid Build Coastguard Worker public: Uint64Array()34*38e8c45fSAndroid Build Coastguard Worker Uint64Array() : Uint64Array(0) {} 35*38e8c45fSAndroid Build Coastguard Worker Uint64Array(size_t size)36*38e8c45fSAndroid Build Coastguard Worker Uint64Array(size_t size) : mSize(size) {} 37*38e8c45fSAndroid Build Coastguard Worker ~Uint64Array()38*38e8c45fSAndroid Build Coastguard Worker virtual ~Uint64Array() {} 39*38e8c45fSAndroid Build Coastguard Worker size()40*38e8c45fSAndroid Build Coastguard Worker size_t size() const { return mSize; } 41*38e8c45fSAndroid Build Coastguard Worker 42*38e8c45fSAndroid Build Coastguard Worker /** 43*38e8c45fSAndroid Build Coastguard Worker * Returns the wrapped array. 44*38e8c45fSAndroid Build Coastguard Worker * 45*38e8c45fSAndroid Build Coastguard Worker * Nullable! Null should be interpreted the same as an array of zeros 46*38e8c45fSAndroid Build Coastguard Worker */ data()47*38e8c45fSAndroid Build Coastguard Worker virtual const uint64_t *data() const { return nullptr; } 48*38e8c45fSAndroid Build Coastguard Worker 49*38e8c45fSAndroid Build Coastguard Worker friend std::ostream &operator<<(std::ostream &os, const Uint64Array &v); 50*38e8c45fSAndroid Build Coastguard Worker 51*38e8c45fSAndroid Build Coastguard Worker // Test API 52*38e8c45fSAndroid Build Coastguard Worker bool operator==(const Uint64Array &other) const; 53*38e8c45fSAndroid Build Coastguard Worker }; 54*38e8c45fSAndroid Build Coastguard Worker 55*38e8c45fSAndroid Build Coastguard Worker /** 56*38e8c45fSAndroid Build Coastguard Worker * Mutable version of Uint64Array. 57*38e8c45fSAndroid Build Coastguard Worker */ 58*38e8c45fSAndroid Build Coastguard Worker class Uint64ArrayRW: public Uint64Array { 59*38e8c45fSAndroid Build Coastguard Worker uint64_t* mData; 60*38e8c45fSAndroid Build Coastguard Worker 61*38e8c45fSAndroid Build Coastguard Worker public: Uint64ArrayRW()62*38e8c45fSAndroid Build Coastguard Worker Uint64ArrayRW() : Uint64ArrayRW(0) {} 63*38e8c45fSAndroid Build Coastguard Worker Uint64ArrayRW(size_t size)64*38e8c45fSAndroid Build Coastguard Worker Uint64ArrayRW(size_t size) : Uint64Array(size), mData(nullptr) {} 65*38e8c45fSAndroid Build Coastguard Worker 66*38e8c45fSAndroid Build Coastguard Worker Uint64ArrayRW(const Uint64Array ©); 67*38e8c45fSAndroid Build Coastguard Worker 68*38e8c45fSAndroid Build Coastguard Worker // Need an explicit copy constructor. In the initialization context C++ does not understand that 69*38e8c45fSAndroid Build Coastguard Worker // a Uint64ArrayRW is a Uint64Array. Uint64ArrayRW(const Uint64ArrayRW & copy)70*38e8c45fSAndroid Build Coastguard Worker Uint64ArrayRW(const Uint64ArrayRW ©) : Uint64ArrayRW((const Uint64Array &) copy) {} 71*38e8c45fSAndroid Build Coastguard Worker 72*38e8c45fSAndroid Build Coastguard Worker // Test API 73*38e8c45fSAndroid Build Coastguard Worker Uint64ArrayRW(std::initializer_list<uint64_t> init); 74*38e8c45fSAndroid Build Coastguard Worker ~Uint64ArrayRW()75*38e8c45fSAndroid Build Coastguard Worker ~Uint64ArrayRW() override { delete[] mData; } 76*38e8c45fSAndroid Build Coastguard Worker data()77*38e8c45fSAndroid Build Coastguard Worker const uint64_t *data() const override { return mData; } 78*38e8c45fSAndroid Build Coastguard Worker 79*38e8c45fSAndroid Build Coastguard Worker // NonNull. Will initialize the wrapped array if it is null. 80*38e8c45fSAndroid Build Coastguard Worker uint64_t *dataRW(); 81*38e8c45fSAndroid Build Coastguard Worker 82*38e8c45fSAndroid Build Coastguard Worker Uint64ArrayRW &operator=(const Uint64Array &t); 83*38e8c45fSAndroid Build Coastguard Worker }; 84*38e8c45fSAndroid Build Coastguard Worker 85*38e8c45fSAndroid Build Coastguard Worker typedef MultiStateCounter<Uint64ArrayRW, Uint64Array> LongArrayMultiStateCounter; 86*38e8c45fSAndroid Build Coastguard Worker 87*38e8c45fSAndroid Build Coastguard Worker } // namespace battery 88*38e8c45fSAndroid Build Coastguard Worker } // namespace android 89