Для реализации fresh и recycle, можно среди других возможных вариантов представить available как стек: fresh будет удалять элемент из стека, а recycle будет помещать элемент в стек. Создадим класс STACK_OF_LINKABLES для этого случая и добавим следующие закрытые компоненты в класс LINKED_LIST (В упражнении У23.1. требуется определить, будет ли корректным появление у функции fresh побочных эффектов.):
available: STACK_OF_LINKABLES fresh (v: ELEMENT_TYPE): LINKABLE is - Новый элемент со значением v, для повторного - использования во вставке do if available.empty then - Создание нового элемента create Result.make (v) else - Повторное использование linkable Result := available.item; Result.put (v); available.remove end end recycle (dead: LINKABLE) is -Возвращает dead в список достижимых элементов. require dead /= Void do available.put (dead) end
Мы можем объявить класс STACK_OF_LINKABLES следующим образом:
class STACK_OF_LINKABLES feature {LINKED_LIST} item: LINKABLE - Элемент в вершине стека empty: BOOLEAN is - нет элементов в стеке? do Result := (item = Void) end put (element: LINKABLE) is - Добавить элемент в вершину стека. require element /= Void do element.put_right (item); item := element end remove is - Удалить последний добавленный элемент. require not empty do item := item.right end end
Представление стека использует все преимущества поля right, присутствующего в каждом элементе LINKABLE, связывая все утилизированные элементы и предоставляя, тем самым, дополнительную память для размещения новых элементов списка LINKED_LIST. Класс LINKABLE должен экспортировать свои компоненты right и put_right в класс STACK_OF_LINKABLES.
Компонент available является атрибутом класса. Это означает, что каждый связный список будет иметь свой собственный стек. Конечно, память можно было бы использовать эффективнее в системе, содержащей несколько списков и единственный стек для всех удаленных элементов. Такая техника однократных функций (once functions), будет представлена позже; применение ее для available означает, что только один экземпляр класса STACK_OF_LINKABLES будет существовать до конца выполнения системы, что означает достижение поставленной цели. ( Упражнение У9.3. и У9.4. Об однократных функциях см. лекцию 18)