终于来到我关注的 KeyedVector
类了。但实际上具体的逻辑实现部分都已经在前几章看到的 VectorImpl
、SortedVectorImpl
以及 SortedVector
中搞定了,这里只是调用了它们提供的接口来实现相应的操作。
文件路径:system\core\libutils\include\utils\KeyedVector.h
这里也不需要太多分析,因为都是一些基本操作(注意有个 isIdenticalTo
函数,用于判断另一个 Vector 和当前的 Vector 是否一样,即同首地址)。
第 64 行,声明了 SortedVector
类型的内部变量 mVector
,并且将其元素类型设置为键值对 key_value_pair_t<KEY, VALUE>
。而对 key_value_pair_t
指针取值时,返回的应该是 KEY
的值,如果 KEY
是字符串,则比较大小时应是比较字符串大小(即此时 mVector
按 KEY
的字典序排列)。
template <typename KEY, typename VALUE>
class KeyedVector
{
public:
typedef KEY key_type;
typedef VALUE value_type;
inline KeyedVector();
/*
* empty the vector
*/
inline void clear() { mVector.clear(); }
/*!
* vector stats
*/
//! returns number of items in the vector
inline size_t size() const { return mVector.size(); }
//! returns whether or not the vector is empty
inline bool isEmpty() const { return mVector.isEmpty(); }
//! returns how many items can be stored without reallocating the backing store
inline size_t capacity() const { return mVector.capacity(); }
//! sets the capacity. capacity can never be reduced less than size()
inline ssize_t setCapacity(size_t size) { return mVector.setCapacity(size); }
// returns true if the arguments is known to be identical to this vector
inline bool isIdenticalTo(const KeyedVector& rhs) const;
/*!
* accessors
*/
const VALUE& valueFor(const KEY& key) const;
const VALUE& valueAt(size_t index) const;
const KEY& keyAt(size_t index) const;
ssize_t indexOfKey(const KEY& key) const;
const VALUE& operator[] (size_t index) const;
/*!
* modifying the array
*/
VALUE& editValueFor(const KEY& key);
VALUE& editValueAt(size_t index);
/*!
* add/insert/replace items
*/
ssize_t add(const KEY& key, const VALUE& item);
ssize_t replaceValueFor(const KEY& key, const VALUE& item);
ssize_t replaceValueAt(size_t index, const VALUE& item);
/*!
* remove items
*/
ssize_t removeItem(const KEY& key);
ssize_t removeItemsAt(size_t index, size_t count = 1);
private:
SortedVector< key_value_pair_t<KEY, VALUE> > mVector;
};
文件路径:system\core\libutils\include\utils\KeyedVector.h
具体实现部分没有什么值得关注的地方,都是直接调用 mVector
的成员函数来实现的。
这个类其实没有多少内容,它的功能主要是在 KeyedVector
的基础上,设定了一个默认值。当 Vector 中没有相应的 KEY
时,返回的结果就会是该默认值。
文件路径:system\core\libutils\include\utils\KeyedVector.h
第 9 行中定义了一个类型为 VALUE
的默认值,当无 KEY
对应的键值对存在时,返回 mDefault
。
template <typename KEY, typename VALUE>
class DefaultKeyedVector : public KeyedVector<KEY, VALUE>
{
public:
inline DefaultKeyedVector(const VALUE& defValue = VALUE());
const VALUE& valueFor(const KEY& key) const;
private:
VALUE mDefault;
};
文件路径:system\core\libutils\include\utils\KeyedVector.h
template<typename KEY, typename VALUE> inline
const VALUE& DefaultKeyedVector<KEY,VALUE>::valueFor(const KEY& key) const {
ssize_t i = this->indexOfKey(key);
return i >= 0 ? KeyedVector<KEY,VALUE>::valueAt(i) : mDefault;
}
Android Utils 中内置了四种可用的 Vector 结构:Vector
,SortedVector
,KeyedVector
,DefaultKeyedVector
。它们的核心操作的具体实现逻辑,都高度封装在了抽象类 VectorImpl
与 SortedVectorImpl
中。
通过分析抽象类的实现代码,我们可以很好地理解 Vector 的内部运作流程,从而对其内存分布、元素排列、操作安全性(比如是否存在越界、溢出)等有一个比较深刻的理解。
当然,还有许多更底层的实现并没有分析到,比如 SharedBuffer
相关操作、TypeHelpers.h
中封装的底层操作等等,我还需要继续找时间阅读代码,好好分析,好好理解这些组件的设计思想。