style: updated comments
This commit is contained in:
1 parent
f17658bcff
commit
fb17cd1844
2 files changed
+149
-139
No files matched your search
+75
-70
@@ -24,14 +24,14 @@
|
||||
|
||||
## Возможности
|
||||
|
||||
- **Независимость от типа данных**: Поддерживает любой тип данных (целые числа, числа с плавающей точкой, структуры, пользовательские типы и т.д.)
|
||||
- **Автоматическое управление памятью**: Автоматическое выделение и освобождение памяти
|
||||
- **Динамическое изменение размера**: Емкость вектора увеличивается и уменьшается по мере необходимости
|
||||
- **Максимальная емкость**: До 65 535 элементов (ограничение 16-битного индекса)
|
||||
- **Оптимизировано под ESP-IDF**: Использует функции heap_caps для выделения памяти с параметрами памяти
|
||||
- **Обработка ошибок**: Комплексная проверка ошибок с детальным логированием
|
||||
- **Потокобезопасность**: Является потокобезопасным (использует FreeRTOS mutex)
|
||||
- **Минимальные накладные расходы**: Низкие накладные расходы на память и процессор
|
||||
1. **Независимость от типа данных**: Поддерживает любой тип данных (целые числа, числа с плавающей точкой, структуры, пользовательские типы и т.д.)
|
||||
2. **Автоматическое управление памятью**: Автоматическое выделение и освобождение памяти
|
||||
3. **Динамическое изменение размера**: Емкость вектора увеличивается и уменьшается по мере необходимости
|
||||
4. **Максимальная емкость**: До 65 535 элементов (ограничение 16-битного индекса)
|
||||
5. **Оптимизировано под ESP-IDF**: Использует функции heap_caps для выделения памяти с параметрами памяти
|
||||
6. **Обработка ошибок**: Комплексная проверка ошибок с детальным логированием
|
||||
7. **Потокобезопасность**: Является потокобезопасным (использует FreeRTOS mutex)
|
||||
8. **Минимальные накладные расходы**: Низкие накладные расходы на память и процессор
|
||||
|
||||
---
|
||||
|
||||
@@ -70,7 +70,7 @@ git clone https://github.com/aZholtikov/zh_vector
|
||||
**Поля (внутренние):**
|
||||
|
||||
| Поле | Тип | Описание |
|
||||
|------|-----|----------|
|
||||
| ------ | ----- | ---------- |
|
||||
| `items` | `void **` | Массив указателей на элементы вектора. Items[0..size-1] являются валидными. Выделяется через heap_caps_calloc, перераспределяется через heap_caps_realloc. |
|
||||
| `capacity` | `uint16_t` | Текущая выделенная емкость (количество слотов). Увеличивается при вставке — может превышать size после удалений. |
|
||||
| `size` | `uint16_t` | Текущее количество элементов (0 ≤ size ≤ capacity). |
|
||||
@@ -85,8 +85,8 @@ git clone https://github.com/aZholtikov/zh_vector
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Если указатель на вектор равен NULL, будет выделена память.
|
||||
- `unit` - Размер каждого элемента в байтах
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Должен быть NULL
|
||||
- `unit` - Размер каждого элемента в байтах. Должен быть > 0
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -114,7 +114,7 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -132,8 +132,8 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `capacity` - Указатель на переменную для сохранения емкости. Не должен быть NULL.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
- `capacity` - Указатель на переменную для сохранения емкости. Не должен быть NULL
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -141,7 +141,7 @@ if (ret != ESP_OK) {
|
||||
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL указатель на указатель на вектор или capacity)
|
||||
- `ESP_ERR_INVALID_STATE` - Не удалось захватить mutex (редкий системный сбой)
|
||||
|
||||
**Примечание:** Емкость может быть больше текущего размера (например, после удалений), и уменьшается лениво при size < capacity/2 (или когда size становится 0).
|
||||
**Примечание:** Емкость может быть больше текущего размера (например, после удалений). Уменьшение емкости происходит автоматически при удалении элементов, когда `capacity / 2 > size` (емкость больше удвоенного размера) или когда размер становится 0.
|
||||
|
||||
---
|
||||
|
||||
@@ -151,8 +151,8 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `size` - Указатель на переменную для сохранения размера. Не должен быть NULL.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
- `size` - Указатель на переменную для сохранения размера. Не должен быть NULL
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -168,8 +168,8 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `item` - Указатель на элемент для добавления. Не должен быть NULL.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
- `item` - Указатель на элемент для добавления. Не должен быть NULL
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -188,8 +188,8 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `item` - Указатель на элемент для добавления. Не должен быть NULL.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
- `item` - Указатель на элемент для добавления. Не должен быть NULL
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -208,9 +208,9 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `index` - Индекс элемента для изменения (начиная с 0). Должен быть < размера вектора.
|
||||
- `item` - Указатель на новые данные элемента. Не должен быть NULL.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
- `index` - Индекс элемента для изменения (начиная с 0). Должен быть < размера вектора
|
||||
- `item` - Указатель на новые данные элемента. Не должен быть NULL
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -226,9 +226,9 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `index` - Индекс элемента для получения (начиная с 0).
|
||||
- `item` - Указатель на буфер размером не менее `unit` байт, куда будет скопирован элемент. Не должен быть NULL.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
- `index` - Индекс элемента для получения (начиная с 0)
|
||||
- `item` - Указатель на буфер размером не менее `unit` байт, куда будет скопирован элемент. Не должен быть NULL
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -246,17 +246,16 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `index` - Индекс элемента для удаления (начиная с 0). Должен быть < размера вектора.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
- `index` - Индекс элемента для удаления (начиная с 0). Должен быть < размера вектора
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
- `ESP_OK` - Успех
|
||||
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL указатель на указатель на вектор или неверный индекс)
|
||||
- `ESP_ERR_NO_MEM` - Ошибка выделения памяти (при перераспределении)
|
||||
- `ESP_ERR_INVALID_STATE` - Не удалось захватить mutex (редкий системный сбой)
|
||||
- `ESP_ERR_INVALID_STATE` - Не удалось захватить mutex или внутренняя ошибка
|
||||
|
||||
**Примечание:** Все элементы после удаляемого индекса сдвигаются влево на одну позицию. Память удаленного элемента освобождается.
|
||||
**Примечание:** Все элементы после удаляемого индекса сдвигаются влево на одну позицию. Память удаленного элемента освобождается. Емкость автоматически уменьшается, когда `capacity / 2 > size` или когда размер становится 0.
|
||||
|
||||
---
|
||||
|
||||
@@ -266,7 +265,7 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -274,7 +273,7 @@ if (ret != ESP_OK) {
|
||||
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL указатель на вектор, NULL вектор или вектор пуст)
|
||||
- `ESP_ERR_INVALID_STATE` - Не удалось захватить mutex (редкий системный сбой)
|
||||
|
||||
**Примечание:** Память удаленного элемента освобождается. Если размер падает ниже половины емкости, емкость уменьшается (такое же поведение, как в zh_vector_delete_item).
|
||||
**Примечание:** Память удаленного элемента освобождается. Емкость автоматически уменьшается, когда `capacity / 2 > size` или когда размер становится 0 (такое же поведение, как в zh_vector_delete_item).
|
||||
|
||||
---
|
||||
|
||||
@@ -284,7 +283,7 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -292,7 +291,7 @@ if (ret != ESP_OK) {
|
||||
- `ESP_ERR_INVALID_ARG` - Неверный аргумент (NULL указатель на вектор, NULL вектор или вектор пуст)
|
||||
- `ESP_ERR_INVALID_STATE` - Не удалось захватить mutex (редкий системный сбой)
|
||||
|
||||
**Примечание:** Память удаленного элемента освобождается, и все последующие элементы сдвигаются влево на одну позицию. Если размер падает ниже половины емкости, емкость уменьшается (такое же поведение, как в zh_vector_delete_item).
|
||||
**Примечание:** Память удаленного элемента освобождается, и все последующие элементы сдвигаются влево на одну позицию. Емкость автоматически уменьшается, когда `capacity / 2 > size` или когда размер становится 0 (такое же поведение, как в zh_vector_delete_item).
|
||||
|
||||
---
|
||||
|
||||
@@ -302,9 +301,9 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `item` - Указатель на элемент для поиска. Не должен быть NULL.
|
||||
- `index` - Указатель на переменную для сохранения найденного индекса. Будет установлен в -1, если элемент не найден. Не должен быть NULL.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
- `item` - Указатель на элемент для поиска. Не должен быть NULL
|
||||
- `index` - Указатель на переменную типа `int32_t` для сохранения найденного индекса. Будет установлен в -1, если элемент не найден. Не должен быть NULL
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -323,13 +322,13 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `sample_struct` - Указатель на образец структуры того же типа, что и хранится в векторе. Не должен быть NULL.
|
||||
- `item` - Указатель на поле внутри структуры (например, `&sample.id`). Используется для вычисления смещения поля внутри структуры. Не должен быть NULL.
|
||||
- `size` - Размер (в байтах) поля для сравнения. Должен быть > 0.
|
||||
- `value` - Указатель на значение для поиска. Не должен быть NULL.
|
||||
- `start` - Начальный индекс для поиска (начиная с 0). Должен быть < размера вектора.
|
||||
- `index` - Указатель на переменную для сохранения найденного индекса. Будет установлен в -1, если значение не найдено. Не должен быть NULL.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
- `sample_struct` - Указатель на образец структуры того же типа, что и хранится в векторе. Не должен быть NULL
|
||||
- `item` - Указатель на поле внутри структуры (например, `&sample.id`). Используется для вычисления смещения поля внутри структуры. Не должен быть NULL
|
||||
- `size` - Размер (в байтах) поля для сравнения. Должен быть > 0
|
||||
- `value` - Указатель на значение для поиска. Не должен быть NULL
|
||||
- `start` - Начальный индекс для поиска (начиная с 0). Должен быть < размера вектора
|
||||
- `index` - Указатель на переменную типа `int32_t` для сохранения найденного индекса. Будет установлен в -1, если значение не найдено. Не должен быть NULL
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -348,7 +347,7 @@ if (ret != ESP_OK) {
|
||||
|
||||
**Параметры:**
|
||||
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL.
|
||||
- `vector` - Указатель на указатель на структуру вектора (`zh_vector_t **`). Не должен быть NULL
|
||||
|
||||
**Возвращает:**
|
||||
|
||||
@@ -389,7 +388,7 @@ void app_main(void)
|
||||
ret = zh_vector_get_size(&vector, &size);
|
||||
if (ret == ESP_OK)
|
||||
{
|
||||
printf("Размер вектора: %zu\n", size);
|
||||
printf("Размер вектора: %u\n", size);
|
||||
}
|
||||
// Доступ к элементам
|
||||
for (int i = 0; i < size; i++)
|
||||
@@ -469,19 +468,25 @@ void app_main(void)
|
||||
{
|
||||
esp_log_level_set("zh_vector", ESP_LOG_ERROR);
|
||||
zh_vector_t *vector = NULL;
|
||||
char buffer[100] = {0};
|
||||
// Инициализация вектора для строк (макс. 100 символов)
|
||||
esp_err_t ret = zh_vector_init(&vector, sizeof(buffer));
|
||||
esp_err_t ret = zh_vector_init(&vector, 100);
|
||||
if (ret != ESP_OK)
|
||||
{
|
||||
printf("Ошибка инициализации вектора\n");
|
||||
return;
|
||||
}
|
||||
// Добавление строк
|
||||
strcpy(buffer, "Привет");
|
||||
zh_vector_push_front(&vector, &buffer);
|
||||
strcpy(buffer, "Мир");
|
||||
zh_vector_push_back(&vector, &buffer);
|
||||
// Добавление строк (каждая строка выделяется отдельно)
|
||||
char *str1 = malloc(100);
|
||||
char *str2 = malloc(100);
|
||||
if (str1 && str2)
|
||||
{
|
||||
strcpy(str1, "Привет");
|
||||
strcpy(str2, "Мир");
|
||||
zh_vector_push_back(&vector, str1);
|
||||
zh_vector_push_back(&vector, str2);
|
||||
free(str1);
|
||||
free(str2);
|
||||
}
|
||||
uint16_t size = 0;
|
||||
ret = zh_vector_get_size(&vector, &size);
|
||||
if (ret == ESP_OK)
|
||||
@@ -541,14 +546,14 @@ void app_main(void)
|
||||
ret = zh_vector_get_size(&vector, &size);
|
||||
if (ret == ESP_OK)
|
||||
{
|
||||
printf("Размер вектора перед удалением дубликатов: %zu\n", size);
|
||||
printf("Размер вектора перед удалением дубликатов: %u\n", size);
|
||||
}
|
||||
// Удаление дубликатов
|
||||
zh_vector_remove_duplicates(&vector);
|
||||
ret = zh_vector_get_size(&vector, &size);
|
||||
if (ret == ESP_OK)
|
||||
{
|
||||
printf("Размер вектора после удаления дубликатов: %zu\n", size);
|
||||
printf("Размер вектора после удаления дубликатов: %u\n", size);
|
||||
}
|
||||
// Доступ к оставшимся элементам
|
||||
for (int i = 0; i < size; ++i)
|
||||
@@ -600,11 +605,11 @@ void app_main(void)
|
||||
ret = zh_vector_find_item(&vector, &search_item, &found_index);
|
||||
if (ret == ESP_OK)
|
||||
{
|
||||
printf("Элемент %d найден по индексу %ld\n", search_item, found_index);
|
||||
printf("Элемент %d найден по индексу %d\n", search_item, (int)found_index);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Элемент %d не найден (index=%ld)\n", search_item, found_index);
|
||||
printf("Элемент %d не найден (index=%d)\n", search_item, (int)found_index);
|
||||
}
|
||||
// Поиск несуществующего элемента
|
||||
search_item = 100;
|
||||
@@ -612,11 +617,11 @@ void app_main(void)
|
||||
ret = zh_vector_find_item(&vector, &search_item, &found_index);
|
||||
if (ret == ESP_OK)
|
||||
{
|
||||
printf("Элемент %d найден по индексу %ld\n", search_item, found_index);
|
||||
printf("Элемент %d найден по индексу %d\n", search_item, (int)found_index);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Элемент %d не найден (index=%ld)\n", search_item, found_index);
|
||||
printf("Элемент %d не найден (index=%d)\n", search_item, (int)found_index);
|
||||
}
|
||||
// Очистка
|
||||
zh_vector_free(&vector);
|
||||
@@ -663,7 +668,7 @@ void app_main(void)
|
||||
ret = zh_vector_find_item_in_field(&vector, &sample, &sample.id, sizeof(sample.id), &search_id, 0, &found_index);
|
||||
if (ret == ESP_OK)
|
||||
{
|
||||
printf("Структура с id=%d найдена по индексу %ld\n", search_id, found_index);
|
||||
printf("Структура с id=%d найдена по индексу %d\n", search_id, (int)found_index);
|
||||
// Получение найденной структуры
|
||||
my_struct_t found_item = {0};
|
||||
ret = zh_vector_get_item(&vector, (uint16_t)found_index, &found_item);
|
||||
@@ -674,7 +679,7 @@ void app_main(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Структура с id=%d не найдена (index=%ld)\n", search_id, found_index);
|
||||
printf("Структура с id=%d не найдена (index=%d)\n", search_id, (int)found_index);
|
||||
}
|
||||
// Поиск несуществующего id
|
||||
search_id = 100;
|
||||
@@ -682,11 +687,11 @@ void app_main(void)
|
||||
ret = zh_vector_find_item_in_field(&vector, &sample, &sample.id, sizeof(sample.id), &search_id, 0, &found_index);
|
||||
if (ret == ESP_OK)
|
||||
{
|
||||
printf("Структура с id=%d найдена по индексу %ld\n", search_id, found_index);
|
||||
printf("Структура с id=%d найдена по индексу %d\n", search_id, (int)found_index);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Структура с id=%d не найдена (index=%ld)\n", search_id, found_index);
|
||||
printf("Структура с id=%d не найдена (index=%d)\n", search_id, (int)found_index);
|
||||
}
|
||||
// Очистка
|
||||
zh_vector_free(&vector);
|
||||
@@ -698,7 +703,7 @@ void app_main(void)
|
||||
## Технические характеристики
|
||||
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| ---------- | ---------- |
|
||||
| **Максимальная емкость** | 65 535 элементов |
|
||||
| **Тип индекса** | uint16_t (16-бит) |
|
||||
| **Управление памятью** | heap_caps_calloc, heap_caps_realloc, heap_caps_free |
|
||||
@@ -713,12 +718,12 @@ void app_main(void)
|
||||
## Коды ошибок
|
||||
|
||||
| Код ошибки | Описание |
|
||||
|------------|----------|
|
||||
| ------------ | ---------- |
|
||||
| `ESP_OK` | Операция выполнена успешно |
|
||||
| `ESP_ERR_INVALID_ARG` | Неверный аргумент (NULL указатель или нулевой размер) |
|
||||
| `ESP_ERR_INVALID_STATE` | Не удалось захватить mutex (редкий системный сбой) |
|
||||
| `ESP_ERR_INVALID_ARG` | Неверный аргумент (NULL указатель, нулевой размер или неверный индекс) |
|
||||
| `ESP_ERR_INVALID_STATE` | Не удалось захватить mutex или внутренняя ошибка (например, элемент равен NULL) |
|
||||
| `ESP_ERR_NO_MEM` | Ошибка выделения памяти (не хватает памяти) |
|
||||
| `ESP_ERR_NOT_FOUND` | Элемент не найден (для zh_vector_find_item) |
|
||||
| `ESP_ERR_NOT_FOUND` | Элемент не найден (для zh_vector_find_item и zh_vector_find_item_in_field) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in new issue
Block a user