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

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


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

Группа: Пользователи
Сообщений: 194
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: bu_gen@octagram.name
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


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

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

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


В других своих проектах, которые заточены под GNAT, я объявил константу для Form и активно этим пользуюсь, но сейчас не готов делать на это ставку.

Вот, например, gprbuild, помню, перестаёт работать, если где-то в пути есть кириллица. Где-то как UTF-8 всё прочиталось, а где-то забыли, и в другое API всё пошло, где как ANSI интерпретация. Если не размежеваться с однобайтовыми кодировками, этот раздрай так и будет. Уж либо не делать, либо делать как следует.

Сейчас как следует делается наше API, а реализация не делается никак. 32битные символы, которыми задаётся имя файла, нужно через mod 256 приводить к номеру символа Character. Это моё текущее понимание «никак»


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

Сообщений в этой теме
OCTAGRAM   Двоичные потоки   11.09.2019 17:31
Sergey Dukov   Задачу в первом приближении понял. Займусь несколь…   11.09.2019 17:53
Sergey Dukov   Раньше мне вроде бы было всё понятно. Сейчас у мен…   21.10.2019 13:03
OCTAGRAM   Раньше мне вроде бы было всё понятно. Сейчас у мен…   25.10.2019 0:12
Sergey Dukov   Насколько я понял, задача такова: Упрятать значени…   25.10.2019 0:57
OCTAGRAM   Насколько я понял, задача такова: Упрятать значен…   25.10.2019 4:03
Sergey Dukov   Я тут подумал, что на будущее стоит ввести в пакет…   25.10.2019 5:48
Sergey Dukov   Я проанализировал открытие файла потока в реализац…   25.10.2019 10:42
Sergey Dukov   Я реализовал задание в пакете "File_Stream_IO…   27.10.2019 1:30
OCTAGRAM   UTF-16 в рантаймах, сейчас мне кажется, не надо Л…   31.10.2019 9:15
Sergey Dukov   Я уже говорил, что с UTF-16 не стоит заморачиватьс…   31.10.2019 9:34
OCTAGRAM   В других своих проектах, которые заточены под GNAT…   31.10.2019 9:44
Sergey Dukov   Я подключил API из нашего пакета Unbounded_Array и…   31.10.2019 9:53


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

 





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