Перейти к содержанию
Материалы раздела

Наборы: модуль mlib

В uLua нет обычных таблиц. Модуль mlib предлагает две компактные замены: битовый набор и множество целых. Они заранее занимают небольшой фиксированный участок памяти, поэтому их поведение предсказуемо даже на контроллере с малым объёмом ОЗУ.

КонтейнерЧто хранитЁмкостьОдновременно объектов
Битовый наборtrue или false для каждого индексадо 1024 бит
Множествоцелые значения 0..1023до 1024 возможных значений
Общий пределОба вида используют один пул2

Например, два битовых набора или один набор и одно множество займут оба слота. Третий объект создать нельзя, пока один из прежних не освобождён.

Пределы доступны и в программе:

  • mlib.bitset_capacity == 1024;
  • mlib.bitset_slots == 2;
  • mlib.set_capacity == 1024;
  • mlib.set_slots == 2.

Битовый набор

Битовый набор удобен для состояния входов, флагов и масок, когда каждому индексу соответствует только «да» или «нет». Индексация начинается с нуля.

local bits = mlib.bitset_new(16)
mlib.bitset_set(bits, 3, true)
mlib.bitset_set(bits, 7, true)

return mlib.bitset_count(bits)  -- 2

API

  • mlib.bitset_new(size) -> bitset — создать набор из 0..1024 битов;
  • mlib.bitset_free(bits) — освободить объект;
  • mlib.bitset_size(bits) -> int — вернуть заданное число битов;
  • mlib.bitset_count(bits) -> int — посчитать установленные биты;
  • mlib.bitset_clear(bits) — сбросить все биты;
  • mlib.bitset_get(bits, index) -> bool — прочитать бит;
  • mlib.bitset_set(bits, index, state) — изменить бит.

Допустимый индекс — от 0 до size - 1. После bitset_free() прежний дескриптор недействителен.

Множество целых

Множество отвечает на вопрос, добавлено ли целое значение. Внутри оно также использует по одному биту на каждое возможное значение.

local values = mlib.set_new(31)
mlib.set_add(values, 3)
mlib.set_add(values, 7)

if mlib.set_has(values, 7) then
    return mlib.set_size(values)  -- 2
end
return 0

Аргумент 31 означает, что множество принимает числа от 0 до 31 включительно.

API

  • mlib.set_new(max_value) -> set — создать множество значений 0..max_value; max_value должен лежать в диапазоне 0..1023;
  • mlib.set_free(set) — освободить объект;
  • mlib.set_size(set) -> int — вернуть число добавленных значений;
  • mlib.set_clear(set) — удалить все значения;
  • mlib.set_has(set, value) -> bool — проверить значение;
  • mlib.set_add(set, value) — добавить значение;
  • mlib.set_del(set, value) — удалить значение.

Повторное добавление не меняет размер, а удаление отсутствующего значения ничего не делает. Значение вне диапазона, заданного при set_new(), завершает программу ошибкой.

Массивы, двусторонние очереди и словари не поддерживаются. Функции mlib.array_*, mlib.deque_* и mlib.dict_* недоступны.

Ограничения типов и памяти всей программы описаны в разделе «Язык uLua».