IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Двоичные потоки, На будущее
сообщение
Сообщение #1


Большевик–концептуал
***

Группа: Пользователи
Сообщений: 175
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: octagram@jabber.ru
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  1  +


GNAT -gnat95

Используя механизм сильных ссылок, реализовать потоки



За основу берётся пакет Ada.Streams. Более конкретно, оттуда импортируются типы. И по аналогии с теми методами делаются методы здесь.

Аналогично Sample_Reference, делаются два типа. Один — для наследования, Root_Stream_Referenced. Другой — обёртка Root_Stream для применения в будущих пакетах.

Для интеграции с Адой в одну сторону делается Ada_Stream, обёртка-наследник стандартного Ada.Streams.Root_Stream_Type. Обёртка не реализует по второму разу Root_Stream, а содержит её в публично доступном поле и просто делегирует вызовы методов.

В обратную сторону в общем случае не получится, и делается только один частный случай, File_Stream_Referenced, содержащий Ada.Streams.Stream_IO.File_Type.

Как и всегда при использовании механизма сильных ссылок, делаются попарно два типа, для динамической памяти File_Stream_Referenced и обёртка File_Stream. API изменяется.

    procedure Create (File : in out File_Type;
Mode : in File_Mode := Out_File;
Name : in String := "";
Form : in String := "");


Create превращается в функцию, возвращающую сильную ссылку. Form убирается. Тип Name заменяется на String_32. Можно объявить subtype String_32 is Wide_String, чтоб собиралось. Wide_String приводится к String конструкциями вида Character'Val (Unsigned_8'Mod (Character_32'Pos (Element))). Работать, конечно, с Юникодом оно нормально так не будет, но API правильное.

Аналогично с Open.

Delete не нужен. Close в явном виде не нужен, а неявно он вызывается из Finalize после проверки Is_Open. В Finalize нужно также вызвать родительский Finalize.

Унаследованные Read и Write переопределяются.

Функция Stream выбрасывается. Read и Write реализуются без неё, а если нужен адский поток, то обёртка для этого уже сделана выше.

function Name приводится к String_32 дубовым способом, как и в Create.

function Form выбрасывается.



Задача мне: надо дать заглушки для поддержки Ada 2005+ фич в AdaMagic. Я писал такое, но не под рукой сейчас


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Сергей Дюков
Skype: sergey.dukov54
Ада: Разработчик
Компонентный Паскаль: Сторонник

Репутация: -  0  +



Задачу в первом приближении понял. Займусь несколько позже.
Сейчас занимаюсь векторами. К стати, в АДА2012 вектора могут работать с потоками. Реализовать эту функциональность для наших векторов?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.09.2019 20:52
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name