# abseil

Коллекция фундаментальных библиотек для языка C++, которые предназначены для решения широкого спектра задач системного программирования. Библиотека заполняет пробелы, существующие в стандартной библиотеке C++, предоставляя оптимизированные и надежные реализации распространенных алгоритмов и структур данных.

## Особенности

- кросс-платформенная совместимость;
- модульность библиотек, возможность включать только нужные компоненты;
- совместимость с существующей стандартной библиотекой C++.

## Основные компоненты

Библиотека состоит из нескольких модульных компонентов, каждый из которых решает конкретные задачи (подробнее с документацией можно ознакомиться [здесь](https://abseil.io/docs/cpp/)):

### Абстракции строк и текстовой обработки

Центральным компонентом является `absl::string_view` — невладеющий вид строки, который позволяет передавать подстроки без дорогостоящих операций копирования. Этот тип особенно полезен в API функций, которые принимают строки только для чтения, так как устраняет необходимость создания временных объектов.

Основные функции обработки строк:

- `absl::StrCat()` и `absl::StrAppend()` для эффективной конкатенации;

- `absl::StrSplit()` и `absl::StrJoin()` для разделения и объединения коллекций;

- `absl::StrFormat()` для типобезопасного форматирования;

- `absl::Substitute()` для простой шаблонизации текста.

### Контейнеры и структуры данных

`absl::flat_hash_map` и `absl::flat_hash_set` используют алгоритмы открытой адресации с квадратичным пробированием, что обеспечивает отличную локальность данных и минимизирует количество кэш-промахов. Эти контейнеры особенно эффективны для небольших и средних коллекций, где они могут быть в несколько раз быстрее стандартных реализаций.

Специализированные контейнеры:

- `absl::InlinedVector` — вектор с inline-хранением для оптимизации мелких коллекций;

- `absl::FixedArray` — массив с compile-time или runtime размером;

- `absl::node_hash_map` — хеш-таблица с узловым хранением для стабильных указателей;

- `absl::btree_map` — B-дерево для упорядоченных ассоциативных массивов.

### Утилиты времени и таймеров

Abseil предоставляет единую, последовательную модель времени, которая минимизирует ошибки и упрощает временные расчеты. Центральными типами являются `absl::Time` (момент времени) и `absl::Duration` (временной интервал). Эти типы обеспечивают строгую типизацию, предотвращая случайное смешивание различных временных единиц.

Библиотека также предоставляет высокоточные функции для измерений производительности, такие как `absl::Now()` и `absl::GetCurrentTimeNanos()`, которые гарантируют монотонность и устойчивость к корректировкам системного времени.

### Средства синхронизации и параллелизма

Модуль синхронизации содержит промышленные реализации примитивов для многопоточного программирования. `absl::Mutex` представляет собой расширенную реализацию мьютекса с дополнительными функциями отладки и профилирования. В отличие от простых мьютексов стандартной библиотеки, он предоставляет встроенную поддержку условных переменных, reader-writer блокировок и механизмы обнаружения deadlock'ов.

Примитивы синхронизации:

- `absl::CondVar` для условных ожиданий;

- `absl::Notification` для однократных уведомлений между потоками;

- `absl::Barrier` и `absl::BlockingCounter` для координации групп потоков;

- `absl::call_once()` для гарантированно однократного выполнения;

- `absl::AnyInvocable` — современная замена std::function, которая поддерживает move-only типы и предоставляет лучшую производительность за счет исключения type erasure в некоторых случаях.

### Система диагностики и логирования

Cистема Abseil предоставляет структурированный и настраиваемый подход к диагностике. Логгер поддерживает различные уровни детализации, структурированные данные и условное логирование.

Диагностические возможности:

- `ABSL_CHECK()` макросы для валидации с информативными сообщениями;

- `absl::Status` и `absl::StatusOr<T>` для обработки ошибок без исключений;

- Встроенная символизация стектрейсов для отладки креш-дампов;

- Обработчики фатальных сигналов с сохранением диагностической информации.

Библиотека также включает систему флагов командной строки `(absl::Flags)`, которая предоставляет типобезопасный доступ к параметрам конфигурации с автоматической генерацией help-сообщений и валидацией значений.
