Скрыть меню

L2: C-расширение для Ruby

Связать реализацию L2-списка (реализация, заголовки) с языком Ruby в виде расширения L2.so, описав класс L2 со следующими методами:

  • unshift(key) — вставляет key в начало списка и возвращает список;
  • push(key) — вставляет key в конец списка и возвращает список;
  • insert(index, key) — вставляет key в список по индексу index, возвращает список или nil для некорректного индекса;
  • shift — извлекает первый ключ из списка и возвращает его, либо возвращает nil для пустого списка;
  • pop — извлекает последний ключ из списка и возвращает его, либо возвращает nil для пустого списка;
  • delete_at(index) — удаляет из списка ключ по индексу index и возвращает его, для некорректного индекса возвращает nil;
  • []=(index, key) — устанавливает в списке по индексу index значение key, возвращает список или nil для некорректного индекса;
  • [](index) — возвращает ключ по индексу index или nil для некорректного индекса;
  • size — возвращает размер массива;
  • to_a — возвращает массив, заполненный ключами списка в соответствии с их индексами;
  • конструктор по умолчанию создает пустой список.

Реализация L2-списка должна быть исправлена таким образом, чтобы была возможность обнаруживать ошибку типа недостатка памяти. При возникновении такой ошибки расширение для Ruby должно генерировать с помощью функции rb_raise исключение rb_eNoMemError с пояснением "Out of memory".

Для тестирования расширения реализовать программу на Ruby, которая заполнит список и массив попарно совпадающими случайными элементами, после чего попарно извлечет все эти элементы из списка и массива, используя случайные индексы, сверяя на каждой итерации, что извлеченные элементы попарно совпадают. На каждой итерации необходимо по случайным индексам сначала вставлять в список и массив случайный элемент, потом извлекать по два элемента. Тест пройден, если извлекаемые из списка и массива элементы всегда попарно совпадали.

  • Базовый балл:
    • Программа не компилируется или не работает почти никогда: 0;
    • Программа работает часто, но не всегда (могут быть реализованы не все методы): 1;
    • Программа работает всегда (реализованы все методы): 2.
  • Дополнительные баллы:
    • Компиляция проходит без предупреждений: 1;
    • Грамотная работа с ресурсами, исключения генерируются: 1;
    • Корректно реализованы сборка мусора, создание и удаление списка: 1;
    • Правильно реализован тестирующий скрипт: 2.
  • Максимальный балл за задачу: 7.