当前位置: 首页 > 工具软件 > Androidutils > 使用案例 >

Android Utils 之 Vector 学习笔记(四,完结)—— KeyedVector 与 DefaultKeyedVector 代码分析

彭华皓
2023-12-01

相关文章


KeyedVector

终于来到我关注的 KeyedVector 类了。但实际上具体的逻辑实现部分都已经在前几章看到的 VectorImplSortedVectorImpl 以及 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 是字符串,则比较大小时应是比较字符串大小(即此时 mVectorKEY 的字典序排列)。

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 的成员函数来实现的。


DefaultKeyedVector

这个类其实没有多少内容,它的功能主要是在 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 结构:VectorSortedVectorKeyedVectorDefaultKeyedVector。它们的核心操作的具体实现逻辑,都高度封装在了抽象类 VectorImplSortedVectorImpl 中。

通过分析抽象类的实现代码,我们可以很好地理解 Vector 的内部运作流程,从而对其内存分布、元素排列、操作安全性(比如是否存在越界、溢出)等有一个比较深刻的理解。

当然,还有许多更底层的实现并没有分析到,比如 SharedBuffer 相关操作、TypeHelpers.h 中封装的底层操作等等,我还需要继续找时间阅读代码,好好分析,好好理解这些组件的设计思想。

 类似资料: