cpputil ======= На данный момент в библиотеке есть следующее: * **ustring** - класс строки с внутренним представлением в UCS-4 и возможностью кодирования/декодирования UTF-8, UTF-16 и UTF-32 (little endian и big endian). Также распознает/вставляет BOM и экранированные USC-2 (\uXXXX) и USC-4 (\UXXXXXXXX) символы * **logger** - класс логирования. Нацелен на максимальное быстродействие (непосредственно запись в лог происходит в отдельном потоке) * **threadpool** - простой пул потоков, позволяет удобно добавлять задачи в пул и получать результаты ## Примеры кода #### threadpool Создадим пул с 4 потоками ```C++ threadpool pool(4); ``` Добавим задачу в виде глобальной функции с параметрами ```C++ int add(int x, int y) { return x + y; } pool.add_task(&add, 1, 2); ``` или член класса ```cpp class foo { public: void bar(std::string str) { std::cout << str << std::endl; } }; foo f; // тип параметров должен точно совпадать, т.е. нельзя напсать просто "hello world!" // потому что это const char*, а не std::string pool.add_task(&foo::bar, &f, std::string("hello world!")); ``` можно добавить стандартный функтор или лябду (в последнем случае потребуется явно указать тип возаращаемого значения) ```cpp std::function func = []{ std::cout << "Hello world!" << std::endl; }; pool.add_task(func); pool.add_task([]{ return 42; }); ``` Все варианты **add_task** возвращают **std::future**, что позволяет дождаться окончания выполнения задач и получить резульаты (а заодно гарантирует проброс исключений изнутри задач) ```cpp threadpool pool(4); std::vector> vec; for (std::size_t i = 0; i < 100; ++i) { std::future fut = pool.add_task([i] { return i; }); vec.push_back(std::move(fut)); } for(std::size_t i = 0; i < 100; ++i) { std::cout << "res[" << i << "] = " << vec[i].get() << std::endl; } ```