Наборы: модуль 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».