Лабораторная 1. Шаблоны. Интерфейсы. Потоковый ввод-вывод.

Разработать шаблон классов TTemplateQueue для обработки очередей на базе циклических массивов. Шаблонизированный тип данных должен использоваться в качестве типа элемента очереди. Шаблон должен реализовывать интерфейс IEnumerable для поддержки языковой конструкции for .. in . Для использования конструкции for .. in следует разработать промежуточный класс, реализующий интерфейс IEnumerator (данный интерфейс предполагает перебор элементов класса TObject, что следует учитывать либо в механизмах хранения содержимого очереди, либо возвращать указатели на элементы очереди, приведенные к типу TObject). Подробнее об итераторах: здесь и здесь. Шаблон должен предусматривать хранение своего содержимого в потоке. Содержимое класса:

    // создание-уничтожение
    Constructor Create(maxcount:integer);
    Destructor Destroy;
    // шаблонизированные методы
    procedure put ...;
    function get ...;
    // обычные методы
    function empty:boolean;
    function full:boolean;
    // работа с потоком
    Constructor Create(stream:tstream);
    Procedure Store(stream:TStream);
    Procedure Load(stream:TStream);
    // реализация интерфейса IEnumerator
    ...

Задание

Создать шаблон и проверить его корректность следующим образом:
  1. Специализировать шаблон для типов integer, extended, string. Проверить работоспособность шаблонизированных и обычных методов каждой специализации.
  2. Проверить корректность работы с потоком, сохранив в одном потоке последовательно несколько различных специализаций. Корректно считать из потока ранее сохраненные специализации, проверить целостность данных.
  3. Проверить корректность работы методов интерфейса IEnumerator как конструкцией for .. in, так и методами интерфейса.