Войти
ПроектыФорумУтилиты

Intra - альтернатива STL / Boost

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 313 14 Следующая »
#0
0:59, 6 сен. 2016

Название: Intra
Язык: C++11
Поддерживаемые платформы: Windows, Linux, FreeBSD, Android
Поддерживаемые компиляторы: MSVC 2015+, Clang 3.4+, g++ 4.8+
Лицензия: MIT

Описание:
Это моя библиотека, которая содержит в себе следующий функционал:

  • Контейнеры: Array, BList, HashMap, LinearMap, String и другие.
    Особенностью String является то, что их sizeof меньше, чем std::string, при этом они тоже имеют Short String Optimization и могут хранить sizeof(String)-1 символов без аллокации памяти вообще. Кроме того есть классы StringView ArrayRange, которые во многих случаях заменяют классы строк\массивов и являются более лёгкой их альтернативой. Ближайшие аналоги STL появятся только в C++17 и обладают намного меньшей функциональностью.
  • Аллокаторы и возможность собирать сложные аллокаторы из простых блоков.
  • Диапазоны и алгоритмы работы с ними.
    Диапазоны реализованы в стиле стандартной библиотеки Phobos языка D.
    Концепция диапазонов заменяет собой сразу три другие концепции: итераторов, текстовых потоков и последовательностей (которые есть в функциональных языках или чего-то вроде Stream API из Java 8). В отличие от итераторов, диапазоны могут комбинироваться, образуя сложные диапазоны. Это позволяет реализовать ленивые вычисления и оперировать последовательностями элементов в функциональном стиле. Примеры здесь.
    В отличие от алгоритмов, работающих с итераторами в STL, алгоритмы, работающие с диапазонами более безопасны. Например алгоритмы копирования и заполнения никогда не попытаются выполнить запись за пределы предоставленного им массива.
    Диапазоны просто создавать. Для создания минимального input-диапазона достаточно определить всего 3 метода, которые делают вполне определённые вещи. Для минимального output диапазона достаточно определить один метод Put. После этого с ними сразу же начинают работать все алгоритмы библиотеки. Не нужно ни от чего наследоваться и не нужно определять никаких вспомогательных типов, как в случае с итераторами STL.
    Диапазоны символов автоматически становятся легковесными текстовыми потоками, в которые можно записывать и из которых можно читать с помощью операторов << и >>.
  • Сериализация и десериализация - бинарная и текстовая (JSON, XML subset, кастомные форматы)
  • Несмотря на то, что библиотека не включает ни одного заголовочного файла STL, её обобщённые алгоритмы могут работать с контейнерами STL напрямую. Можно даже вывести map<string, vector<int>> на консоль или перевести в строку, причём в любую - на стеке, String, std::string, std::vector<char> или даже... std::list<char>! При этом форматирование строк работает даже быстрее sprintf, не говоря уже о всяких std::to_string или уж тем более stringstream.
  • Математика: FixedPoint, векторы, матрицы, кватернионы, геометрические примитивы
  • Загрузка множества форматов изображений (модуль Image)
  • Звук и синтез различных музыкальных инструментов. (модуль Audio)
  • Многопоточность: классы Thread, Mutex, RecursiveMutex, CondVar, atomics с продвинутой отладкой
  • Другое: информация о железе, переменные окружения, измерение времени Stopwatch, классы для работы с потоками IO - файлы и сокеты.
  • Кроме самой библиотеки (модулей Core, Audio, Image) в репозитории также находятся:

  • MusicSynthesizer - Синтезатор MIDI (обсуждение).
    По факту этот проект состоит только из одного файла с функцией main, а основной код синтезатора находится в модуле Audio.
  • Tests - Тесты производительности контейнеров, алгоритмов и сериализации и сравнение с аналогами из STL.
    Вообще тесты оформлены красиво с использованием цветного вывода в консоль. Кроме консоли результаты выводятся также в красивый HTML лог. Так что советую их позапускать и убедиться, что мои контейнеры и алгоритмы побеждают почти во всех тестах, причём во многих тестах в разы.
  • UnitTests - здесь сконцентрированы примеры использования библиотеки, которые по совместительству являются юнит-тестами. Тесты реализованы средствами самой библиотеки и в случае провала подробно описывают ошибку, включая описание почему assert провалился и трассировку стека. Ловятся даже сегфолты. Покрытие тестами пока небольшое, но со временем улучшается.
  • Bin2C - Утилита для преобразования файла в массив байт на C. В принципе такие вроде есть, но мне почему-то захотелось завелосипедить самому. Смотреть там особо нечего, но она использует мою библиотеку, поэтому находится в том же репозитории.
  • Ссылка на репозиторий: https://github.com/gammaker/Intra

    С помощью Travis CI реализована автоматическая сборка и тестирование всего, что попадает в репозиторий в 3 различных конфигурациях x 2 компилятора (GCC 4.8 и Clang 3.5). Теперь многие поломки не будут оставаться незамеченными и будут исправляться сразу.


    #1
    19:47, 6 сен. 2016

    gammaker
    > up
    lol

    #2
    19:56, 6 сен. 2016

    CapSopener
    > lol
    Спасибо, что апнул, теперь я могу убрать свой up.

    Вроде кто-то хотел устроить code review, где он?

    #3
    20:41, 6 сен. 2016

    Зачем в репозитории левые файлы, например студии и тд?

    #4
    20:48, 6 сен. 2016

    на линуксе у меня не собирается

    #5
    20:51, 6 сен. 2016

    HardMorg
    > Зачем в репозитории левые файлы, например студии и тд?
    Почему левые? Я помимо CMakeLists.txt предоставляю нативный проект студии с несколькими конфигурациями и настройками. Я считаю, это более удобно, чем проекты, сгенерированные CMake. К тому же я пока не до конца разобрался с CMake, чтобы полностью заменить им студию. Пока CMakeLists.txt на уровне "собирает с настройками по умолчанию и ладно".
    Build - для тех, кому лень компилить и кто просто хочет запустить и потестить.

    HardMorg
    > на линуксе у меня не собирается
    Ну в общем-то я это ожидал, у меня руки не дошли проверить на GCC. Хотя если попробовать Clang'ом, то есть вероятность, что соберётся.

    #6
    20:54, 6 сен. 2016

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

    #7
    20:55, 6 сен. 2016

    gammaker
    > Ну в общем-то я это ожидал, у меня руки не дошли проверить на GCC. Хотя если
    > попробовать Clang'ом, то есть вероятность, что соберётся.
    >
    >
    У меня смейк с ошибкой валится... может быть сам код и нормально бы скомпилился

    #8
    20:58, 6 сен. 2016

    Окей, посмотрим...

    forceinline-дроч не нужен.
    Русские каменты - тем более..
    Табы не нужны.
    > core::forward
    Што это?
    > Meta::TypeEquals<U, wchar_t>::_
    Што это?

    А примеры красивые. Стремные, но красивые.
    PS: Плюсик за натвис.

    #9
    21:03, 6 сен. 2016

    CMakeFileList.txt это шо? для это есть file команда симейка.
    Короче смейк не собирал потому что не мог найти файлы тестов

    #10
    21:03, 6 сен. 2016

    -Eugene-
    > core::forward
    присоединяюсь, шо это core::addressof ?

    #11
    21:16, 6 сен. 2016

    -Eugene-
    > forceinline-дроч не нужен.
    Если forceinline заменить на inline, производительность в некоторых тестах падает на 20%. И даже бинарник распухает, хотя как бы ожидается наоборот, что он из-за forceinline должен распухать.

    -Eugene-
    > Русские каменты - тем более..
    Вообще-то это в основном документация, которую я буду генерировать, когда таких комментариев накопится некоторая критическая масса. А потом планирую английский язык добавлять. Будет документация на двух языках. От родного русского я отказываться не собираюсь.

    -Eugene-
    > Табы не нужны.
    Это ещё почему? Я знаю, что есть на эту тему холивары, но особо в них не участвовал. Я не нашёл ни одной причины, почему табы нежелательны.

    -Eugene-
    > Што это?
    Это отказ от STL и вообще всех стандартных и сторонних хидеров в моих хидерах. А этот требует объявления своих forward, move, memcpy, и реализации своих type_traits, которые кстати более читабельные и компактные, и вообще обеспечивают единство стиля моей библиотеки.

    -Eugene-
    > А примеры красивые. Стремные, но красивые.
    Чем стремные?

    -Eugene-
    > PS: Плюсик за натвис.
    Кстати, да, забыл его упоминуть. Даже сложные диапазоны с ним становятся легко читабельными и отлаживаемыми. И в отличие от STL у меня сразу отображается несколько элементов контейнера без его раскрытия в отладчике.


    HardMorg
    > У меня смейк с ошибкой валится... может быть сам код и нормально бы скомпилился
    Что за ошибка? У меня под виндой всё без ошибок.

    HardMorg
    > cmake может генерить студиный проект, нафига захламлять репозиторий
    Я же написал, что родной настроенный руками студийный проект удобнее и функциональнее. По крайней мере, пока я не разобрался со всеми тонкостями CMake. По моему он ничем не мешает. Основной мусор я выкинул. Кстати, тем, кто использует мой проект студии, учитите, что промежуточные файлы складываются в папку Cache на уровне выше, чем Solution. В моём случае эта папка представляет собой папку на рамдиске и подчищается автоматически при перезагрузке.

    HardMorg
    > Снова таки с помощь смейка, можно было генерить разные проекты.. например
    > просто собрать твою либу, что бы ее можно было подключить к своему проекту, или
    > же собрать отдельно тесты..
    Ну так есть же CMake, при чём тут тогда студийный проект? Надо просто разобраться, что там за ошибки под линуксом...

    HardMorg
    > CMakeFileList.txt это шо? для это есть file команда симейка.
    Это список файлов, которые нужно включить. file добавит всё подряд, но не всегда нужно добавлять всё подряд. Иногда бывают мёртвые исходники, которые не нужно включать в сборку, но не хочется выносить наружу. И ещё у file(GLOB ...) есть проблема, что CMake сам не обнаружит изменений и не перестроит проект, когда надо. Поэтому его не рекомендуют использовать.

    HardMorg
    > присоединяюсь, шо это core::addressof ?
    Это аналог std::addressof. Как я уже объяснил, это чтобы отвязаться от всех хидеров кроме своих.

    #12
    21:23, 6 сен. 2016

    gammaker
    > Ну так есть же CMake, при чём тут тогда студийный проект? Надо просто
    > разобраться, что там за ошибки под линуксом...
    >
    >
    При том что это говнокод, если бы мне нужен был студи  ный проект я бы загенерил его одной кномкой, посмотри какой-нибудь опен сорс проект, как там все делают

    #13
    21:28, 6 сен. 2016

    gammaker
    > Если forceinline заменить на inline, производительность в некоторых тестах
    > падает на 20%. И даже бинарник распухает, хотя как бы ожидается наоборот, что
    > он из-за forceinline должен распухать.
    В релизе? Серьезно? Хм, интересно было бы это изучить.

    > Это ещё почему? Я знаю, что есть на эту тему холивары, но особо в них не
    > участвовал. Я не нашёл ни одной причины, почему табы нежелательны.
    Наверное потому, что имеют произвольную длину? В Notepad код выглядит одним образом, в Notepad++ - вторым, в FAR-е - третьим, в гите - четвертым, а в студии пятым. Ну и нахрен такое надо?
    А настройка ширины табов под себя - это миф. Если код хорошо оформлен, ему это не нужно, а если плохо - он просто расползется еще больше.

    > Это аналог std::addressof
    Почему имена не в нотации всей библиотеки?

    И ты не ответил про _
    Что это за хрень?

    > Чем стремные?
    Рефлекторное отторжение необычных конструкций и громоздких библиотек, пожалуй. И все.

    #14
    21:31, 6 сен. 2016

    gammaker
    > Это список файлов, которые нужно включить. file добавит всё подряд, но не
    > всегда нужно добавлять всё подряд. Иногда бывают мёртвые исходники, которые не
    > нужно включать в сборку, но не хочется выносить наружу. И ещё у file(GLOB ...)
    > есть проблема, что CMake сам не обнаружит изменений и не перестроит проект,
    > когда надо. Поэтому его не рекомендуют использовать.
    Так ты можешь отфильтровать то что тебе не нужно, какие проблемы?
    Да, смайк не может узначить что были добавлены новые файлы.., ну ок..  тебе нужно просто снова запустить симейк и все, а так тебе нужно постоянно править CMakeFileList.txt этот файл, а если проект большой сотны а то и тысячи файлов, все так добавлять?
    И вообще, нафига нужен тот код который не будет собираться??? тогда держи его локально и добавишь в репозиторий когда он будет нужен

    Страницы: 1 2 313 14 Следующая »
    ПроектыФорумУтилиты