OberonCore
https://forum.oberoncore.ru/

Классы-контейнеры для A2 с функциональностью C++ STL
https://forum.oberoncore.ru/viewtopic.php?f=22&t=3863
Страница 1 из 1

Автор:  Ярослав Романченко [ Среда, 29 Февраль, 2012 14:45 ]
Заголовок сообщения:  Классы-контейнеры для A2 с функциональностью C++ STL

Вот, в процессе портирования алгоритмов с С++, написал контейнеры для А2 :)
http://sage.com.ua/ru.shtml?e1l5

Автор:  Madzi [ Воскресенье, 04 Март, 2012 21:20 ]
Заголовок сообщения:  Re: Классы-контейнеры для A2 с функциональностью C++ STL

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

Автор:  Ярослав Романченко [ Понедельник, 05 Март, 2012 11:43 ]
Заголовок сообщения:  Re: Классы-контейнеры для A2 с функциональностью C++ STL

Что-бы избавиться от приведений типов при работе со списком, так как при наследовании в Оберонах нельзя нормально перекрыть методы предка (создать у потомка метод с тем-же именем, но другими типами параметров, например), можно только создать методы с другими именами. В итоге при наследовании получается венигрет из методов предка и новых методов, что не очень хорошо. Мы в этом случае лишаемся помощи компилятора в контроле типов, если случайно в коде используем не тот метод...
Цитата:
Если всё равно оборачивать базовые типы в запись, то почему нельзя было сразу сделать интерфейсную запись для списка ?
В смысле, делать внутренний массив типа этой записи? Конечно, тоже такое желание возникает, сэкономить память.
А с другой стороны... Допустим, есть у нас какие-то данные, представленные указателем на запись с десятком полей, и 2-3 структуры хранящие указатели на эти записи. Это надо, если есть необходимость отсортировать данные по разным полям, например. Фактически в этом случае имеем экономию памяти за счёт оперирования общими указателями между разными структурами.
Вот, бувально вчера реализацию алгоритма А* писал. Всё свелось к двум структурам: двоичной куче, построенной по одному полю и карте, отсортированной двум другим полям. В некоторых случаях, имея общий указатель, можно даже избежать вставки/удаления элементов! :D

Автор:  Madzi [ Понедельник, 05 Март, 2012 12:37 ]
Заголовок сообщения:  Re: Классы-контейнеры для A2 с функциональностью C++ STL

Если нужно, то массив можно сделать и для ANY.

Говоришь, что хотел обойтись без приведения типов, но у тебя в примере получается приведение ANY к нужному типу.
Я имел ввиду базовый тип
Код:
ListItem = POINTER TO RECORD END;

А дальше либо от него наследоваться
Код:
MyType = POINTER TO RECORD(ListItem)
    ...
END;

либо проксировать
Код:
ProxyType = POINTER TO RECORD(ListItem)
    item : MyType;
END;

Ну и делать абстрактный List, а от него две реализации: LinkedList (через связный список) и ArrayList (через массив). Вечером попробую сделать свою реализацию и тогда выложу.

Автор:  Ярослав Романченко [ Понедельник, 05 Март, 2012 13:02 ]
Заголовок сообщения:  Re: Классы-контейнеры для A2 с функциональностью C++ STL

Madzi писал(а):
Говоришь, что хотел обойтись без приведения типов, но у тебя в примере получается приведение ANY к нужному типу.
Правильно, приведение никуда не делось, оно просто спрятанно от пользователя данного класса, в реализации :D
Избавился от этого:
Цитата:
i := lstMyInts.GetItem(j)(LongintItem).value;

Автор:  Madzi [ Понедельник, 05 Март, 2012 21:07 ]
Заголовок сообщения:  Re: Классы-контейнеры для A2 с функциональностью C++ STL

Выкладываю как и обещал. Правда там не полный исходный код, но базовые типы коллекций приведены полностью. За рамками остался Set и Map. Просто нету сейчас времени на них, ничего сложного, но много рутинной возни. Потом сделаю. В конце - примеры применения. Это не критика, просто многообразие вариантов. Чем больше - тем лучше.

Автор:  Ярослав Романченко [ Вторник, 06 Март, 2012 10:05 ]
Заголовок сообщения:  Re: Классы-контейнеры для A2 с функциональностью C++ STL

Согласен, чем больше тем лучше конечно :)
Посмотрел, но мне кажется это немножко не то. Мне не нужен список, что-бы помещать в него числа и кнопки одновременно :D
А как в таком случае будет работать сортировка? Списку для этого нужно иметь представление о внутренней структуре элементов. Последовательный поиск элемента в списке это всё-таки очень медленно.
Цитата:
За рамками остался Set и Map... ничего сложного, но много рутинной возни.
Какой возни?

Автор:  Madzi [ Вторник, 06 Март, 2012 11:38 ]
Заголовок сообщения:  Re: Классы-контейнеры для A2 с функциональностью C++ STL

Цитата:
Какой возни?

Возни с набором кода и его проверкой.

По поводу сортировки добавляем:
Код:
(**
 * @return 1 : Item1 > Item2
 *             0 : Item1 = Item2
 *            -1 : Item1 < Item2
 *)
Comparator = PROCEDURE {DELEGATE} (Item1, Item2 : ListItem) : LONGINT;


Добавляем метод в Set
Код:
PROCEDURE SetComparator(comparator : Comparator);


И делаем в методе Add проверку
Код:
PROCEDURE Add*(item : ListItem);
BEGIN
    ASSERT(comparator # NIL);
    ...
END Add;


Дальше по желанию. Можно сделать реализацию списка на основе чёрно-красных деревьев. Перегружать стандартные методы ещё никто не запрещал.

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

Автор:  Александр Шостак [ Вторник, 06 Март, 2012 14:52 ]
Заголовок сообщения:  Re: Классы-контейнеры для A2 с функциональностью C++ STL

Цитата:
Сейчас исследую проблему "герметизации" списка через метаинформацию.

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

A: TList (* OF TButton *);

Автор:  Madzi [ Вторник, 06 Март, 2012 14:59 ]
Заголовок сообщения:  Re: Классы-контейнеры для A2 с функциональностью C++ STL

Одно дело коментарии и самому следить, другое дело когда будет вываливатся по ASSERTу.
В последнем случае мы гарантированно страхуемся от случайной ошибки при наборе кода.

Автор:  Александр Шостак [ Вторник, 06 Март, 2012 19:20 ]
Заголовок сообщения:  Re: Классы-контейнеры для A2 с функциональностью C++ STL

По ASSERT-у и есть. Просто тип указывается при создании контейнера явно (а не при добавлении первого элемента), а в комментариях фиксируется для читающего.

Приведу пример для делфи:
Код:
Events: AssocArrays.TAssocArray {OF Lists.TList};
...
Events  :=  AssocArrays.NewStrictAssocArr(Lists.TList);

Ассоциативный массив, где значения - списки.

Автор:  Madzi [ Вторник, 06 Март, 2012 23:25 ]
Заголовок сообщения:  Re: Классы-контейнеры для A2 с функциональностью C++ STL

Копание привело к одному интересному проекту - персистентный оберон. По предварительному взгляду возможно расширится до темплейтов типа
Код:
VAR
    list : List {LONGINT};

Автор:  Ярослав Романченко [ Понедельник, 30 Май, 2016 21:59 ]
Заголовок сообщения:  Re: Классы-контейнеры для A2 с функциональностью C++ STL

Тем временем, удалось таки для AO написать полностью всеядный базовый объект Vector для реализации на базе него всевозможных контейнеров. Причём, любые данные достаточно обернуть в статическую запись. Т.е. не требуется никаких дополнительных указателей. Единственный указатель во всём контейнере - динамический массив.
Удалось это не без помощи импорта модуля SYSTEM. Но для базового объекта это, пожалуй, простительно.
Бенчмарк RegExp показал, что с новыми контейнерами он работает почти в 2 раза быстрее чем с использованием старого Containers.Mod

Вложения:
Vector.zip [3.77 КБ]
Скачиваний: 324

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/