4.8. ГЕНЕРАТОРЫ

Вычисление генератора создает объект и вырабатывает ссылочное значение, которое указывает на этот объект.

генератор ::= new указатель-подтипа| new квалифицированное - выражение

Тип порожденного генератором объекта — это базовый тип обозначения типа, заданного либо в указании подтипа, либо в квалифицированном выражении. Для генератора с квалифицированным выражением это выражение задает начальное значение создаваемого объекта. Тип ссылочного значения, вырабатываемого генератором, должен быть определимым только из контекста с учетом того, что это значение является ссылкой на указанный в генераторе тип.

Ограничение индекса и ограничение дискриминанта являются единственными допустимыми формами ограничения в указателе подтипа генератора. Если в генераторе есть указание подтипа и если порождаемый объект имеет индексируемый тип или тип с дискриминантами, которые не содержат выражений по умолчанию, то указание подтипа должно либо обозначать ограниченный подтип, либо содержать явное ограничение индекса или дискриминанта.

Создаваемый объект индексируемого типа или типа с дискриминантами всегда ограничен. Для генератора с указанием подтипа создаваемый объект ограничен либо этим подтипом, либо значениями дискриминанта по умолчанию. Для генератора с квалифицированным выражением создаваемый объект ограничен границами или дискриминантами начального значения. Для других типов создаваемый объект имеет подтип, определенный указанием подтипа в определении ссылочного типа.

При вычислении генератора сначала производится предвыполнение указания подтипа или вычисление квалифицированного выражения. Затем создается новый объект. Далее осуществляется инициализация, как для описанного объекта (см. 3.2.1): явно — для квалифицированного выражения, неявно — для указания подтипа. Наконец, возвращается ссылочное значение, указывающее на созданный объект.

Реализация должна гарантировать сохранение объекта, созданного при вычислении генератора, до тех пор, пока объект, или хотя бы одна из его подкомпонент, доступен непосредственно или косвенно, т. е. пока он может быть обозначен некоторым именем. Кроме того, если объект или одна из его подкомпонент принадлежит задачному типу, он считается доступным, пока не завершена эта задача. Реализация может (но не обязана) освобождать память, занятую объектом, созданным генератором, как только этот объект становится недоступным.

В случаях когда требуется более точное управление распределением памяти под указанные значениями ссылочного типа объекты, оно может быть обеспечено следующими средствами:

а. Общий объем памяти, доступный для набора объектов ссылочного типа, может быть установлен с помощью спецификатора длины (см. 13.2).

б. Прагма CONTROLLED указывает реализации на то, что для объектов, указанных значениями ссылочного типа, автоматическое возвращение памяти производиться не должно, исключая случаи выхода из самого вложенного оператора блока, тела подпрограммы или тела задачи, содержащих описание этого ссылочного типа, или выхода из главной программы.

pragma CONTROLLED (простое-имя-ссылочного-типа);

Эта прагма для данного ссылочного типа допустима в тех же местах, что и спецификатор представления этого типа (см. 13.1).

в. Явного освобождения памяти, занимаемой объектом, указанным ссылочным значением, можно достичь вызовом процедуры, полученной настройкой предопределенной библиотечной процедуры UNCHECKED_DEALLOCATION (см. 13.10.1). /

При исчерпании памяти генератором возбуждается исключение STORAGE_ERROR. Заметим также, что исключение CONSTRAINT_ERROR может быть возбуждено при вычислении квалифицированного выражения, во время предвыполнения указания подтипа или при инициализации.

Примеры (ссылочных типов, описанных в разд. 3.8):

new CELL'(0, null, null)                -- явная инициализация new CELL'(VALUE => 0, SUCC => null, PRED => null) -- явная инициализацияnew CELL                                -- нет инициализацииnew MATRIX(1 .. 10, 1 .. 20)            -- даны только границы new MATRlX'(1 .. 10 => (1 .. 20 => 0.0)) -— явная инициализацияnew BUFFER(100) -- дан только дискриминант new BUFPER'(SIZE => 80, POS => 0, VALUE => (1 .. 80 => 'А')) -- явная инициализация

Ссылки: библиотечный модуль 10.1, возбуждение исключений 11, вычисление квалифицированного выражения 4.6, главная программа 10.1, граница массива 3.6.1, дискриминант 3.3, завершенная задача 9.4, задачный тип 9.2, имя 4.1, индексируемый тип 3.6, инициализация 3.2.1, исключение CONSTRAINT_ERROR 11.1, исключение STORAGE_ERROR 11.1, квалифицированное выражение 4.7, конкретизация 12.3, контекст разрешения совмещения 8.7, набор 3.8, настраиваемая процедура 12.1, начальное значение 3.2.1, обозначение типа 3.3.2, объект 3.2.1, ограничение 3.3, ограничение дискриминанта 3.7.2, ограничение индекса 3.6.1, ограниченный подтип 3.3, оператор блока 5.6, описание объекта 3.2.1, описание типа 3.3.1, определение ссылочного типа 3.8, подкомпонента 3.3, подтип 3.3, прагма 2.8, предвыполнение 3.9, производный тип 3.4, простое имя 4.1, процедура 6, спецификатор длины 13.2, спецификатор представления 13.1, ссылочное значение 3.8, ссылочный тип 3.8, тело задачи 9.1, тело подпрограммы 6.7, тип 3.3, тип с дискриминантами 3.3, указание подтипа 3.3.2, указывать 3.8.