Loading include/binder/PersistableBundle.h +14 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #define ANDROID_PERSISTABLE_BUNDLE_H #include <map> #include <set> #include <vector> #include <binder/Parcelable.h> Loading Loading @@ -79,6 +80,19 @@ public: bool getStringVector(const String16& key, std::vector<String16>* out) const; bool getPersistableBundle(const String16& key, PersistableBundle* out) const; /* Getters for all keys for each value type */ std::set<String16> getBooleanKeys() const; std::set<String16> getIntKeys() const; std::set<String16> getLongKeys() const; std::set<String16> getDoubleKeys() const; std::set<String16> getStringKeys() const; std::set<String16> getBooleanVectorKeys() const; std::set<String16> getIntVectorKeys() const; std::set<String16> getLongVectorKeys() const; std::set<String16> getDoubleVectorKeys() const; std::set<String16> getStringVectorKeys() const; std::set<String16> getPersistableBundleKeys() const; friend bool operator==(const PersistableBundle& lhs, const PersistableBundle& rhs) { return (lhs.mBoolMap == rhs.mBoolMap && lhs.mIntMap == rhs.mIntMap && lhs.mLongMap == rhs.mLongMap && lhs.mDoubleMap == rhs.mDoubleMap && Loading libs/binder/PersistableBundle.cpp +68 −11 Original line number Diff line number Diff line Loading @@ -32,6 +32,9 @@ using android::Parcel; using android::sp; using android::status_t; using android::UNEXPECTED_NULL; using std::map; using std::set; using std::vector; enum { // Keep in sync with BUNDLE_MAGIC in frameworks/base/core/java/android/os/BaseBundle.java. Loading @@ -55,12 +58,22 @@ enum { namespace { template <typename T> bool getValue(const android::String16& key, T* out, const std::map<android::String16, T>& map) { bool getValue(const android::String16& key, T* out, const map<android::String16, T>& map) { const auto& it = map.find(key); if (it == map.end()) return false; *out = it->second; return true; } template <typename T> set<android::String16> getKeys(const map<android::String16, T>& map) { if (map.empty()) return set<android::String16>(); set<android::String16> keys; for (const auto& key_value_pair : map) { keys.emplace(key_value_pair.first); } return keys; } } // namespace namespace android { Loading Loading @@ -188,27 +201,27 @@ void PersistableBundle::putString(const String16& key, const String16& value) { mStringMap[key] = value; } void PersistableBundle::putBooleanVector(const String16& key, const std::vector<bool>& value) { void PersistableBundle::putBooleanVector(const String16& key, const vector<bool>& value) { erase(key); mBoolVectorMap[key] = value; } void PersistableBundle::putIntVector(const String16& key, const std::vector<int32_t>& value) { void PersistableBundle::putIntVector(const String16& key, const vector<int32_t>& value) { erase(key); mIntVectorMap[key] = value; } void PersistableBundle::putLongVector(const String16& key, const std::vector<int64_t>& value) { void PersistableBundle::putLongVector(const String16& key, const vector<int64_t>& value) { erase(key); mLongVectorMap[key] = value; } void PersistableBundle::putDoubleVector(const String16& key, const std::vector<double>& value) { void PersistableBundle::putDoubleVector(const String16& key, const vector<double>& value) { erase(key); mDoubleVectorMap[key] = value; } void PersistableBundle::putStringVector(const String16& key, const std::vector<String16>& value) { void PersistableBundle::putStringVector(const String16& key, const vector<String16>& value) { erase(key); mStringVectorMap[key] = value; } Loading Loading @@ -238,23 +251,23 @@ bool PersistableBundle::getString(const String16& key, String16* out) const { return getValue(key, out, mStringMap); } bool PersistableBundle::getBooleanVector(const String16& key, std::vector<bool>* out) const { bool PersistableBundle::getBooleanVector(const String16& key, vector<bool>* out) const { return getValue(key, out, mBoolVectorMap); } bool PersistableBundle::getIntVector(const String16& key, std::vector<int32_t>* out) const { bool PersistableBundle::getIntVector(const String16& key, vector<int32_t>* out) const { return getValue(key, out, mIntVectorMap); } bool PersistableBundle::getLongVector(const String16& key, std::vector<int64_t>* out) const { bool PersistableBundle::getLongVector(const String16& key, vector<int64_t>* out) const { return getValue(key, out, mLongVectorMap); } bool PersistableBundle::getDoubleVector(const String16& key, std::vector<double>* out) const { bool PersistableBundle::getDoubleVector(const String16& key, vector<double>* out) const { return getValue(key, out, mDoubleVectorMap); } bool PersistableBundle::getStringVector(const String16& key, std::vector<String16>* out) const { bool PersistableBundle::getStringVector(const String16& key, vector<String16>* out) const { return getValue(key, out, mStringVectorMap); } Loading @@ -262,6 +275,50 @@ bool PersistableBundle::getPersistableBundle(const String16& key, PersistableBun return getValue(key, out, mPersistableBundleMap); } set<String16> PersistableBundle::getBooleanKeys() const { return getKeys(mBoolMap); } set<String16> PersistableBundle::getIntKeys() const { return getKeys(mIntMap); } set<String16> PersistableBundle::getLongKeys() const { return getKeys(mLongMap); } set<String16> PersistableBundle::getDoubleKeys() const { return getKeys(mDoubleMap); } set<String16> PersistableBundle::getStringKeys() const { return getKeys(mStringMap); } set<String16> PersistableBundle::getBooleanVectorKeys() const { return getKeys(mBoolVectorMap); } set<String16> PersistableBundle::getIntVectorKeys() const { return getKeys(mIntVectorMap); } set<String16> PersistableBundle::getLongVectorKeys() const { return getKeys(mLongVectorMap); } set<String16> PersistableBundle::getDoubleVectorKeys() const { return getKeys(mDoubleVectorMap); } set<String16> PersistableBundle::getStringVectorKeys() const { return getKeys(mStringVectorMap); } set<String16> PersistableBundle::getPersistableBundleKeys() const { return getKeys(mPersistableBundleMap); } status_t PersistableBundle::writeToParcelInner(Parcel* parcel) const { /* * To keep this implementation in sync with writeArrayMapInternal() in Loading Loading
include/binder/PersistableBundle.h +14 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #define ANDROID_PERSISTABLE_BUNDLE_H #include <map> #include <set> #include <vector> #include <binder/Parcelable.h> Loading Loading @@ -79,6 +80,19 @@ public: bool getStringVector(const String16& key, std::vector<String16>* out) const; bool getPersistableBundle(const String16& key, PersistableBundle* out) const; /* Getters for all keys for each value type */ std::set<String16> getBooleanKeys() const; std::set<String16> getIntKeys() const; std::set<String16> getLongKeys() const; std::set<String16> getDoubleKeys() const; std::set<String16> getStringKeys() const; std::set<String16> getBooleanVectorKeys() const; std::set<String16> getIntVectorKeys() const; std::set<String16> getLongVectorKeys() const; std::set<String16> getDoubleVectorKeys() const; std::set<String16> getStringVectorKeys() const; std::set<String16> getPersistableBundleKeys() const; friend bool operator==(const PersistableBundle& lhs, const PersistableBundle& rhs) { return (lhs.mBoolMap == rhs.mBoolMap && lhs.mIntMap == rhs.mIntMap && lhs.mLongMap == rhs.mLongMap && lhs.mDoubleMap == rhs.mDoubleMap && Loading
libs/binder/PersistableBundle.cpp +68 −11 Original line number Diff line number Diff line Loading @@ -32,6 +32,9 @@ using android::Parcel; using android::sp; using android::status_t; using android::UNEXPECTED_NULL; using std::map; using std::set; using std::vector; enum { // Keep in sync with BUNDLE_MAGIC in frameworks/base/core/java/android/os/BaseBundle.java. Loading @@ -55,12 +58,22 @@ enum { namespace { template <typename T> bool getValue(const android::String16& key, T* out, const std::map<android::String16, T>& map) { bool getValue(const android::String16& key, T* out, const map<android::String16, T>& map) { const auto& it = map.find(key); if (it == map.end()) return false; *out = it->second; return true; } template <typename T> set<android::String16> getKeys(const map<android::String16, T>& map) { if (map.empty()) return set<android::String16>(); set<android::String16> keys; for (const auto& key_value_pair : map) { keys.emplace(key_value_pair.first); } return keys; } } // namespace namespace android { Loading Loading @@ -188,27 +201,27 @@ void PersistableBundle::putString(const String16& key, const String16& value) { mStringMap[key] = value; } void PersistableBundle::putBooleanVector(const String16& key, const std::vector<bool>& value) { void PersistableBundle::putBooleanVector(const String16& key, const vector<bool>& value) { erase(key); mBoolVectorMap[key] = value; } void PersistableBundle::putIntVector(const String16& key, const std::vector<int32_t>& value) { void PersistableBundle::putIntVector(const String16& key, const vector<int32_t>& value) { erase(key); mIntVectorMap[key] = value; } void PersistableBundle::putLongVector(const String16& key, const std::vector<int64_t>& value) { void PersistableBundle::putLongVector(const String16& key, const vector<int64_t>& value) { erase(key); mLongVectorMap[key] = value; } void PersistableBundle::putDoubleVector(const String16& key, const std::vector<double>& value) { void PersistableBundle::putDoubleVector(const String16& key, const vector<double>& value) { erase(key); mDoubleVectorMap[key] = value; } void PersistableBundle::putStringVector(const String16& key, const std::vector<String16>& value) { void PersistableBundle::putStringVector(const String16& key, const vector<String16>& value) { erase(key); mStringVectorMap[key] = value; } Loading Loading @@ -238,23 +251,23 @@ bool PersistableBundle::getString(const String16& key, String16* out) const { return getValue(key, out, mStringMap); } bool PersistableBundle::getBooleanVector(const String16& key, std::vector<bool>* out) const { bool PersistableBundle::getBooleanVector(const String16& key, vector<bool>* out) const { return getValue(key, out, mBoolVectorMap); } bool PersistableBundle::getIntVector(const String16& key, std::vector<int32_t>* out) const { bool PersistableBundle::getIntVector(const String16& key, vector<int32_t>* out) const { return getValue(key, out, mIntVectorMap); } bool PersistableBundle::getLongVector(const String16& key, std::vector<int64_t>* out) const { bool PersistableBundle::getLongVector(const String16& key, vector<int64_t>* out) const { return getValue(key, out, mLongVectorMap); } bool PersistableBundle::getDoubleVector(const String16& key, std::vector<double>* out) const { bool PersistableBundle::getDoubleVector(const String16& key, vector<double>* out) const { return getValue(key, out, mDoubleVectorMap); } bool PersistableBundle::getStringVector(const String16& key, std::vector<String16>* out) const { bool PersistableBundle::getStringVector(const String16& key, vector<String16>* out) const { return getValue(key, out, mStringVectorMap); } Loading @@ -262,6 +275,50 @@ bool PersistableBundle::getPersistableBundle(const String16& key, PersistableBun return getValue(key, out, mPersistableBundleMap); } set<String16> PersistableBundle::getBooleanKeys() const { return getKeys(mBoolMap); } set<String16> PersistableBundle::getIntKeys() const { return getKeys(mIntMap); } set<String16> PersistableBundle::getLongKeys() const { return getKeys(mLongMap); } set<String16> PersistableBundle::getDoubleKeys() const { return getKeys(mDoubleMap); } set<String16> PersistableBundle::getStringKeys() const { return getKeys(mStringMap); } set<String16> PersistableBundle::getBooleanVectorKeys() const { return getKeys(mBoolVectorMap); } set<String16> PersistableBundle::getIntVectorKeys() const { return getKeys(mIntVectorMap); } set<String16> PersistableBundle::getLongVectorKeys() const { return getKeys(mLongVectorMap); } set<String16> PersistableBundle::getDoubleVectorKeys() const { return getKeys(mDoubleVectorMap); } set<String16> PersistableBundle::getStringVectorKeys() const { return getKeys(mStringVectorMap); } set<String16> PersistableBundle::getPersistableBundleKeys() const { return getKeys(mPersistableBundleMap); } status_t PersistableBundle::writeToParcelInner(Parcel* parcel) const { /* * To keep this implementation in sync with writeArrayMapInternal() in Loading