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