19fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato/* 29fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * Copyright (C) 2017 The Android Open Source Project 39fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * 49fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 59fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * you may not use this file except in compliance with the License. 69fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * You may obtain a copy of the License at 79fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * 89fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * http://www.apache.org/licenses/LICENSE-2.0 99fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * 109fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * Unless required by applicable law or agreed to in writing, software 119fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 129fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * See the License for the specific language governing permissions and 149fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * limitations under the License. 159fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato */ 169fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 179fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato#pragma once 189fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 199fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h" 209fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 219fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato#include <string> 229fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 239fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace android { 249fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace os { 259fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace statsd { 269fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 279fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratousing std::hash; 289fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratousing std::string; 299fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 309fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato/** 319fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * Uniquely identifies a configuration. 329fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato */ 339fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratoclass ConfigKey { 349fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratopublic: 359fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato ConfigKey(); 369fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato explicit ConfigKey(const ConfigKey& that); 3794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac ConfigKey(int uid, const int64_t& id); 389fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato ~ConfigKey(); 399fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 409fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato inline int GetUid() const { 419fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato return mUid; 429fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato } 4394e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac inline const int64_t& GetId() const { 4494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac return mId; 459fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato } 469fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 479fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato inline bool operator<(const ConfigKey& that) const { 489fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato if (mUid < that.mUid) { 499fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato return true; 509fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato } 519fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato if (mUid > that.mUid) { 529fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato return false; 539fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato } 5494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac return mId < that.mId; 559fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato }; 569fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 579fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato inline bool operator==(const ConfigKey& that) const { 5894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac return mUid == that.mUid && mId == that.mId; 599fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato }; 609fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 619fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato string ToString() const; 629fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 639fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratoprivate: 6494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac int64_t mId; 659fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato int mUid; 669fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato}; 679fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 6894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-macint64_t StrToInt64(const string& str); 6994e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac 709fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato} // namespace statsd 719fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato} // namespace os 729fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato} // namespace android 739fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 749fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato/** 759fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato * A hash function for ConfigKey so it can be used for unordered_map/set. 7687d983cf6f609cf3467d05d92bba30329953fbdbyro * Unfortunately this has to go in std namespace because C++ is fun! 779fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato */ 789fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratonamespace std { 799fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 809fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratousing android::os::statsd::ConfigKey; 819fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 829fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratotemplate <> 839fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratostruct hash<ConfigKey> { 849fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato std::size_t operator()(const ConfigKey& key) const { 8594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac return (7 * key.GetUid()) ^ ((hash<long long>()(key.GetId()))); 869fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato } 879fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato}; 889fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 899fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato} // namespace std 90