{"id":15047987,"url":"https://github.com/izvolov/burst","last_synced_at":"2025-03-31T11:01:30.248Z","repository":{"id":23463550,"uuid":"26827690","full_name":"izvolov/burst","owner":"izvolov","description":"То, чего нет в Бусте","archived":false,"fork":false,"pushed_at":"2025-03-03T20:58:27.000Z","size":1691,"stargazers_count":82,"open_issues_count":12,"forks_count":3,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-03-22T23:11:33.594Z","etag":null,"topics":["algorithms","boost","c-plus-plus","cmake","dynamic-tuple","iterators","radix-sort","ranges","stl"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsl-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/izvolov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-11-18T20:07:42.000Z","updated_at":"2025-03-02T15:09:35.000Z","dependencies_parsed_at":"2024-08-24T12:37:42.837Z","dependency_job_id":"c4140626-8cda-47a2-b9c2-07da26d92855","html_url":"https://github.com/izvolov/burst","commit_stats":{"total_commits":983,"total_committers":1,"mean_commits":983.0,"dds":0.0,"last_synced_commit":"ea38c4a59c8f98f857dafbc468b6e8a1f8bed6ca"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/izvolov%2Fburst","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/izvolov%2Fburst/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/izvolov%2Fburst/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/izvolov%2Fburst/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/izvolov","download_url":"https://codeload.github.com/izvolov/burst/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246457967,"owners_count":20780676,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithms","boost","c-plus-plus","cmake","dynamic-tuple","iterators","radix-sort","ranges","stl"],"created_at":"2024-09-24T21:06:34.273Z","updated_at":"2025-03-31T11:01:30.226Z","avatar_url":"https://github.com/izvolov.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"Burst\n=====\n\nТо, чего нет в Бусте.\n\n![Статус сборки под Linux](https://github.com/izvolov/burst/workflows/Linux/badge.svg) ![Статус сборки под macOS](https://github.com/izvolov/burst/workflows/macOS/badge.svg) [![Покрытие кода тестами](https://codecov.io/gh/izvolov/burst/branch/master/graph/badge.svg)](https://codecov.io/gh/izvolov/burst) [![Качество кода](https://api.codacy.com/project/badge/Grade/ddaf89951f3245b685a08e19e8f274d8)](https://www.codacy.com/app/izvolov/burst) [![Попробовать онлайн на Wandbox.org](https://img.shields.io/badge/try-online-blue.svg)](https://wandbox.org/permlink/sClSvn2yz7117J2h)\n\nО проекте\n---------\n\nСтандартная библиотека неплоха, но в ней кое-чего не хватает. Поэтому умные люди написали набор библиотек, которые дополняли бы стандартную тем, чего в ней нет.\nОднако, и в этих дополнительных библиотеках тоже кое-чего не хватает.\n\nВ данном проекте я попытался собрать некоторые алгоритмы и инструменты, совместимые с СБШ и Бустом, которые нужны в повседневной работе, но которых пока нет ни в стандартной библиотеке, ни в библиотеке Boost, либо же они есть, но не устраивают с точки зрения интерфейса или производительности.\n\nСодержание\n----------\n\n1.  [Что интересного?](#что-интересного)\n    1.  [Целочисленные сортировки](#целочисленные-сортировки)\n    2.  [Динамический кортеж](#динамический-кортеж)\n    3.  [Ленивые вычисления над диапазонами](#ленивые-вычисления-над-диапазонами)\n2.  [Требования](#требования)\n3.  [Установка](#установка)\n    1.  [Вариант 1: Скопировать исходники](#вариант-1-скопировать-исходники)\n    2.  [Вариант 2: Установить с помощью CMake](#вариант-2-установить-с-помощью-cmake)\n    3.  [Вариант 3: Подключить папку с проектом в CMake](#вариант-3-подключить-папку-с-проектом-в-cmake)\n    4.  [Вариант 4: CMake FetchContent](#вариант-4-cmake-fetchcontent)\n\nЧто интересного?\n----------------\n\nПолный список интересных штук можно изучить в [справочнике](doc/README.md).\n\n### Целочисленные сортировки\n\nАлгоритмы сортировок стандартной библиотеки `std::sort` и `std::stable_sort` являются классическими представителями сортировок, основанных на сравнениях. В то же время время существует другой класс алгоритмов, применимый к целым числам и не использующий в своей работе сравнения. Таким алгоритмом является [поразрядная сортировка](https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D0%B0%D0%B7%D1%80%D1%8F%D0%B4%D0%BD%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0). И, хотя это такой же классический алгоритм, как, например, быстрая сортировка или сортировка подсчётом, реализации поразрядной сортировки, как правило, оставляют желать лучшего. Возможно, поэтому многие люди до сих пор считают поразрядку алгоритмом, представляющим исключительно академический интерес, и малоприменимым в реальности. Однако, это заблуждение.\n\nПредставленная в данной библиотеке реализация поразрядной сортировки существенно быстрее стандартных `std::sort` и `std::stable_sort` (и даже [`boost::integer_sort`](https://www.boost.org/doc/libs/1_71_0/libs/sort/doc/html/boost/sort/spreadsort/integer__idm46709765154208.html)) при условии, что сортируются целые числа или доступно отображение из сортируемых элементов в целые числа.\n\n![Сравнение сортировок целых чисел](doc/images/radix_sort_is_fast.png)\n\nПомимо обычного, существует и многопоточный вариант целочисленных сортировок, который на достаточно больших массивах даёт кратный рост скорости сортировки:\n\n![Последовательный и параллельный варианты](doc/images/parallel_radix_sort_is_even_faster.png)\n\n[Подробнее про `burst::radix_sort` и `burst::counting_sort`](doc/README.md#intsort).\n\n### Динамический кортеж\n\nПредставьте, что вам нужно сложить в один контейнер объекты разных типов, при этом набор типов неизвестен на этапе компиляции, а объекты должны быть расположены в непрерывной области памяти и плотно упакованы, то есть между ними не должно быть пустот.\n\nНикакая комбинация стандартных средств (`tuple`, `vector`, `any`) не позволяют добиться требуемого результата.\n\nПоэтому был разработан класс `burst::dynamic_tuple`, удовлетворяющий всем этим требованиям, а соответствие данным требованиям означает оптимальность по занимаемой памяти и времени доступа к нужным объектам.\n\n```cpp\nburst::dynamic_tuple t(std::string(\"123\"));\n\nt.push_back(std::vector\u003cint\u003e{1, 2, 3});\nt.push_back(true);\nt.push_back(123u);\n\nassert(t.size() == 4);\nassert(t.get\u003cstd::string\u003e(0) == \"123\");\nassert((t.get\u003cstd::vector\u003cint\u003e\u003e(1) == std::vector\u003cint\u003e{1, 2, 3}));\nassert(t.get\u003cbool\u003e(2) == true);\n\nt.get\u003cunsigned\u003e(3) = 789u;\nassert(t.get\u003cunsigned\u003e(3) == 789u);\n```\n\n[Подробнее про `burst::dynamic_tuple`](doc/README.md#dynamic-tuple).\n\n### Ленивые вычисления над диапазонами\n\nПериодически возникает потребность в работе с диапазонами как с множествами, то есть производить операции разности, слияния, объединения, пересечения и т.д. Стандартные средства (`std::set_intersection` и т.д.) умеют работать только с двумя диапазонами одновременно, а кроме того, память, в которую будет записан результат, должен быть известен заранее.\n\nВ данной библиотеке реализован ряд алгоритмов, каждый из которых работает с произвольным количеством диапазонов, а результатом является ленивый диапазон, который производит нужную операцию (пересечение, слияние и т.д.) \"на лету\".\n\nНапример, следующим образом можно получить пересечение нескольких диапазонов, причём исходные диапазоны могут быть разного типа:\n\n```cpp\nauto natural = std::vector\u003cint\u003e{1, 2, 3, 4, 5, 6, 7};\nauto   prime = std::list\u003cint\u003e  {   2, 3,    5,    7};\nauto     odd = std::deque\u003cint\u003e {1,    3,    5,    7};\n//                                    ^     ^     ^\n\nauto intersected_range = burst::intersect(std::tie(natural, prime, odd));\n\nauto expected_collection = {3, 5, 7};\nassert(intersected_range == expected_collection);\n```\n\nДоступные операции:\n1.  [Склейка](doc/README.md#join)\n2.  [Слияние](doc/README.md#merge)\n3.  [Пересечение](doc/README.md#intersect)\n4.  [Полупересечение](doc/README.md#semiintersect)\n5.  [Объединение](doc/README.md#union)\n6.  [Разность](doc/README.md#difference)\n7.  [Симметрическая разность](doc/README.md#symmetric-difference)\n8.  [Разбиение на куски](doc/README.md#buffered-chunks)\n\n[Подробнее про ленивые вычисления над диапазонами](doc/README.md#lazy-ranges).\n\nТребования\n----------\n\n1.  Система сборки [CMake](https://cmake.org/) версии 3.8.2 и выше;\n2.  Компилятор [GCC](https://gcc.gnu.org/) версии 10 и выше или компилятор [Clang](http://clang.llvm.org/) версии 15 и выше\u003csup\u003e1\u003c/sup\u003e;\n3.  Библиотека тестирования [doctest](https://github.com/onqtam/doctest) \\[Не обязательно\u003csup\u003e2\u003c/sup\u003e\\];\n4.  Библиотека [Boost](https://www.boost.org/) (модуль [`program_options`](https://www.boost.org/doc/libs/1_71_0/doc/html/program_options.html) \\[Не обязательно\u003csup\u003e3\u003c/sup\u003e\\], модуль [`system`](https://www.boost.org/doc/libs/1_71_0/libs/system/doc/html/system.html) \\[Не обязательно\u003csup\u003e4\u003c/sup\u003e\\]) версии 1.71 и выше;\n5.  [Doxygen](http://doxygen.nl) \\[Не обязательно\\].\n\nЗаведомо работающие конфигурации перечислены в [интеграционных скриптах](.github/workflows).\n\n\u003e \u003csup\u003e1\u003c/sup\u003e При работе с идущей в комплекте `libc++` или `libstdc++` версии 7 и выше.\n\n\u003e \u003csup\u003e2\u003c/sup\u003e Можно миновать этап сборки и тестирования, если при сборке с помощью `CMake` выключить опцию `BURST_TESTING`:\n\u003e\n\u003e ```shell\n\u003e cmake -DBURST_TESTING=OFF \u003cпрочие аргументы ...\u003e\n\u003e ```\n\u003e\n\u003e Также тестирование автоматически отключается в случае, если Burst подключается в качестве подпроекта.\n\u003e\n\u003e Если тестирование всё-таки включено, но doctest отсутствует в системе, то он будет автоматически скачан из репозитория и установлен локально с помощью CMake FetchContent.\n\n\u003e \u003csup\u003e3\u003c/sup\u003e `Boost.Program_options` не понадобится, если отключить этап сборки замеров производительности с помощью опции `BURST_BENCHMARKING`:\n\u003e\n\u003e ```shell\n\u003e cmake -DBURST_BENCHMARKING=OFF \u003cпрочие аргументы ...\u003e\n\u003e ```\n\u003e\n\u003e Также замеры производительности отключаются в случае, если Burst подключается в качестве подпроекта.\n\n\u003e \u003csup\u003e4\u003c/sup\u003e `Boost.System` нужен только при использовании параллельных алгоритмов (например, [параллельной версии `radix_sort`](doc/README.md#radix-par)).\n\nУстановка\n---------\n\nВозможны следующие варианты установки.\n\n### Вариант 1: Скопировать исходники\n\nПоскольку Burst — полностью заголовочная библиотека, то достаточно скопировать в нужную директорию все заголовки из папки `include` из [репозитория](https://github.com/izvolov/burst) и подключить их в свой проект.\n\n### Вариант 2: Установить с помощью CMake\n\n```shell\ncd path/to/build/directory\ncmake -DCMAKE_BUILD_TYPE=Release path/to/burst\ncmake --build . --target install\n```\n\nПосле этого в системе сборки CMake будет доступен пакет `Burst`:\n\n```cmake\nfind_package(Burst)\n```\n\nЭта команда породит интерфейсную библиотеку `Burst::burst`, которую можно использовать при подключении библиотек:\n\n```cmake\nadd_executable(program program.cpp)\ntarget_link_libraries(program PRIVATE Burst::burst)\n```\n\n### Вариант 3: Подключить папку с проектом в CMake\n\n```cmake\nadd_subdirectory(\"path/to/burst\")\n```\n\nПосле этого в системе сборки CMake будет доступна цель `Burst::burst`, которую можно использовать при подключении библиотек:\n\n```cmake\nadd_executable(program program.cpp)\ntarget_link_libraries(program PRIVATE Burst::burst)\n```\n\n### Вариант 4: CMake FetchContent\n\nНачиная с версии CMake 3.14 можно скачать и подключить репозиторий с зависимостью прямо во время сборки с помощью модуля [FetchContent](https://cmake.org/cmake/help/v3.14/module/FetchContent.html). В случае с библиотекой `Burst` это можно записать тремя командами:\n\n```cmake\ninclude(FetchContent)\nFetchContent_Declare(Burst GIT_REPOSITORY https://github.com/izvolov/burst.git)\nFetchContent_MakeAvailable(Burst)\n```\n\nЭтот набор команд породит интерфейсную библиотеку Burst::burst, которую можно использовать при подключении библиотек:\n\n```cmake\nadd_executable(program program.cpp)\ntarget_link_libraries(program PRIVATE Burst::burst)\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fizvolov%2Fburst","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fizvolov%2Fburst","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fizvolov%2Fburst/lists"}