Набор шаблонных инструментов
- Умные указатели
- Динамические массивы
- Буферы
Совместима со всеми Arduino платформами (используются Arduino-функции)
array_x
/stack_x
используют сишный аллокатор realloc
для изменения размера. Это позволяет менять размер без создания дыр в памяти, как в других vector-подобных библиотеках, память используется очень сильно эффективнее. Но в то же время GTL-массивы не вызывают конструкторы и деструкторы, поэтому категорически не рекомендуется использовать их с объектами, которые содержат динамические данные (например String) или copy/move семантику!!!
Динамический массив. Имеет три модели поведения при передаче из одного объекта в другой:
array_copy
- создаёт независимую копию (как Arduino String)array_shared
- создаёт зависимую копию, изменения в одном массиве отражаются на другомarray_uniq
- полностью переходит к новому объекту
T* buf();
size_t size();
operator T*();
explicit operator bool();
// изменить размер в количестве элементов T
bool resize(size_t newsize);
// удалить буфер
void reset();
Динамический массив, хранит данные линейно, позволяет добавлять и убирать их. Имеет несколько вариантов:
stack_ext
- внешний буферstack_static
- внутренний статический буферstack_copy
- динамический буфер с семантикойarray_copy
stack_shared
- динамический буфер с семантикойarray_shared
stack_uniq
- динамический буфер с семантикойarray_uniq
// добавить в конец
bool push(const T& val);
// добавить в конец
bool operator+=(const T& val);
// получить с конца и удалить
T pop();
// прочитать с конца не удаляя
T& peek();
// добавить в начало
bool shift(const T& val);
// получить с начала и удалить
T unshift();
// прочитать с начала не удаляя
T& unpeek();
// удалить элемент. Отрицательный - с конца
bool remove(int idx);
// удалить несколько элементов, начиная с индекса
bool remove(size_t from, size_t amount);
// вставить элемент на индекс (допускается индекс length())
bool insert(int idx, const T& val);
// прибавить другой массив в конец
bool concat(const stack_ext& st);
bool concat(const T* buf, size_t len, bool pgm = false);
// прибавить другой массив в конец
bool operator+=(const stack_ext& st);
// заполнить значением (на capacity)
void fill(const T& val);
// инициализировать, вызвать конструкторы (на capacity)
void init();
// очистить (установить длину 0)
void clear();
// текущий размер в байтах
size_t size();
// количество элементов
size_t length();
// установить количество элементов (само вызовет reserve)
bool setLength(size_t len);
// есть место для добавления
bool canAdd();
// вместимость, элементов
size_t capacity();
// позиция элемента (-1 если не найден)
int indexOf(const T& val);
// содержит элемент
bool has(const T& val);
// удалить по значению (true если элемента нет)
bool removeByVal(const T& val);
// получить элемент под индексом. Отрицательный - с конца
T& get(int idx);
// получить элемент под индексом. Отрицательный - с конца
T& operator[](int idx);
// доступ к буферу
inline T* buf();
// буфер существует
bool valid();
// буфер существует
explicit operator bool();
// бинарный поиск в отсортированном стеке
bsearch_t<T> searchSort(const T& val);
// добавить с сортировкой. Флаг uniq - не добавлять если элемент уже есть
bool addSort(const T& val, bool uniq = false);
// ДЛЯ ДИНАМИЧЕСКИХ
// зарезервировать память в кол-ве элементов
bool reserve(size_t cap);
// удалить буфер
void reset();
FIFO буфер
fifo_ext
- внешний буферfifo_static
- внутренний статический буфер
// подключить буфер
void setBuffer(T* buf, uint8_t capacity);
// запись в буфер. Вернёт true при успешной записи
bool write(const T& val);
// буфер полон
bool isFull();
// буфер пуст
inline bool isEmpty();
// чтение из буфера
T read();
// возвращает крайнее значение без удаления из буфера
T peek();
// количество непрочитанных элементов
uint8_t available();
// размер буфера
uint8_t size();
// очистить
void clear();
T* buffer;
Связанный список для создания динамического массива объектов в стеке. Смотри пример в examples
// получить итератор
list_iter iter();
// добавить
bool add(list_node& node);
// добавить
bool add(list_node* node);
// удалить
void remove(list_node& node);
// удалить
void remove(list_node* node);
// список содержит
bool has(list_node& node);
// список содержит
bool has(list_node* node);
// длина списка
size_t length();
// очистить список
void clear();
// получить последний элемент в списке
list_node* getLast();
- v1.0
- v1.1 - добавлен связанный список
- Библиотеку можно найти по названию GTL и установить через менеджер библиотек в:
- Arduino IDE
- Arduino IDE v2
- PlatformIO
- Скачать библиотеку .zip архивом для ручной установки:
- Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
- Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
- Распаковать и положить в Документы/Arduino/libraries/
- (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
- Читай более подробную инструкцию по установке библиотек здесь
- Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
- Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
- Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!
При нахождении багов создавайте Issue, а лучше сразу пишите на почту [email protected]
Библиотека открыта для доработки и ваших Pull Request'ов!
При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:
- Версия библиотеки
- Какой используется МК
- Версия SDK (для ESP)
- Версия Arduino IDE
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код