Войти
ПроектыФорумОцените

Gammaker Template Library

Страницы: 1 2 3 4 Следующая »
#0
15:15, 9 мар 2014

Содержит:
- Строки (string) с счётчиком ссылок и частичной поддержкой UTF-8
- Удобные классы для работы с Юникодом
- Динамические массивы array<T>
- Потоки ввода-вывода с файлами и консолью
- Математическая библиотека в стиле GLSL
Особенности: более понятные имена методов в стиле .NET, высокая производительность
Минусы: пока нет даже минимальной поддержки многопоточности
Язык: C++11

Это всё я создал за годы программирования своего движка после отказа от STL. Уже несколько тем скатывались в оффтоп из-за обсуждения моего творчества, и я наконец решил всё выложить и оформить это в виде проекта.

Если я ничего не забыл из зависимостей, то всё должно компилироваться начиная с Visual Studio 2013 и в достаточно новых версиях g++ и clang.
Нужно лишь настроить правильные пути включаемых файлов в настройках проекта, а также сделать, чтобы Core/Core.h подключался автоматически.

Файл GammakerContainersTest.cpp содержит тесты сравнения производительности моих классов с аналогами из стандартной библиотеки.
Как видно из этих тестов, по большинству параметров мои велосипеды обходят STL, а по некоторым из них даже с огромным отрывом. Не знаю, насколько это изменится с добавлением поддержки многопоточности, но, мне кажется, незначительно.
Поддержки многопоточности нет, потому что я никогда не писал многопоточных приложений и не очень хорошо в этом разбираюсь. Так же придётся либо всё же поступиться со своими принципами и использовать многопоточные функции STL, либо pthread, либо делать свои кроссплатформенные обёртки. Но пока это далеко не в приоритете.

Скачать: Gammaker Template Library

#1
22:16, 9 мар 2014

gammaker
> частичной поддержкой UTF-8
это как?

#2
22:32, 9 мар 2014

Помеха
> это как?
Это значит, что многие алгоритмы (поиск одного из списка символов, обрезка строки по краям) требуют, чтобы эти символы состояли только из ascii символов и не будут работать, если им попадётся utf-8 символ. Но хранить, конкатенировать и форматировать такие строки можно. Так же есть итератор для посимвольного перебора строки.
В общем, можешь посмотреть исходники. Там в комментариях подписано, как их можно использовать, а как нельзя.

#3
1:14, 10 мар 2014

Ничего личного, конечно, но мапа с доступом по ключу за O(n) - это эпично.

#4
3:44, 10 мар 2014

gammaker
это не связано с джижком Game Maker, правильно? А вот по названию многие подумают, что связано.

А с gcc будет пахать?

#5
8:48, 10 мар 2014

Hardcode
> мапа с доступом по ключу за O(n) - это эпично.
Именно поэтому я её в списке "содержит" не указал. И тестов для неё не делал. Считай, что её там нет.

Бур@нчик
> это не связано с джижком Game Maker, правильно?
Нет, это связано только с моим ником. Правда он когда-то произошёл от Gsme Maker, но это уже история.

Бур@нчик
> А с gcc будет пахать?
Я пару недель назад компилировал им. Но за эти две недели могло что-нибудь измениться и появиться пара ошибок компиляции, которые легко исправить.

#6
9:22, 10 мар 2014
//Побитовое копирование
template<typename T> static void CopyBits(T* dst, const T* src, uintptr count)
{memcpy(dst, src, count*sizeof(T));}

Ээ, точно побитовое?

#7
9:26, 10 мар 2014

>static_assert(sizeof(char)==1 && sizeof(short)==2 && sizeof(int)==4 && sizeof(long long)==8, "Типы имеют неожиданный размер!");
"неожиданный размер" - эпично )

#8
11:31, 10 мар 2014

gammaker

Любитель велосипедов? Запили аналог дишного unittest {}

#9
12:27, 10 мар 2014

nes
> Ээ, точно побитовое?
Ну конечно, какое же ещё? memcpy производит тупое копирование памяти без всяких конструкторов.

nes
> "неожиданный размер" - эпично )
Ну как бы да. Код предполагает, что размеры типов именно такие. Если это не так, например, на каких-нибудь редких платформах, то могут начаться неожиданные вещи. Ты предлагаешь назвать ошибку как-то по-другому?

Hardcode
> Любитель велосипедов?
Как видишь, да :)

Hardcode
> Запили аналог дишного unittest {}
Вот только как их вызывать при запуске? Можно конечно сделать через инициализацию глобальных переменных, но если какой-то тестируемый код завязан на других глобальных объектах, то он не будет работать.
И ещё нужно как-то генерить уникальные имена препроцессором. Есть ли единый стандартный механизм для этого, чтобы его поддерживали все компиляторы?

#10
12:33, 10 мар 2014
Идея       -  4 /5
Количество -  3 /5
Оформление -  2+/5
==================
Итого      -  4-/5
Изображение

Предлагаю обсудить UTF8, ибо я так и не понял в каких случаях оно бы отвалилось (в общем случае)...

Кстати, #pragma execution_character_set("utf-8") стоит только 1 раз в внутри прожекта объявить или в каждый исходник пропихивать?

И если мы говорим про cpp, то лучше отказываться от Си-кастов!

#11
12:46, 10 мар 2014

gammaker
Объекты регистрируют себя в глобальном связном списке с помощью глобальных переменных, потом в мейне их можно всех вызвать одной строчкой. Уникальные имена можно генерить с помощью __LINE__, можешь еще завернуть нагенеренные объекты в анонимный неймспейс, что бы их нельзя было снаружи модуля увидеть.

#12
12:49, 10 мар 2014

gammaker
>Ну конечно, какое же ещё? memcpy производит тупое копирование памяти без всяких конструкторов.
А может все-таки побайтовое? )

>Ну как бы да. Код предполагает, что размеры типов именно такие. Если это не так, например, на каких-нибудь редких платформах, то могут начаться неожиданные вещи. Ты предлагаешь назвать ошибку как-то по-другому?
Например так: "Ололо! Разрядность системы не определена!".

#13
13:23, 10 мар 2014

Балин, чето меня от собственной идеи торкнуло. Вот вам cpp unittests POC: UnittestsPOC

#14
13:26, 10 мар 2014

Лучше на GitHub

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

Тема в архиве.