这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类。
本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso/
本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso
HashTable
类内部嵌套定义了一个迭代器类Iterator
,这个迭代器类用于循环访问表的成员
。这也是一个抽象类
,但是其有一个静态的方法static Iterator* create(HashTable& hashTable)
;这个方法用于创建一个BasicHashTable::Iterator
对象,并返回其地址。
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 0
virtual Boolean Remove(char const* key) = 0;
virtual void* Lookup(char const* key) const = 0;
// Returns 0 if not found
virtual 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
};
这个就不说了,代码很简单。要注意的是,其创建的是BasicHashTable::Iterator
对象。BasicHashTable::Iterator
是HashTable::Iterator
的派生类。还有,这是一个static
方法。
HashTable::Iterator* HashTable::Iterator::create(HashTable& hashTable) {
// "hashTable" is assumed to be a BasicHashTable
return new BasicHashTable::Iterator((BasicHashTable&)hashTable);
}
我们前面说了HashTable
是一个抽象了,其定义的create
方法是一个静态
方法,实质上是调用的派生类的构造函数来创建的对象并返回。
HashTable* HashTable::create(int keyType) {
return new BasicHashTable(keyType);
}
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;
}