CommonLib 7.0
Biblioteka CommonLib
Wersja: 7.0
Data: 3 listopada 2007
Wstęp
CommonLib to uniwersalna biblioteka dla C++ zawierająca różnorodne elementy.
Powstała przy okazji pisania silnika graficznego i różnych innych moich projektów.
Obecna wersja jest pisana od wakacji 2006.
Właściwie od dziecka, odkąd tylko zacząłem programować (wtedy to był jeszcze
Turbo Pascal pod DOS) zawsze rozwijałem jakąś swoją bibliotekę modułów bazowych,
z którymi potem nigdy się nie rozstawałem pisząc swoje projekty.
Teraz uważam, że nadal jest to potrzebne - szczególnie w C++, którego biblioteka
standardowa - w przeciwieństwie do nowoczesnych języków i środowisk programowania
takich jak Delphi, C# czy Java - jest bardzo uboga, a to co zawiera pozostawia
wiele do życzenia.
Cechy i założenia
- Jest przenośna - Windows i Linux.
- Używa tylko biblioteki standardowej C, C++ oraz API systemowego.
- Do przechowywania wszelkich łańcuchów stosuje typ string z biblioteki C++.
- Do obsługi błędów stosowane są wyjątki klas z modułu Error.
Jedynie funkcje wykonujące proste obliczenia lub konwersje nigdy nie rzucają wyjątków.
- Nastawiona jest na maksymalną wydajność, ale nie kosztem kontroli błędów.
Bardzo ważna jest też wygoda.
- Wymaga dobrego kompilatora C++, ponieważ używa zaawansowanych cech języka
takich jak częściowa specjalizacja szablonów.
Kompilacja była testowana na Visual C++ 2005 oraz GCC 4.
- Wszystkie elementy zgromadzone są w przestrzeni nazw common.
- Komentarze w kodzie oraz dokumentacja są po polsku.
Identyfikatory w kodzie są po angielsku.
- Komentarze nie są w formacie Doxygen ani innym specjalnym.
- Pliki z kodem (łącznie z wpisanymi do nich łańcuchami) i dokumentacją mają polskie znaki
w kodowaniu Windows-1250 z końcami wiersza w formacie Windows ("\r\n").
Biblioteka posiada funkcje do konwersji polskich znaków i końców wiersza.
- Nie wspiera Unikodu.
- Polega na rozmiarze, a nawet budowie bitowej typów atomowych takich jak
znaki, liczby całkowite i zmiennoprzecinkowe. Przez to nie nadaje się do użycia
na platformach z inną endianowością czy 64-bitowych.
Jak użyć
Biblioteki można użyć na trzy sposoby:
- Skompilować całą jako bibliotekę statyczną LIB, ustawić ścieżki do pliku
LIB i plików HPP w swoim środowisku programowania i używać jako biblioteki.
- Skopiować wszystkie lub wybrane moduły do źródeł swojego projektu.
- Skopiować do źródeł swojego projektu wybrane funkcje i klasy.
Składniki i możliwości
Moduł Base
Moduł podstawowy
» Base.hpp - nagłówek
» Base.txt - dokumentacja
- Podstawy:
- Włącza:
<cassert>, <string>, <vector>
- Definiuje:
using std::string;
- Typy całkowitoliczbowe:
uint1, uint2, uint4, uint8
int1, int2, int4, int8
- Różne drobne, użyteczne makra i funkcje
- Operator dosłownej reinterpretacji bitowej absolute_cast
- Inteligentne wskaźnki i uchwyty
- Parametryzowane polityką zwalniania
- Z wyłączną własnością lub ze zliczaniem referencji
- Funkcje do operacji na znakach i łańcuchach, w tym oprócz prostych także:
- Konwersja między stronami kodowymi:
Windows-1250, ISO-8859-2, IBM CP852, UTF-8
- Dopasowanie do maski ze znakami wieloznacznymi '*' i '?'
- Odległość edycyjna łańcuchów - Levenshtein Distance
- Porównywanie łańcuchów w tzw. porządku naturalnym
- Funkcje do operacji na ścieżkach do plików
- Działające zarówno dla ścieżek Windows jak i Linux
- Konwersje różnych typów do i z łańcucha znaków, w tym:
- Własne IntToStr, StrToInt, UintToStr, StrToUint sprawdzające błędy składni i
zakresu
- Uogólniony, rozszerzony mechanizm konwersji zrealizowany za pomocą szablonów
SthToStr i StrToSth
- Wygodny mechanizm formułowania łańcuchów korzystający z powyższego, np.:
string s = Format("x=#, y=#") % x % y;
- Dokładny pomiar czasu i czekanie określony czas
- Podstawowe typy, stałe, makra i funkcje matematyczne, w tym oprócz prostych
także:
- Funkcja wygładzająca metodą Critically Damped Smoothing
- Funkcje okresowe - sinus, trójkąta, prostokątna, piłokształtna, PWM
- Generator liczb pseudolosowych
- Bardzo szybki, deterministyczny
- Losowanie liczb różnych typów
- Generowanie losowych danych binarnych
- Losowanie liczb o rozkładzie normalnym (Gaussa)
- Generator unikatowych identyfikatorów
- Parser parametrów przekazanych z wiersza poleceń
- Szybki i prosty w użyciu
- Wsparcie zarówno dla main (int argc, char **argv), jak i WinMain (char
*CmdLine)
- Obsługuje opcje krótkie (jednoznakowe) i długie (wieloznakowe), w formatach:
- Linuksa: -a -b -c -abc --długa -lARG -l ARG -l=ARG
- Windowsa: /a /b /c /długa /lARG /l ARG /l=ARG
- Klasa bazowa dla wzorca projektowego Singleton
Moduł Config
Obsługa plików konfiguracyjnych
» Config.hpp - nagłówek
» Config.txt - dokumentacja
Obsługuje hierarchiczne pliki konfiguracyjne o składni wzorowanej na C/C++.
Moduł DateTime
Data i czas
» DateTime.hpp - nagłówek
» DateTime.txt - dokumentacja
- Dostępne typy:
- WEEKDAY - Dzień tygodnia
- MONTH - Miesiąc roku
- NAME_FORM - Sposób generowania nazw dla dni tygodnia i miesięcy
- DATESPAN - Reprezentuje odcinek czasu jako liczbę lat, miesięcy, tygodni i dni
- TIMESPAN - Reprezentuje odcinek czasu jako liczbę milisekund
- TMSTRUCT - Reprezentuje moment czasu jako pola: dzien, miesiąc, rok,
godzina, minuta, sekunda, milisekunda oraz dzień tygodnia
- DATETIME - Reprezentuje moment czasu jako liczbę milisekund od 1 stycznia 1970.
- Dokładne pobieranie bieżącego czasu
- Konwersja do i z łańcucha, dowolne formatowanie
- Konwersje między typami daty i czasu - z tej biblioteki oraz z biblioteki standardowej C
- Przeładowane operatory
Moduł Error
Klasy wyjątków do obsługi błędów
» Error.hpp - nagłówek
» Error.txt - dokumentacja
- Ujednolicony mechanizm obsługi błędów w programie z użyciem wyjątków C++
- Wyjątek przechowuje stos komunikatów
- Makra ułatwiające obsługę błędów
- Wsparcie dla błędów zgłaszanych przez: errno, Win32API, SDL, OpenGL,
DirectX, FMOD, WinSock, DevIL, AVIFile
Moduł Files
Obsługa plików i systemu plików
» Files.hpp - nagłówek
» Files.txt - dokumentacja
- FileStream - klasa strumienia do zapisywania i odczytywania treści pliku
- DirLister - klasa do listowania zawartości katalogu
- Funkcje do operacji na systemie plików, w tym:
- Zapisywanie i odczytywanie całych plików
- Sprawdzanie, czy plik albo katalog istnieje
- Odczytywanie i zapisywanie daty modyfikacji, utworzenia i ostatniego dostępu
- Tworzenie, usuwanie, zmiana nazwy i przenoszenie plików i katalogów
Moduł FreeList
Bardzo szybki alokator pamięci
» FreeList.hpp - nagłówek
» FreeList.txt - dokumentacja
Szablony klas FreeList oraz DynamicFreeList.
Obiekty tych klas to napisane we własnym zakresie
alokatory przeznaczone do alokowania dużych ilości zmiennych jednego wybranego
typu, które działają znacząco szybciej niż standardowe operatory new i delete.
Moduł Logger
Mechanizm logowania komunikatów
» Logger.hpp - nagłówek
» Logger.txt - dokumentacja
- Bezpieczny wątkowo.
- Opcjonalnie logowaine odbywa się w osobnym wątku.
- Uogólnienie logów:
Log to abstrakcyjny obiekt, którym może być plik, konsola i dowolne inne
miejsce. Można pisać własne logi.
- Rozdzielenie komunikatów od logów:
Zapisywane komunikaty trafiają do centralnego loggera, a stamtąd dopiero każdy
jest mapowany na zero, jeden lub więcej logów.
- Uogólniony podział komunikatów:
Komuniaty są opisywane przez maskę bitową, która może oznaczać kategorię,
priorytet lub cokolwiek i którą można wykorzystać do mapowania na logi
docelowe, na prefiksy, kolory i dowolne inne rzeczy zależnie od loga.
Moduł Math
Moduł matematyczny
» Math.hpp - nagłówek
» Math.txt - dokumentacja
- Wsparcie dla obiektów geometrycznych:
- Punkt 2D, prostokąt 2D, prosta 2D
- Wektor 2D, 3D, 4D
- Macierz 4x4
- Kwaternion
- Płaszczyzna 3D
- Prostopadłościan
- Kolor
- Promień/prosta 3D
- Sfera
- Trójkąt 3D
- Frustum
- Kolizje między różnego rodzaju obiektami geometrycznymi
- Tablice liczb losowych o rozkładzie progresywnego Poisson Disc
Moduł Stream
Hierarchia klas strumieni
» Stream.hpp - nagłówek
» Stream.txt - dokumentacja
- Stream - klasa bazowa strumieni
- SeekableStream - klasa bazowa strumieni z obsługą długości i kursora
- CharWriter - klasa przyspieszająca zapisywanie do strumienia po znaku
- CharReader - klasa przyspieszająca odczytywanie ze strumienia po znaku
- MemoryStream - strumień do bloku pamięci o stałym rozmiarze
- VectorStream - strumień do samorozszerzającego się bloku pamięci
- StringStream - strumień do łańcucha typu string
- OverlayStream - klasa bazowa nakładek na strumienie
- CounterOverlayStream - nakładka zliczająca zapisywane i odczytywane dane
- LimitOverlayStream - nakładka ograniczająca ilość zapisywanych i odczytywanych
danych
- MultiWriterStream - strumień zapisujący na raz do wielu strumieni
- Hash_Calc - strumień liczący hash
- CRC32_Calc - strumień liczący sumę kontrolną CRC32
- MD5_Calc - strumień liczący sumę kontrolną MD5
- XorCoder - strumień szyfrujący i deszyfrujący dane operacją XOR
- BinEncoder, BinDecoder - strumień kodujący, dekodujący dane binarne jako ciąg
zer i jedynek. Szczyt bezużyteczności :) Każdy bajt zamienia na 8 znaków.
- HexEncoder, HexDecoder - strumień kodujący, dekodujący dane binarne jako ciąg
liczb szesnastkowych. Każdy bajt zamienia na 2 znaki.
- Base64Encoder, Base64Decoder - strumień kodujący, dekodujący dane binarne w
formacie Base64. Każde 3 bajty zamienia na 4 znaki.
- RingBuffer - bufor kołowy.
Moduł Threads
Biblioteka do wielowątkowości i synchronizacji
» Threads.hpp - nagłówek
» Threads.txt - dokumentacja
- Thread - klasa wątku
- Obiekty synchronizujące:
- Mutex - muteks
- Klasa pomocnicza MutexLock i makro MUTEX_LOCK
- Semaphore - semafor zliczający
- Cond - zmienna warunkowa
- Barrier - bariera
- Event - zdarzenie (auto-reset lub manual-reset)
Moduł ZlibUtils
Moduł wspmagający biblioteki zlib
» ZlibUtils.hpp - nagłówek
» ZlibUtils.txt - dokumentacja
- ZlibCompressionStream - strumień kompresji danych do formatu zlib
- GzipCompressionStream - strumień kompresji danych do formatu gzip
- ZlibDecompressionStream - strumień dekompresji danych z formatu zlib
- GzipDecompressionStream - strumień dekompresji danych z formatu gzip
- GzipFileStream - strumień zapisu i odczytu pliku w formacie gzip (.gz)
Mini FAQ
Skąd taka nazwa?
W moim głównym kodzie, z którego biblioteka się wywodzi, mam w Visual C++
w Solution szereg projektów. Jednym z nich jest silnik graficzny, innym
pomocnicze narzędzie konsolowe czy program testujący. Kod wspólny dla wszystkich
projektów zgromadziłem w katalogu, który nazwałem Common i tak już zostało.
Skąd taka wersja?
Faktycznie nie było CommonLib 4 czy 5, a wersja 6.1 była tak różna od 6.0,
że powinna się nazywać 7.0. Jednak chciałem zrównać numerację biblioteki
z numeracją mojego głównego projektu - silnika graficznego, na potrzeby
którego napisałem tą bibliotekę.
Co nowego?
Wersja 7.0 (3 listopada 2007)
Biblioteka była przez ostatnie miesiące uzupełniana i poprawiana na bieżąco
wraz z rozwojem silnika graficznego 3D, na potrzeby którego powstała.
- Moduł Base
- Dodane nowe funkcje do obsługi surowej pamięci:
CompareMem i FillMem.
- Dodana funkcja do rozwiązywania równania kwadratowego: QuadraticEquation.
- Dodane funkcje generujące szum: PerlinNoise1/2/3 i BrownianNoise1/2/3.
- Zmiana w RandomGenerator: metody RandUint i RandInt losują teraz liczby
z wyłączeniem górnej granicy (max).
- Moduł Error
- Dodane makra dla wygody:
ERR_GUARD_BOOL, ERR_GUARD_DIRECTX, ERR_GUARD_BOOL_D, ERR_GUARD_DIRECTX_D
- Poprawiony błąd w funkcji MustStrToSth.
- Moduł Math
- Dodana funkcja PerpedicularVectors - oblicza dwa dowolne wektory prostopadłe do danego.
- Dodana funkcja ColorDistance - zwraca "odległość" dwóch kolorów.
- Dodana funkcja CapsuleVolume licząca objętość kapsuły.
- Dodane funkcje SphereInBox i BoxInSphere.
- Dodane funkcje do kolizji trójkąta z prostpadłościanem: TriangleInBox, TriangleToBox.
- Dodane funkcje do kolizji z płaskim wielokątem w 3D: PointInPolygon, RayToPolygon.
- Dodane funkcje do kolizji poruszających się obiektów: SweptSphereToSphere, SweptBoxToBox.
- Dodane funkcje do losowania punktów z wnętrza brył:
RandomPointInUnitSphere, RandomPointInUnitCircle, RandomPointInCapsule.
- Ulepszona funkcja RayToTriangle - teraz można wybrać czy ma być Backface Culling.
- Poprawione błędy w funkcjach:
LinesIntersection,
RotationYawPitchRoll, RotationYawPitchRollInv,
Normalize (do kwaterninów),
Log (do kwaternionów),
ClosestPointOnLineSegment,
RayToSphere.
- Moduł Stream
- Dodana nowa klasa strumienia: RingBuffer - bufor kołowy.
- Moduł Tokenizer
- Dodane metody do klasy Tokenizer czyniące parsowanie jeszcze wygodniejszym:
QueryToken, QueryEOF, QueryEOL, QuerySymbol, QueryIdentifier, QueryKeyword,
AssertToken, AssertIdentifier.
- Poprawiony błąd tokenizacji liczb.
- Poprawione metody GetUint*, GetInt*, MustGetUint*, MustGetInt*, GetFloat, GetDouble -
w przypadku błędu zamiast wykonywać assert rzucają wyjątek błędu tokenizacji.
Wersja 6.1 (29 czerwca 2007)
Od wersji 6.0 biblioteka zmieniła się właściwie nie do poznania.
Dlatego nie ma sensu wypisywać zmian.
Szczególnie, że pewnie nikt z niej wcześniej nie korzystał :P
Licencja
Biblioteka dostępna jest na licencji GNU LGPL, co znaczy m.in., że
masz dostęp do jej kodu źródłowego oraz że możesz używać jej za darmo
w dowolnych swoich programach, także zamkniętych.
» Licencja GNU LGPL
Autor
Adam Sawicki
E-mail: sawickiap@poczta.onet.pl
WWW: http://regedit.gamedev.pl
IRC: #warsztat @ PolNet
Gadu-Gadu: 2272474