cpputil/README.md
green-caterpillar 2ed2440710 Update README.md
2014-09-16 23:16:58 +04:00

65 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 потоками
``` cpp
threadpool pool(4);
```
Добавим задачу в виде глобальной функции с параметрами
```cpp
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<void()> func = []{ std::cout << "Hello world!" << std::endl; };
pool.add_task(func);
pool.add_task<int>([]{ return 42; });
```
Все варианты **add_task** возвращают **std::future**, что позволяет дождаться окончания выполнения задач и получить резульаты (а заодно гарантирует проброс исключений изнутри задач)
``` cpp
threadpool pool(4);
std::vector<std::future<int>> vec;
for (std::size_t i = 0; i < 100; ++i)
{
std::future<int> fut = pool.add_task<int>([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;
}
```