这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类。
本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso/
本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso
HashTable抽象哈希表类
HashTable
类内部嵌套定义了一个迭代器类Iterator
,这个迭代器类用于循环访问表的成员
。这也是一个抽象类
,但是其有一个静态的方法static Iterator* create(HashTable& hashTable)
;这个方法用于创建一个BasicHashTable::Iterator
对象,并返回其地址。
HashTable的定义
class HashTable {public:virtual ~HashTable();// The following must be implemented by a particular// implementation (subclass):static HashTable* create(int keyType);virtual void* Add(char const* key, void* value) = 0;// Returns the old value if different, otherwise 0virtual Boolean Remove(char const* key) = 0;virtual void* Lookup(char const* key) const = 0;// Returns 0 if not foundvirtual unsigned numEntries() const = 0;Boolean IsEmpty() const { return numEntries() == 0; }// Used to iterate through the members of the table:
class Iterator {public:// The following must be implemented by a particular// implementation (subclass):static Iterator* create(HashTable& hashTable);virtual ~Iterator();virtual void* next(char const*& key) = 0; // returns 0 if none
protected:Iterator(); // abstract base class};// A shortcut that can be used to successively remove each of// the entries in the table (e.g., so that their values can be// deleted, if they happen to be pointers to allocated memory).void* RemoveNext();protected:HashTable(); // abstract base class
};
迭代器HashTable:: Iterator ::create方法
这个就不说了,代码很简单。要注意的是,其创建的是BasicHashTable::Iterator
对象。BasicHashTable::Iterator
是HashTable::Iterator
的派生类。还有,这是一个static
方法。
HashTable::Iterator* HashTable::Iterator::create(HashTable& hashTable) {// "hashTable" is assumed to be a BasicHashTablereturn new BasicHashTable::Iterator((BasicHashTable&)hashTable);
}
HashTable::create方法
我们前面说了HashTable
是一个抽象了,其定义的create
方法是一个静态
方法,实质上是调用的派生类的构造函数来创建的对象并返回。
HashTable* HashTable::create(int keyType) {return new BasicHashTable(keyType);
}
HashTable::RemoveNext方法
RemoveNext
方法不是纯虚
接口。其先创建了一个绑定到自身的迭代器
,然后获取迭代器当前指向的节点(因为这里刚创建,所以就是第一个),然后将其从哈希表中移除(并销毁)。
void* HashTable::RemoveNext() {Iterator* iter = Iterator::create(*this);char const* key;void* removedValue = iter->next(key);if (removedValue != 0) Remove(key);delete iter;return removedValue;
}