132
bool At(void* key, void*& value);
void RemoveEntry(void* key);
typedef void* Slot;
// Настоящее объявление надежно спрятано
Slot
First();
//
Возвращает Slot для перебора
//
Эквивалент нашей функции “Peek”
bool GetCurrent(Slot slot, void*& key, void*& value);
//
Эквивалент нашей функции “Next”
bool GetNext(Slot& slot, void*& key, void*& value);
};
Функция
AddEntry()
заносит в словарь новое значение с заданным ключом.
Если ключ уже
существует для другого значения, значение заменяется новым. Функция
At()
возвращает логический
код, который показывает, присутствует ли ключ в словаре;
если присутствует, функция возвращает
true
и
value
(значение, соответствующее данному ключу). Функция
RemoveEntry()
удаляет ключ и
связанное с ним значение. Функция
First()
возвращает
пассивный итератор, направленный таким
образом, чтобы первый вызов
GetNext()
возвратил первый элемент словаря. Функция
GetCurrent()
возвращает пару ключ/значение, находящуюся в текущей позиции
Slot
. Функция
GetNext()
возвращает пару ключ/значение и перемещает итератор к следующему элементу. Единственное
отличие между этими функциями заключается в перемещении логической позиции после получения
объекта.
Мы воспользуемся словарем следующим образом: ключом будет объект, хранящийся в нашем наборе,
а значением этого ключа — журнал вставок/удалений для данного объекта.
Класс журнала
Ниже приведен
открытый интерфейс класса, в котором хранится история вставок/удалений для
объекта. Этот класс использует рассмотренный выше класс Timestamp — он образует вторую
составляющую пар ключ/значение, хранящихся в словаре. В реализации нет ничего интересного,
поэтому я ее пропускаю.
class History {
public:
History(); //
Пустой журнал
void
Insert(Timestamp);
//
Вставка в заданное время
void
Remove(Timestamp);
//
Удаление в заданное время
bool
Exists(Timestamp);
//
В заданное время
bool
Exists();
//
В настоящий момент
};
Функция
Exists(Timestamp)
возвращает
true
, если в заданное время
последней операцией была
вставка, и
false
— если последней операцией было удаление или до этого времени вообще не было
операций. Безаргументная функция
Exists()
является синонимом для
Exists(Timestamp)
с очень
большим значением времени — то есть до настоящего момента.
Абстрактный базовый класс
Класс набора делится на две части: абстрактный базовый класс, работающий с
void*
, и производный
параметризованный класс, в который добавлена безопасность типов. Абстрактный базовый класс
выглядит так:
// В файле Set.h
class SetBase : private Dictionary {
friend class InternalIterator;
protected:
SetBase(); //
Чтобы класс был абстрактным