#ifndef FELIX_THE_CAT_DIFFERENT_LIBRARY_INCLUDED_AKJGNKJABVKALJGLKAJGLAKJG #define FELIX_THE_CAT_DIFFERENT_LIBRARY_INCLUDED_AKJGNKJABVKALJGLKAJGLAKJG #include #include #include #include #include using namespace std; template string ToString(const T& a) { ostringstream oss; oss.setf(ios::fixed | ios::showpoint); oss.precision(10); oss << a; return oss.str(); } ostream& operator<<(ostream &out, const pthread_mutex_t m); void LockMutex(pthread_mutex_t &m); void ReleaseMutex(pthread_mutex_t &m); int Round(double v); // конвертирует из CP866 (в котором часто девайсы шлют всякую фигню) // в UTF-8 (в котором весь наш код), чтобы можно было сравнивать строки // и не иметь в исходниках две кодировки // src предполагается нуль-терминированным void CP866ToUTF8(unsigned char *src, unsigned char *dest, int destlen); // То же самое для CP1251 void CP1251ToUTF8(const unsigned char *src, unsigned char *dest, int destlen); string CP1251ToUTF8(const string &src); // распаковывает BCD-число. Сделано в виде функции, а не макроса, чтобы // можно было подставлять в нее функции, изменяющие состояние параметров int UnpackBCD(int a); // аналогично, упаковывает BCD-число int PackBCD(int a); // проверяет, является ли a валидным BCD-байтом bool CheckBCD(int a); // получает количество миллисекунд с начала эпохи (иногда нужно для) // всяких точных таймаутов при приеме/отправке unsigned long long GetMilliseconds(); // заменяет в text все вхождения pattern на replacement // аккуратно со случаем, когда replacement содержит pattern - может повиснуть (!) string ReplaceAll(string text, string pattern, string replacement); // конвертирует число в строку в заданной base string IntToString(int a, int base = 10); // поднимает до упора лимит на количество открытых дескрипторов int RaiseFDLimit(); #endif