Compare commits

9 Commits

Author SHA1 Message Date
db954ffdaa version 5.5.0
add PIIODevice::threadedReadTimeout
2025-09-29 18:48:20 +03:00
8d6ae976a3 remove comment 2025-09-26 21:38:41 +03:00
e767fae934 merge pscreen_win_u16 2025-09-26 21:35:36 +03:00
5db97ca959 version 5.4.0
remove CORS default header from PIHTTPServer
fix several docs
fix PIMathVector::dot return type
add units directory with PIUnits facility
2025-09-26 21:33:45 +03:00
daab41e41e add options for fftw3 precisions
configureFromFullPathDevice for all devices now trim() components
2025-09-23 21:16:54 +03:00
a61c8477c7 fix PIMap operator<<(PIMap) error for size=2 2025-09-22 22:34:06 +03:00
788ad8f2c0 PIVariant::toNum from mathvector safety fix 2025-09-22 20:58:58 +03:00
78afc179c4 PIVariant::toNum now from mathvector 2025-09-22 16:26:09 +03:00
69ec4c9837 .clang-format 2025-09-21 21:08:18 +03:00
42 changed files with 1934 additions and 572 deletions

View File

@@ -134,8 +134,8 @@ JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
LambdaBodyIndentation: Signature
MacroBlockBegin: "PRIVATE_DEFINITION_START|STATIC_INITIALIZER_BEGIN"
MacroBlockEnd: "PRIVATE_DEFINITION_END|PRIVATE_DEFINITION_FINISH|STATIC_INITIALIZER_END"
MacroBlockBegin: "PRIVATE_DEFINITION_START|STATIC_INITIALIZER_BEGIN|DECLARE_UNIT_CLASS_BEGIN"
MacroBlockEnd: "PRIVATE_DEFINITION_END|PRIVATE_DEFINITION_END_NO_INITIALIZE|STATIC_INITIALIZER_END|DECLARE_UNIT_CLASS_END"
MaxEmptyLinesToKeep: 2
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto

View File

@@ -5,7 +5,7 @@ if (POLICY CMP0177)
endif()
project(PIP)
set(PIP_MAJOR 5)
set(PIP_MINOR 3)
set(PIP_MINOR 5)
set(PIP_REVISION 0)
set(PIP_SUFFIX )
set(PIP_COMPANY SHS)
@@ -69,6 +69,9 @@ option(STD_IOSTREAM "Building with std iostream operators support" OFF)
option(INTROSPECTION "Build with introspection" OFF)
option(TESTS "Build tests and perform their before install step" OFF)
option(COVERAGE "Build project with coverage info" OFF)
option(PIP_FFTW_F "Support fftw module for float" ON)
option(PIP_FFTW_L "Support fftw module for long double" ON)
option(PIP_FFTW_Q "Support fftw module for quad double" OFF)
set(PIP_UTILS 1)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
set(CMAKE_CXX_STANDARD 11)
@@ -436,8 +439,23 @@ if (NOT CROSSTOOLS)
if (PIP_BUILD_FFTW)
# Check if PIP support fftw3 for PIFFT using in math module
set(FFTW_LIB_NAME fftw3)
set(FFTW_LIB_SUFFIXES "" "f" "l" "q")
set(FFTW_LIB_SUFFIXES "")
if (PIP_FFTW_F)
list(APPEND FFTW_LIB_SUFFIXES "f")
endif()
if (PIP_FFTW_L)
list(APPEND FFTW_LIB_SUFFIXES "l")
endif()
if (PIP_FFTW_Q)
list(APPEND FFTW_LIB_SUFFIXES "q")
endif()
if (NOT "${FFTW_LIB_SUFFIXES}" STREQUAL "")
set(FFTW_LIB_SUFFIXES ";${FFTW_LIB_SUFFIXES}")
else()
list(APPEND FFTW_LIB_SUFFIXES "" "_")
endif()
set(FFTW_LIB_SUFFIXES2 "" "-3")
set(FFTW_MSG "")
set(FFTW_LIBS)
set(FFTW_ABS_LIBS)
set(CMAKE_REQUIRED_INCLUDES fftw3.h)
@@ -452,6 +470,10 @@ if (NOT CROSSTOOLS)
set(${FFTW_CLN}_FOUND FALSE)
set(${FFTW_CLNT}_FOUND FALSE)
if(${FFTW_CLN}_LIBRARIES)
if (NOT "${FFTW_MSG}" STREQUAL "")
set(FFTW_MSG "${FFTW_MSG}, ")
endif()
set(FFTW_MSG "${FFTW_MSG}${FFTW_CLN}")
set(${FFTW_CLN}_FOUND TRUE)
list(APPEND FFTW_LIBS "${FFTW_CLN}")
list(APPEND FFTW_ABS_LIBS "${${FFTW_CLN}_LIBRARIES}")
@@ -475,7 +497,7 @@ if (NOT CROSSTOOLS)
endforeach()
endforeach()
if(FFTW_LIBS)
pip_module(fftw "${FFTW_LIBS}" "PIP FFTW support" "" "" "")
pip_module(fftw "${FFTW_LIBS}" "PIP FFTW support" "" "" " (${FFTW_MSG})")
endif()
endif()

Binary file not shown.

View File

@@ -20,7 +20,7 @@
<context>
<name>PIFile</name>
<message>
<location filename="../libs/main/io_devices/pifile.cpp" line="300"/>
<location filename="../libs/main/io_devices/pifile.cpp" line="296"/>
<source>Downsize is not supported yet :-(</source>
<translation>Уменьшение размера не поддерживается</translation>
</message>
@@ -66,6 +66,239 @@
<translation type="vanished">Предупреждение: PICrypt неактивен, для активации установите библиотеку sodium и пересоберите PIP</translation>
</message>
</context>
<context>
<name>PIUnits</name>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="88"/>
<source>E</source>
<translation>Э</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="85"/>
<source>G</source>
<translation>Г</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="84"/>
<source>M</source>
<translation>М</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="87"/>
<source>P</source>
<translation>П</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="92"/>
<source>Q</source>
<translation>Кв</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="91"/>
<source>R</source>
<translation>Рн</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="86"/>
<source>T</source>
<translation>Т</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="90"/>
<source>Y</source>
<translation>И</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="89"/>
<source>Z</source>
<translation>З</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="101"/>
<source>a</source>
<translation>а</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="95"/>
<source>c</source>
<translation>с</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="94"/>
<source>d</source>
<translation>д</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="100"/>
<source>f</source>
<translation>ф</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="82"/>
<source>h</source>
<translation>г</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="83"/>
<source>k</source>
<translation>к</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="96"/>
<source>m</source>
<translation>м</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="98"/>
<source>n</source>
<translation>н</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="99"/>
<source>p</source>
<translation>п</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="104"/>
<source>r</source>
<translation>рн</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="97"/>
<source>u</source>
<translation>мк</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="103"/>
<source>y</source>
<translation>и</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="102"/>
<source>z</source>
<translation>з</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="81"/>
<source>da</source>
<translation>да</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="88"/>
<source>exa</source>
<translation>экса</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="101"/>
<source>atto</source>
<translation>атто</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="81"/>
<source>deca</source>
<translation>дека</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="94"/>
<source>deci</source>
<translation>деци</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="85"/>
<source>giga</source>
<translation>гига</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="83"/>
<source>kilo</source>
<translation>кило</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="84"/>
<source>mega</source>
<translation>мега</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="98"/>
<source>nano</source>
<translation>нано</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="87"/>
<source>peta</source>
<translation>пета</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="99"/>
<source>pico</source>
<translation>пико</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="86"/>
<source>tera</source>
<translation>тера</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="95"/>
<source>centi</source>
<translation>санти</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="100"/>
<source>femto</source>
<translation>фемто</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="82"/>
<source>hecto</source>
<translation>гекто</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="97"/>
<source>micro</source>
<translation>микро</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="96"/>
<source>milli</source>
<translation>милли</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="91"/>
<source>ronna</source>
<translation>ронна</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="104"/>
<source>ronto</source>
<translation>ронто</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="103"/>
<source>yocto</source>
<translation>иокто</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="90"/>
<source>yotta</source>
<translation>иотта</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="102"/>
<source>zepto</source>
<translation>зепто</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="89"/>
<source>zetta</source>
<translation>зетта</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_prefix.cpp" line="92"/>
<source>quetta</source>
<translation>кветта</translation>
</message>
</context>
<context>
<name>PIBinLog</name>
<message>
@@ -253,47 +486,47 @@
<context>
<name>PIString</name>
<message>
<location filename="../libs/main/text/pistring.cpp" line="1787"/>
<location filename="../libs/main/text/pistring.cpp" line="1807"/>
<source>B</source>
<translation>Б</translation>
</message>
<message>
<location filename="../libs/main/text/pistring.cpp" line="1807"/>
<location filename="../libs/main/text/pistring.cpp" line="1827"/>
<source>EiB</source>
<translation>ЭиБ</translation>
</message>
<message>
<location filename="../libs/main/text/pistring.cpp" line="1804"/>
<location filename="../libs/main/text/pistring.cpp" line="1824"/>
<source>GiB</source>
<translation>ГиБ</translation>
</message>
<message>
<location filename="../libs/main/text/pistring.cpp" line="1802"/>
<location filename="../libs/main/text/pistring.cpp" line="1822"/>
<source>KiB</source>
<translation>КиБ</translation>
</message>
<message>
<location filename="../libs/main/text/pistring.cpp" line="1803"/>
<location filename="../libs/main/text/pistring.cpp" line="1823"/>
<source>MiB</source>
<translation>МиБ</translation>
</message>
<message>
<location filename="../libs/main/text/pistring.cpp" line="1806"/>
<location filename="../libs/main/text/pistring.cpp" line="1826"/>
<source>PiB</source>
<translation>ПиБ</translation>
</message>
<message>
<location filename="../libs/main/text/pistring.cpp" line="1805"/>
<location filename="../libs/main/text/pistring.cpp" line="1825"/>
<source>TiB</source>
<translation>ТиБ</translation>
</message>
<message>
<location filename="../libs/main/text/pistring.cpp" line="1809"/>
<location filename="../libs/main/text/pistring.cpp" line="1829"/>
<source>YiB</source>
<translation>ЙиБ</translation>
</message>
<message>
<location filename="../libs/main/text/pistring.cpp" line="1808"/>
<location filename="../libs/main/text/pistring.cpp" line="1828"/>
<source>ZiB</source>
<translation>ЗиБ</translation>
</message>
@@ -319,7 +552,7 @@
<context>
<name>PIProcess</name>
<message>
<location filename="../libs/main/system/piprocess.cpp" line="200"/>
<location filename="../libs/main/system/piprocess.cpp" line="316"/>
<source>&quot;CreateProcess&quot; error: %1</source>
<translation>Ошибка &quot;CreateProcess&quot;: %1</translation>
</message>
@@ -327,12 +560,12 @@
<context>
<name>PIVariant</name>
<message>
<location filename="../libs/main/types/pivariant.cpp" line="415"/>
<location filename="../libs/main/types/pivariant.cpp" line="418"/>
<source>Can`t initialize PIVariant from unregistered type &quot;%1&quot;!</source>
<translation>Невозможно инициализировать PIVariant из незарегистрированного типа &quot;%1&quot;!</translation>
</message>
<message>
<location filename="../libs/main/types/pivariant.cpp" line="393"/>
<location filename="../libs/main/types/pivariant.cpp" line="396"/>
<source>Can`t initialize PIVariant from unregistered typeID &quot;%1&quot;!</source>
<translation>Невозможно инициализировать PIVariant из незарегистрированного ID типа &quot;%1&quot;!</translation>
</message>
@@ -358,7 +591,7 @@
<context>
<name>PIEthernet</name>
<message>
<location filename="../libs/main/io_devices/piethernet.cpp" line="1272"/>
<location filename="../libs/main/io_devices/piethernet.cpp" line="1275"/>
<source>Can`t get interfaces: %1</source>
<translation>Невозможно получить интерфейсы: %1</translation>
</message>
@@ -389,6 +622,34 @@
<translation>Ошибка: Режим ReadWrite не поддерживается, используйте WriteOnly или ReadOnly</translation>
</message>
</context>
<context>
<name>PIUnitsTime</name>
<message>
<location filename="../libs/main/units/piunits_class_time.cpp" line="34"/>
<source>s</source>
<translation>с</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_time.cpp" line="35"/>
<source>Hz</source>
<translation>Гц</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_time.cpp" line="26"/>
<source>hertz</source>
<translation>герц</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_time.cpp" line="25"/>
<source>second</source>
<translation>секунд</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_time.cpp" line="25"/>
<source>secons</source>
<translation type="vanished">секунд</translation>
</message>
</context>
<context>
<name>PIConnection</name>
<message>
@@ -455,6 +716,29 @@
<translation>toSystemTime() Предупреждение: неверная частота: %1</translation>
</message>
</context>
<context>
<name>PIUnitsAngle</name>
<message>
<location filename="../libs/main/units/piunits_class_angle.cpp" line="36"/>
<source>°</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_angle.cpp" line="37"/>
<source>rad</source>
<translation>рад</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_angle.cpp" line="27"/>
<source>degree</source>
<translation>градусы</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_angle.cpp" line="28"/>
<source>radian</source>
<translation>радиан</translation>
</message>
</context>
<context>
<name>PIEthUtilBase</name>
<message>
@@ -528,4 +812,111 @@
<translation>Невозможно открыть процесс с ID = %1, %2!</translation>
</message>
</context>
<context>
<name>PIUnitsDistance</name>
<message>
<location filename="../libs/main/units/piunits_class_distance.cpp" line="33"/>
<source>m</source>
<translation>м</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_distance.cpp" line="25"/>
<source>meter</source>
<translation>метр</translation>
</message>
</context>
<context>
<name>PIUnitsPressure</name>
<message>
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="36"/>
<source>Pa</source>
<translation>Па</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="37"/>
<source>atm</source>
<translation>атм</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="38"/>
<source>bar</source>
<translation>бар</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="39"/>
<source>mmHg</source>
<translation>мм рт. ст.</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="28"/>
<source>mm Hg</source>
<translation>мм рт. ст.</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="25"/>
<source>pascal</source>
<translation>паскаль</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="26"/>
<source>atmosphere</source>
<translation>атмосфер</translation>
</message>
</context>
<context>
<name>PIUnitsInformation</name>
<message>
<location filename="../libs/main/units/piunits_class_information.cpp" line="35"/>
<source>B</source>
<translation>Б</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_information.cpp" line="34"/>
<source>b</source>
<translation>б</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_information.cpp" line="25"/>
<source>bit</source>
<translation>бит</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_information.cpp" line="26"/>
<source>byte</source>
<translation>байт</translation>
</message>
</context>
<context>
<name>PIUnitsTemperature</name>
<message>
<location filename="../libs/main/units/piunits_class_temperature.cpp" line="35"/>
<source>K</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_temperature.cpp" line="36"/>
<source>°C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_temperature.cpp" line="37"/>
<source>°F</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_temperature.cpp" line="25"/>
<source>Kelvin</source>
<translation>Кельвин</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_temperature.cpp" line="26"/>
<source>Celsius</source>
<translation>Цельсий</translation>
</message>
<message>
<location filename="../libs/main/units/piunits_class_temperature.cpp" line="27"/>
<source>Fahrenheit</source>
<translation>Фаренгейт</translation>
</message>
</context>
</TS>

View File

@@ -189,8 +189,8 @@ void PIScreen::SystemConsole::print() {
for (int j = 0; j < dh; ++j) {
int k = j * dw + i;
Cell & c(cells[j + dy0][i + dx0]);
PRIVATE->chars[k].Char.UnicodeChar = 0;
PRIVATE->chars[k].Char.AsciiChar = c.symbol.toConsole1Byte();
PRIVATE->chars[k].Char.UnicodeChar = c.symbol.unicode16Code();
// PRIVATE->chars[k].Char.AsciiChar = c.symbol.toConsole1Byte();
PRIVATE->chars[k].Attributes = attributes(c);
}
// piCout << "draw" << dw << dh;
@@ -200,7 +200,7 @@ void PIScreen::SystemConsole::print() {
PRIVATE->srect.Top += dy0;
PRIVATE->srect.Right -= width - dx1 - 1;
PRIVATE->srect.Bottom -= height - dy1 - 1;
WriteConsoleOutput(PRIVATE->hOut, PRIVATE->chars.data(), PRIVATE->bs, PRIVATE->bc, &PRIVATE->srect);
WriteConsoleOutputW(PRIVATE->hOut, PRIVATE->chars.data(), PRIVATE->bs, PRIVATE->bc, &PRIVATE->srect);
#else
PIString s;
int si = 0, sj = 0;

View File

@@ -363,5 +363,5 @@ void MicrohttpdServer::addFixedHeaders(MessageMutable & msg) {
msg.addHeader(Header::ContentType, "application/json; charset=utf-8");
}
}
msg.addHeader(Header::AccessControlAllowOrigin, "*");
// msg.addHeader(Header::AccessControlAllowOrigin, "*");
}

View File

@@ -365,8 +365,8 @@ public:
return *this;
}
if (other.size() == 2) {
insert(other.pim_index[0].key, other.pim_content[0]);
insert(other.pim_index[1].key, other.pim_content[1]);
insert(other.pim_index[0].key, other.pim_content[other.pim_index[0].index]);
insert(other.pim_index[1].key, other.pim_content[other.pim_index[1].index]);
return *this;
}
for (int i = 0; i < other.pim_index.size_s(); ++i) {

View File

@@ -13,51 +13,51 @@ public:
};
//! ~english Main HTTP client class for performing requests with event callbacks.
//! ~russian Основной класс HTTP-клиента для выполнения запросов с callback-ми событий.
//! \~english Main HTTP client class for performing requests with event callbacks.
//! \~russian Основной класс HTTP-клиента для выполнения запросов с callback-ми событий.
class PIP_HTTP_CLIENT_EXPORT PIHTTPClient: private PIHTTPClientBase {
friend class PIHTTPClientBase;
friend class CurlThreadPool;
public:
//! ~english Creates a new HTTP request instance with the specified URL, method and message.
//! ~russian Создает новый экземпляр HTTP-запроса с указанным URL, методом и сообщением.
//! \~english Creates a new HTTP request instance with the specified URL, method and message.
//! \~russian Создает новый экземпляр HTTP-запроса с указанным URL, методом и сообщением.
static PIHTTPClient * create(const PIString & url, PIHTTP::Method method = PIHTTP::Method::Get, const PIHTTP::MessageConst & req = {});
//! ~english Sets a callback for successful request completion (no parameters).
//! ~russian Устанавливает callback для успешного завершения запроса (без параметров).
//! \~english Sets a callback for successful request completion (no parameters).
//! \~russian Устанавливает callback для успешного завершения запроса (без параметров).
PIHTTPClient * onFinish(std::function<void()> f);
//! ~english Sets a callback for successful request completion (with response).
//! ~russian Устанавливает callback для успешного завершения запроса (с ответом).
//! \~english Sets a callback for successful request completion (with response).
//! \~russian Устанавливает callback для успешного завершения запроса (с ответом).
PIHTTPClient * onFinish(std::function<void(const PIHTTP::MessageConst &)> f);
//! ~english Sets a callback for request errors (no parameters).
//! ~russian Устанавливает callback для ошибок запроса (без параметров).
//! \~english Sets a callback for request errors (no parameters).
//! \~russian Устанавливает callback для ошибок запроса (без параметров).
PIHTTPClient * onError(std::function<void()> f);
//! ~english Sets a callback for request errors (with error response).
//! ~russian Устанавливает callback для ошибок запроса (с ответом об ошибке).
//! \~english Sets a callback for request errors (with error response).
//! \~russian Устанавливает callback для ошибок запроса (с ответом об ошибке).
PIHTTPClient * onError(std::function<void(const PIHTTP::MessageConst &)> f);
//! ~english Sets a callback for request abortion (no parameters).
//! ~russian Устанавливает callback для прерывания запроса (без параметров).
//! \~english Sets a callback for request abortion (no parameters).
//! \~russian Устанавливает callback для прерывания запроса (без параметров).
PIHTTPClient * onAbort(std::function<void()> f);
//! ~english Sets a callback for request abortion (with abort response).
//! ~russian Устанавливает callback для прерывания запроса (с ответом о прерывании).
//! \~english Sets a callback for request abortion (with abort response).
//! \~russian Устанавливает callback для прерывания запроса (с ответом о прерывании).
PIHTTPClient * onAbort(std::function<void(const PIHTTP::MessageConst &)> f);
//! ~english Starts the HTTP request execution.
//! ~russian Начинает выполнение HTTP-запроса.
//! \~english Starts the HTTP request execution.
//! \~russian Начинает выполнение HTTP-запроса.
void start();
//! ~english Aborts the current HTTP request.
//! ~russian Прерывает текущий HTTP-запрос.
//! \~english Aborts the current HTTP request.
//! \~russian Прерывает текущий HTTP-запрос.
void abort();
//! ~english Returns the last error message.
//! ~russian Возвращает последнее сообщение об ошибке.
//! \~english Returns the last error message.
//! \~russian Возвращает последнее сообщение об ошибке.
PIString lastError() const { return last_error; }
private:

View File

@@ -9,68 +9,68 @@
namespace PIHTTP {
//! ~english Immutable HTTP message container with accessors for message components
//! ~russian Контейнер для неизменяемого HTTP-сообщения с методами доступа к компонентам
//! \~english Immutable HTTP message container with accessors for message components
//! \~russian Контейнер для неизменяемого HTTP-сообщения с методами доступа к компонентам
class PIP_EXPORT MessageConst {
public:
//! ~english Gets the HTTP method used in the message
//! ~russian Возвращает HTTP-метод, использованный в сообщении
//! \~english Gets the HTTP method used in the message
//! \~russian Возвращает HTTP-метод, использованный в сообщении
PIHTTP::Method method() const { return m_method; }
//! ~english Gets the HTTP status code
//! ~russian Возвращает HTTP-статус код
//! \~english Gets the HTTP status code
//! \~russian Возвращает HTTP-статус код
PIHTTP::Code code() const { return m_code; }
//! ~english Checks if status code is informational (1xx)
//! ~russian Проверяет, является ли статус код информационным (1xx)
//! \~english Checks if status code is informational (1xx)
//! \~russian Проверяет, является ли статус код информационным (1xx)
bool isCodeInformational() const;
//! ~english Checks if status code indicates success (2xx)
//! ~russian Проверяет, указывает ли статус код на успех (2xx)
//! \~english Checks if status code indicates success (2xx)
//! \~russian Проверяет, указывает ли статус код на успех (2xx)
bool isCodeSuccess() const;
//! ~english Checks if status code indicates redirection (3xx)
//! ~russian Проверяет, указывает ли статус код на перенаправление (3xx)
//! \~english Checks if status code indicates redirection (3xx)
//! \~russian Проверяет, указывает ли статус код на перенаправление (3xx)
bool isCodeRedirection() const;
//! ~english Checks if status code indicates client error (4xx)
//! ~russian Проверяет, указывает ли статус код на ошибку клиента (4xx)
//! \~english Checks if status code indicates client error (4xx)
//! \~russian Проверяет, указывает ли статус код на ошибку клиента (4xx)
bool isCodeClientError() const;
//! ~english Checks if status code indicates server error (5xx)
//! ~russian Проверяет, указывает ли статус код на ошибку сервера (5xx)
//! \~english Checks if status code indicates server error (5xx)
//! \~russian Проверяет, указывает ли статус код на ошибку сервера (5xx)
bool isCodeServerError() const;
//! ~english Checks if status code indicates any error (4xx or 5xx)
//! ~russian Проверяет, указывает ли статус код на любую ошибку (4xx или 5xx)
//! \~english Checks if status code indicates any error (4xx or 5xx)
//! \~russian Проверяет, указывает ли статус код на любую ошибку (4xx или 5xx)
bool isCodeError() const { return isCodeClientError() || isCodeServerError(); }
//! ~english Gets the request/response path
//! ~russian Возвращает путь запроса/ответа
//! \~english Gets the request/response path
//! \~russian Возвращает путь запроса/ответа
const PIString & path() const { return m_path; }
//! ~english Gets path components as list
//! ~russian Возвращает компоненты пути в виде списка
//! \~english Gets path components as list
//! \~russian Возвращает компоненты пути в виде списка
PIStringList pathList() const { return m_path.split('/').removeAll({}); }
//! ~english Gets the message body
//! ~russian Возвращает тело сообщения
//! \~english Gets the message body
//! \~russian Возвращает тело сообщения
const PIByteArray & body() const { return m_body; }
//! ~english Gets all message headers
//! ~russian Возвращает все заголовки сообщения
//! \~english Gets all message headers
//! \~russian Возвращает все заголовки сообщения
const PIMap<PIString, PIString> & headers() const { return m_headers; }
//! ~english Gets URL query arguments
//! ~russian Возвращает URL query аргументы
//! \~english Gets URL query arguments
//! \~russian Возвращает URL query аргументы
const PIMap<PIString, PIString> & queryArguments() const { return m_query_arguments; }
//! ~english Gets URL path arguments
//! ~russian Возвращает URL path аргументы
//! \~english Gets URL path arguments
//! \~russian Возвращает URL path аргументы
const PIMap<PIString, PIString> & pathArguments() const { return m_path_arguments; }
//! ~english Gets all message arguments (query + path)
//! ~russian Возвращает все аргументы сообщения (query + path)
//! \~english Gets all message arguments (query + path)
//! \~russian Возвращает все аргументы сообщения (query + path)
const PIMap<PIString, PIString> & arguments() const { return m_arguments; }
protected:
@@ -83,24 +83,24 @@ protected:
};
//! ~english Mutable HTTP message container with modifiers for message components
//! ~russian Контейнер для изменяемого HTTP-сообщения с методами модификации
//! \~english Mutable HTTP message container with modifiers for message components
//! \~russian Контейнер для изменяемого HTTP-сообщения с методами модификации
class PIP_EXPORT MessageMutable: public MessageConst {
public:
//! ~english Sets the HTTP method
//! ~russian Устанавливает HTTP-метод
//! \~english Sets the HTTP method
//! \~russian Устанавливает HTTP-метод
MessageMutable & setMethod(PIHTTP::Method m);
//! ~english Sets the HTTP status code
//! ~russian Устанавливает HTTP-статус код
//! \~english Sets the HTTP status code
//! \~russian Устанавливает HTTP-статус код
MessageMutable & setCode(PIHTTP::Code c);
//! ~english Sets the request/response path
//! ~russian Устанавливает путь запроса/ответа
//! \~english Sets the request/response path
//! \~russian Устанавливает путь запроса/ответа
MessageMutable & setPath(PIString p);
//! ~english Sets the message body
//! ~russian Устанавливает тело сообщения
//! \~english Sets the message body
//! \~russian Устанавливает тело сообщения
MessageMutable & setBody(PIByteArray b);
const PIMap<PIString, PIString> & headers() const { return m_headers; }
@@ -111,50 +111,50 @@ public:
PIMap<PIString, PIString> & headers() { return m_headers; }
//! ~english Adds a header to the message
//! ~russian Добавляет заголовок к сообщению
//! \~english Adds a header to the message
//! \~russian Добавляет заголовок к сообщению
MessageMutable & addHeader(const PIString & header, const PIString & value);
//! ~english Removes a header from the message
//! ~russian Удаляет заголовок из сообщения
//! \~english Removes a header from the message
//! \~russian Удаляет заголовок из сообщения
MessageMutable & removeHeader(const PIString & header);
//! ~english Gets reference to URL query arguments
//! ~russian Возвращает ссылку на URL query аргументы
//! \~english Gets reference to URL query arguments
//! \~russian Возвращает ссылку на URL query аргументы
PIMap<PIString, PIString> & queryArguments() { return m_query_arguments; }
//! ~english Adds an URL query argument to the message
//! ~russian Добавляет URL query аргумент к сообщению
//! \~english Adds an URL query argument to the message
//! \~russian Добавляет URL query аргумент к сообщению
MessageMutable & addQueryArgument(const PIString & arg, const PIString & value);
//! ~english Removes an URL query argument from the message
//! ~russian Удаляет URL query аргумент из сообщения
//! \~english Removes an URL query argument from the message
//! \~russian Удаляет URL query аргумент из сообщения
MessageMutable & removeQueryArgument(const PIString & arg);
//! ~english Gets reference to URL path arguments
//! ~russian Возвращает ссылку на URL path аргументы
//! \~english Gets reference to URL path arguments
//! \~russian Возвращает ссылку на URL path аргументы
PIMap<PIString, PIString> & pathArguments() { return m_path_arguments; }
//! ~english Adds an URL path argument to the message
//! ~russian Добавляет URL path аргумент к сообщению
//! \~english Adds an URL path argument to the message
//! \~russian Добавляет URL path аргумент к сообщению
MessageMutable & addPathArgument(const PIString & arg, const PIString & value);
//! ~english Removes an URL path argument from the message
//! ~russian Удаляет URL query path из сообщения
//! \~english Removes an URL path argument from the message
//! \~russian Удаляет URL query path из сообщения
MessageMutable & removePathArgument(const PIString & arg);
//! ~english Creates message from HTTP status code
//! ~russian Создает сообщение из HTTP-статус кода
//! \~english Creates message from HTTP status code
//! \~russian Создает сообщение из HTTP-статус кода
static MessageMutable fromCode(PIHTTP::Code c);
//! ~english Creates message from HTTP method
//! ~russian Создает сообщение из HTTP-метода
//! \~english Creates message from HTTP method
//! \~russian Создает сообщение из HTTP-метода
static MessageMutable fromMethod(PIHTTP::Method m);
};
//! ~english Gets string representation of HTTP method
//! ~russian Возвращает строковое представление HTTP-метода
//! \~english Gets string representation of HTTP method
//! \~russian Возвращает строковое представление HTTP-метода
PIP_EXPORT const char * methodName(Method m);

View File

@@ -7,8 +7,8 @@
struct MicrohttpdServerConnection;
//! ~english Base HTTP server class implementing core functionality
//! ~runnan Базовый класс HTTP сервера, реализующий основную функциональность
//! \~english Base HTTP server class implementing core functionality
//! \~russian Базовый класс HTTP сервера, реализующий основную функциональность
class PIP_HTTP_SERVER_EXPORT MicrohttpdServer: public PIObject {
PIOBJECT(MicrohttpdServer)
friend struct MicrohttpdServerConnection;
@@ -17,75 +17,75 @@ public:
MicrohttpdServer();
virtual ~MicrohttpdServer();
//! ~english Server configuration options
//! ~russian Опции конфигурации сервера
//! \~english Server configuration options
//! \~russian Опции конфигурации сервера
enum class Option {
ConnectionLimit, //!< ~english Maximum concurrent connections
//!< ~russian Максимальное количество соединений
ConnectionTimeout, //!< ~english Connection timeout in seconds
//!< ~russian Таймаут соединения в секундах
HTTPSEnabled, //!< ~english Enable HTTPS support
//!< ~russian Включить поддержку HTTPS
HTTPSMemKey, //!< ~english SSL key in memory (PIByteArray)
//!< ~russian SSL ключ в памяти (PIByteArray)
HTTPSMemCert, //!< ~english SSL certificate in memory (PIByteArray)
//!< ~russian SSL сертификат в памяти (PIByteArray)
HTTPSKeyPassword //!< ~english SSL key password (PIByteArray)
//!< ~russian Пароль SSL ключа (PIByteArray)
ConnectionLimit, //!< \~english Maximum concurrent connections
//!< \~russian Максимальное количество соединений
ConnectionTimeout, //!< \~english Connection timeout in seconds
//!< \~russian Таймаут соединения в секундах
HTTPSEnabled, //!< \~english Enable HTTPS support
//!< \~russian Включить поддержку HTTPS
HTTPSMemKey, //!< \~english SSL key in memory (PIByteArray)
//!< \~russian SSL ключ в памяти (PIByteArray)
HTTPSMemCert, //!< \~english SSL certificate in memory (PIByteArray)
//!< \~russian SSL сертификат в памяти (PIByteArray)
HTTPSKeyPassword //!< \~english SSL key password (PIByteArray)
//!< \~russian Пароль SSL ключа (PIByteArray)
};
//! ~english Sets server option
//! ~russian Устанавливает опцию сервера
//! \~english Sets server option
//! \~russian Устанавливает опцию сервера
void setOption(Option o, PIVariant v);
//! ~english Sets server favicon
//! ~russian Устанавливает фавикон сервера
//! \~english Sets server favicon
//! \~russian Устанавливает фавикон сервера
void setFavicon(const PIByteArray & im);
//! ~english Starts server on specified address
//! ~russian Запускает сервер на указанном адресе
//! \~english Starts server on specified address
//! \~russian Запускает сервер на указанном адресе
bool listen(PINetworkAddress addr);
//! ~english Starts server on all interfaces
//! ~russian Запускает сервер на всех интерфейсах
//! \~english Starts server on all interfaces
//! \~russian Запускает сервер на всех интерфейсах
bool listenAll(ushort port) { return listen({0, port}); }
//! ~english Checks if server is running
//! ~russian Проверяет, работает ли сервер
//! \~english Checks if server is running
//! \~russian Проверяет, работает ли сервер
bool isListen() const;
//! ~english Stops the server
//! ~russian Останавливает сервер
//! \~english Stops the server
//! \~russian Останавливает сервер
void stop();
//! ~english Enables basic authentication
//! ~russian Включает базовую аутентификацию
//! \~english Enables basic authentication
//! \~russian Включает базовую аутентификацию
void enableBasicAuth() { setBasicAuthEnabled(true); }
//! ~english Disables basic authentication
//! ~russian Выключает базовую аутентификацию
//! \~english Disables basic authentication
//! \~russian Выключает базовую аутентификацию
void disableBasicAuth() { setBasicAuthEnabled(false); }
//! ~english Set basic authentication enabled to "yes"
//! ~russian Устанавливает базовую аутентификацию в "yes"
//! \~english Set basic authentication enabled to "yes"
//! \~russian Устанавливает базовую аутентификацию в "yes"
void setBasicAuthEnabled(bool yes) { use_basic_auth = yes; }
//! ~english Return if basic authentication enabled
//! ~russian Возвращает включена ли базовая аутентификация
//! \~english Return if basic authentication enabled
//! \~russian Возвращает включена ли базовая аутентификация
bool isBasicAuthEnabled() const { return use_basic_auth; }
//! ~english Sets basic authentication realm
//! ~russian Устанавливает область аутентификации
//! \~english Sets basic authentication realm
//! \~russian Устанавливает область аутентификации
void setBasicAuthRealm(const PIString & r) { realm = r; }
//! ~english Sets request processing callback
//! ~russian Устанавливает callback для обработки запросов
//! \~english Sets request processing callback
//! \~russian Устанавливает callback для обработки запросов
void setRequestCallback(std::function<PIHTTP::MessageMutable(const PIHTTP::MessageConst &)> c) { callback = c; }
//! ~english Sets basic authentication callback
//! ~russian Устанавливает callback для базовой аутентификации
//! \~english Sets basic authentication callback
//! \~russian Устанавливает callback для базовой аутентификации
void setBasicAuthCallback(std::function<bool(const PIString &, const PIString &)> c) { callback_auth = c; }
private:

View File

@@ -3,8 +3,8 @@
#include "microhttpd_server.h"
//! ~english HTTP server
//! ~russian HTTP сервер
//! \~english HTTP server
//! \~russian HTTP сервер
class PIP_HTTP_SERVER_EXPORT PIHTTPServer: public MicrohttpdServer {
PIOBJECT_SUBCLASS(PIHTTPServer, MicrohttpdServer)
@@ -15,12 +15,12 @@ public:
using RequestFunction = std::function<PIHTTP::MessageMutable(const PIHTTP::MessageConst &)>;
//! ~english Registers handler for specific path and HTTP method
//! ~russian Регистрирует обработчик для указанного пути и HTTP метода
//! \~english Registers handler for specific path and HTTP method
//! \~russian Регистрирует обработчик для указанного пути и HTTP метода
bool registerPath(const PIString & path, PIHTTP::Method method, RequestFunction functor);
//! ~english Registers handler for specific path and HTTP method
//! ~russian Регистрирует обработчик для указанного пути и HTTP метода
//! \~english Registers handler for specific path and HTTP method
//! \~russian Регистрирует обработчик для указанного пути и HTTP метода
template<typename T>
bool
registerPath(const PIString & path, PIHTTP::Method method, T * o, PIHTTP::MessageMutable (T::*function)(const PIHTTP::MessageConst &)) {
@@ -28,36 +28,36 @@ public:
}
//! ~english Registers handler for unregistered pathes
//! ~russian Регистрирует обработчик для незарегистрированных путей
//! \~english Registers handler for unregistered pathes
//! \~russian Регистрирует обработчик для незарегистрированных путей
void registerUnhandled(RequestFunction functor);
//! ~english Registers handler for unregistered pathes
//! ~russian Регистрирует обработчик для незарегистрированных путей
//! \~english Registers handler for unregistered pathes
//! \~russian Регистрирует обработчик для незарегистрированных путей
template<typename T>
void registerUnhandled(T * o, PIHTTP::MessageMutable (T::*function)(const PIHTTP::MessageConst &)) {
registerUnhandled([o, function](const PIHTTP::MessageConst & m) { return (o->*function)(m); });
}
//! ~english Unregisters handler for specific path and method
//! ~russian Удаляет обработчик для указанного пути и метода
//! \~english Unregisters handler for specific path and method
//! \~russian Удаляет обработчик для указанного пути и метода
void unregisterPath(const PIString & path, PIHTTP::Method method);
//! ~english Unregisters all handlers for specific path
//! ~russian Удаляет все обработчики для указанного пути
//! \~english Unregisters all handlers for specific path
//! \~russian Удаляет все обработчики для указанного пути
void unregisterPath(const PIString & path);
//! ~english Adds header to all server responses
//! ~russian Добавляет заголовок ко всем ответам сервера
//! \~english Adds header to all server responses
//! \~russian Добавляет заголовок ко всем ответам сервера
void addReplyHeader(const PIString & name, const PIString & value) { reply_headers[name] = value; }
//! ~english Removes header from server responses
//! ~russian Удаляет заголовок из ответов сервера
//! \~english Removes header from server responses
//! \~russian Удаляет заголовок из ответов сервера
void removeReplyHeader(const PIString & name) { reply_headers.remove(name); }
//! ~english Clears all custom response headers
//! ~russian Очищает все пользовательские заголовки ответов
//! \~english Clears all custom response headers
//! \~russian Очищает все пользовательские заголовки ответов
void clearReplyHeaders() { reply_headers.clear(); }
private:

View File

@@ -938,7 +938,7 @@ PIString PIBinaryLog::constructFullPathDevice() const {
void PIBinaryLog::configureFromFullPathDevice(const PIString & full_path) {
const PIStringList pl = full_path.split(":");
for (int i = 0; i < pl.size_s(); ++i) {
const PIString p(pl[i]);
const PIString p(pl[i].trimmed());
switch (i) {
case 0: setLogDir(p); break;
case 1: setFilePrefix(p); break;

View File

@@ -181,7 +181,7 @@ void PICAN::configureFromFullPathDevice(const PIString & full_path) {
PIString p(pl[i]);
switch (i) {
case 0: setPath(p); break;
case 1: setCANID(p.toInt(16)); break;
case 1: setCANID(p.trimmed().toInt(16)); break;
default: break;
}
}

View File

@@ -1047,7 +1047,7 @@ void PIEthernet::configureFromFullPathDevice(const PIString & full_path) {
PIStringList pl = full_path.split(":");
bool mcast = false;
for (int i = 0; i < pl.size_s(); ++i) {
PIString p(pl[i]);
PIString p(pl[i].trimmed());
switch (i) {
case 0:
p = p.toLowerCase();

View File

@@ -390,7 +390,7 @@ void PIIODevice::read_func() {
ssize_t readed_ = read(buffer_tr.data(), buffer_tr.size_s());
if (read_thread.isStopping()) return;
if (readed_ <= 0) {
piMSleep(10);
piMSleep(threaded_read_timeout_ms);
// cout << readed_ << ", " << errno << ", " << errorString() << endl;
return;
}

View File

@@ -271,6 +271,10 @@ public:
bool waitThreadedReadFinished(PISystemTime timeout = {});
uint threadedReadTimeout() const { return threaded_read_timeout_ms; }
void setThreadedReadTimeout(uint ms) { threaded_read_timeout_ms = ms; }
//! \~english Returns if threaded write is started
//! \~russian Возвращает запущен ли поток записи
bool isThreadedWrite() const;
@@ -591,7 +595,7 @@ private:
PIQueue<PIPair<PIByteArray, ullong>> write_queue;
PISystemTime reopen_timeout;
ullong tri = 0;
uint threaded_read_buffer_size;
uint threaded_read_buffer_size, threaded_read_timeout_ms = 10;
bool reopen_enabled = true, destroying = false;
static PIMutex nfp_mutex;

View File

@@ -1067,7 +1067,7 @@ PIString PIPeer::constructFullPathDevice() const {
void PIPeer::configureFromFullPathDevice(const PIString & full_path) {
PIStringList pl = full_path.split(":");
for (int i = 0; i < pl.size_s(); ++i) {
PIString p(pl[i]);
PIString p(pl[i].trimmed());
switch (i) {
case 0: changeName(p); break;
case 1: setTrustPeerName(p); break;

View File

@@ -983,7 +983,7 @@ void PISerial::configureFromFullPathDevice(const PIString & full_path) {
}
}
for (int i = 0; i < pl.size_s(); ++i) {
PIString p(pl[i]);
PIString p(pl[i].trimmed());
switch (i) {
case 0: setProperty("path", p); break;
case 1:

View File

@@ -182,7 +182,7 @@ void PISharedMemory::configureFromFullPathDevice(const PIString & full_path) {
initPrivate();
PIStringList pl = full_path.split(":");
for (int i = 0; i < pl.size_s(); ++i) {
PIString p(pl[i]);
PIString p(pl[i].trimmed());
switch (i) {
case 0: setPath(p); break;
case 1: dsize = p.toInt(); break;

View File

@@ -187,7 +187,7 @@ PIString PISPI::constructFullPathDevice() const {
void PISPI::configureFromFullPathDevice(const PIString & full_path) {
PIStringList pl = full_path.split(":");
for (int i = 0; i < pl.size_s(); ++i) {
PIString p(pl[i]);
PIString p(pl[i].trimmed());
switch (i) {
case 0: setPath(p); break;
case 1: setSpeed(p.toInt()); break;

View File

@@ -315,7 +315,7 @@ public:
}
static _CVector cross(const _CVector & v1, const _CVector & v2) { return v1.cross(v2); }
static _CVector dot(const _CVector & v1, const _CVector & v2) { return v1.dot(v2); }
static Type dot(const _CVector & v1, const _CVector & v2) { return v1.dot(v2); }
static _CVector mul(const _CVector & v1, const _CVector & v2) { return v1.mul(v2); }
static _CVector mul(const Type & v1, const _CVector & v2) { return v2 * v1; }
static _CVector mul(const _CVector & v1, const Type & v2) { return v1 * v2; }
@@ -581,7 +581,7 @@ public:
static _CVector cross(const _CVector & v1, const _CVector & v2) { return v1.cross(v2); }
static _CVector dot(const _CVector & v1, const _CVector & v2) { return v1.dot(v2); }
static Type dot(const _CVector & v1, const _CVector & v2) { return v1.dot(v2); }
static _CVector mul(const _CVector & v1, const _CVector & v2) { return v1.mul(v2); }
static _CVector mul(const Type & v1, const _CVector & v2) { return v2 * v1; }
static _CVector mul(const _CVector & v1, const Type & v2) { return v1 * v2; }

View File

@@ -712,6 +712,11 @@ int PIVariant::toInt() const {
ba >> r;
return (int)r.rgba;
}
case PIVariant::pivMathVector: {
PIMathVectord r;
ba >> r;
return r.size() > 0 ? r[0] : 0;
}
case PIVariant::pivCustom: return getAsValue<int>(*this);
default: break;
}
@@ -817,6 +822,11 @@ llong PIVariant::toLLong() const {
ba >> r;
return llong(r.selectedValue());
}
case PIVariant::pivMathVector: {
PIMathVectord r;
ba >> r;
return r.size() > 0 ? r[0] : 0L;
}
case PIVariant::pivCustom: return getAsValue<llong>(*this);
default: break;
}
@@ -922,6 +932,11 @@ float PIVariant::toFloat() const {
ba >> r;
return float(r.selectedValue());
}
case PIVariant::pivMathVector: {
PIMathVectord r;
ba >> r;
return r.size() > 0 ? r[0] : 0.f;
}
case PIVariant::pivCustom: return getAsValue<float>(*this);
default: break;
}
@@ -1027,6 +1042,11 @@ double PIVariant::toDouble() const {
ba >> r;
return double(r.selectedValue());
}
case PIVariant::pivMathVector: {
PIMathVectord r;
ba >> r;
return r.size() > 0 ? r[0] : 0.;
}
case PIVariant::pivCustom: return getAsValue<double>(*this);
default: break;
}
@@ -1132,6 +1152,11 @@ ldouble PIVariant::toLDouble() const {
ba >> r;
return ldouble(r.selectedValue());
}
case PIVariant::pivMathVector: {
PIMathVectord r;
ba >> r;
return r.size() > 0 ? r[0] : 0.;
}
case PIVariant::pivCustom: return getAsValue<float>(*this);
default: break;
}

37
libs/main/units/piunits.h Normal file
View File

@@ -0,0 +1,37 @@
/*! \file piunits.h
* \ingroup Core
* \~\brief
* \~english Unit conversions
* \~russian Преобразование единиц измерения
*/
/*
PIP - Platform Independent Primitives
Unit conversions
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIUNITS_H
#define PIUNITS_H
#include "piunits_class_angle.h"
#include "piunits_class_distance.h"
#include "piunits_class_information.h"
#include "piunits_class_pressure.h"
#include "piunits_class_temperature.h"
#include "piunits_class_time.h"
#include "piunits_value.h"
#endif

View File

@@ -0,0 +1,52 @@
/*
PIP - Platform Independent Primitives
Unit conversions
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "piunits_base.h"
#include "piliterals_string.h"
PIMap<int, PIUnits::Class::Internal::ClassBase *> PIUnits::Class::Internal::typeClasses;
PIVector<PIUnits::Class::Internal::ClassBase *> PIUnits::Class::Internal::allTypeClasses;
const PIString PIUnits::Class::Internal::unknown = "?"_a;
PIString PIUnits::className(int type) {
auto * uc = Class::Internal::typeClasses.value(type);
if (!uc) return Class::Internal::unknown;
return uc->className();
}
PIString PIUnits::name(int type) {
auto * uc = Class::Internal::typeClasses.value(type);
if (!uc) return Class::Internal::unknown;
return uc->name(type);
}
PIString PIUnits::unit(int type) {
auto * uc = Class::Internal::typeClasses.value(type);
if (!uc) return Class::Internal::unknown;
return uc->unit(type);
}
PIVector<PIUnits::Class::Internal::ClassBase *> PIUnits::allClasses() {
return Class::Internal::allTypeClasses;
}

View File

@@ -0,0 +1,124 @@
/*! \file piunits_base.h
* \ingroup Core
* \~\brief
* \~english Unit conversions
* \~russian Преобразование единиц измерения
*/
/*
PIP - Platform Independent Primitives
Unit conversions
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIUNITS_BASE_H
#define PIUNITS_BASE_H
#include "pitranslator.h"
#define DECLARE_UNIT_CLASS_BEGIN(Name, StartIndex) \
namespace PIUnits { \
namespace Class { \
class PIP_EXPORT Name \
: public Internal::ClassBase \
, public Internal::Registrator<Name> { \
private: \
friend class Internal::Registrator<Name>; \
constexpr static int typeStart = StartIndex; \
PIString name(int type) const override; \
PIString unit(int type) const override; \
PIString valueToString(double v, char format, int prec) const override; \
double convert(double v, int from, int to) const override; \
bool supportPrefixes(int type) const override; \
bool supportPrefixesNon3(int type) const override; \
bool supportPrefixesGreater(int type) const override; \
bool supportPrefixesSmaller(int type) const override; \
\
public: \
PIString className() const override { \
return piTr(#Name, "PIUnits"); \
} \
uint classID() const override { \
static uint ret = PIStringAscii(#Name).hash(); \
return ret; \
}
#define DECLARE_UNIT_CLASS_END(Name) \
} \
; \
} \
} \
STATIC_INITIALIZER_BEGIN \
PIUnits::Class::Name::registerSelf(); \
STATIC_INITIALIZER_END
namespace PIUnits {
PIP_EXPORT PIString className(int type);
PIP_EXPORT PIString name(int type);
PIP_EXPORT PIString unit(int type);
namespace Class {
enum {
Invalid = -1
};
class PIP_EXPORT Internal {
public:
class PIP_EXPORT ClassBase {
public:
virtual uint classID() const = 0;
virtual PIString className() const = 0;
virtual PIString name(int type) const = 0;
virtual PIString unit(int type) const = 0;
virtual PIString valueToString(double v, char format = 'g', int prec = 5) const = 0;
virtual double convert(double v, int from, int to) const = 0;
virtual bool supportPrefixes(int type) const { return true; }
virtual bool supportPrefixesNon3(int type) const { return false; }
virtual bool supportPrefixesGreater(int type) const { return true; }
virtual bool supportPrefixesSmaller(int type) const { return true; }
const PIVector<int> & allTypes() const { return types; }
protected:
PIVector<int> types;
};
template<typename P>
class Registrator {
public:
static void registerSelf() {
auto * uc = new P();
for (int t = P::typeStart; t < P::_LastType; ++t) {
uc->types << t;
Internal::typeClasses[t] = uc;
}
if (!Internal::allTypeClasses.contains(uc)) Internal::allTypeClasses << uc;
}
};
static PIMap<int, ClassBase *> typeClasses;
static PIVector<ClassBase *> allTypeClasses;
static const PIString unknown;
};
} // namespace Class
PIP_EXPORT PIVector<Class::Internal::ClassBase *> allClasses();
} // namespace PIUnits
#endif

View File

@@ -0,0 +1,74 @@
/*
PIP - Platform Independent Primitives
Angle units
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "piunits_class_angle.h"
#include "pimathbase.h"
PIString PIUnits::Class::Angle::name(int type) const {
switch (type) {
case Degree: return "degree"_tr("PIUnitsAngle");
case Radian: return "radian"_tr("PIUnitsAngle");
}
return Class::Internal::unknown;
}
PIString PIUnits::Class::Angle::unit(int type) const {
switch (type) {
case Degree: return "°"_tr("PIUnitsAngle");
case Radian: return "rad"_tr("PIUnitsAngle");
}
return Class::Internal::unknown;
}
double PIUnits::Class::Angle::convert(double v, int from, int to) const {
switch (to) {
case Degree: return toDeg(v);
case Radian: return toRad(v);
}
return v;
}
PIString PIUnits::Class::Angle::valueToString(double v, char format, int prec) const {
return PIString::fromNumber(v, format, prec);
}
bool PIUnits::Class::Angle::supportPrefixes(int type) const {
return false;
}
bool PIUnits::Class::Angle::supportPrefixesNon3(int type) const {
return false;
}
bool PIUnits::Class::Angle::supportPrefixesGreater(int type) const {
return ClassBase::supportPrefixesGreater(type);
}
bool PIUnits::Class::Angle::supportPrefixesSmaller(int type) const {
return ClassBase::supportPrefixesSmaller(type);
}

View File

@@ -0,0 +1,39 @@
/*! \file piunits_class_angle.h
* \ingroup Core
* \~\brief
* \~english Angle units
* \~russian Единицы измерения угла
*/
/*
PIP - Platform Independent Primitives
Angle units
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIUNITS_CLASS_ANGLE_H
#define PIUNITS_CLASS_ANGLE_H
#include "piunits_base.h"
DECLARE_UNIT_CLASS_BEGIN(Angle, 0x200)
enum {
Degree = typeStart,
Radian,
_LastType,
};
DECLARE_UNIT_CLASS_END(Angle)
#endif

View File

@@ -0,0 +1,69 @@
/*
PIP - Platform Independent Primitives
Distance units
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "piunits_class_distance.h"
PIString PIUnits::Class::Distance::name(int type) const {
switch (type) {
case Meter: return "meter"_tr("PIUnitsDistance");
}
return Class::Internal::unknown;
}
PIString PIUnits::Class::Distance::unit(int type) const {
switch (type) {
case Meter: return "m"_tr("PIUnitsDistance");
}
return Class::Internal::unknown;
}
double PIUnits::Class::Distance::convert(double v, int from, int to) const {
switch (to) {
case Meter: return v;
}
return v;
}
PIString PIUnits::Class::Distance::valueToString(double v, char format, int prec) const {
return PIString::fromNumber(v, format, prec);
}
bool PIUnits::Class::Distance::supportPrefixes(int type) const {
return true;
}
bool PIUnits::Class::Distance::supportPrefixesNon3(int type) const {
return true;
}
bool PIUnits::Class::Distance::supportPrefixesGreater(int type) const {
return ClassBase::supportPrefixesGreater(type);
}
bool PIUnits::Class::Distance::supportPrefixesSmaller(int type) const {
return ClassBase::supportPrefixesSmaller(type);
}

View File

@@ -0,0 +1,38 @@
/*! \file piunits_class_distance.h
* \ingroup Core
* \~\brief
* \~english Distance units
* \~russian Единицы измерения расстояния
*/
/*
PIP - Platform Independent Primitives
Distance units
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIUNITS_CLASS_DISTANCE_H
#define PIUNITS_CLASS_DISTANCE_H
#include "piunits_base.h"
DECLARE_UNIT_CLASS_BEGIN(Distance, 0x600)
enum {
Meter = typeStart,
_LastType,
};
DECLARE_UNIT_CLASS_END(Distance)
#endif

View File

@@ -0,0 +1,72 @@
/*
PIP - Platform Independent Primitives
Information units
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "piunits_class_information.h"
PIString PIUnits::Class::Information::name(int type) const {
switch (type) {
case Bit: return "bit"_tr("PIUnitsInformation");
case Byte: return "byte"_tr("PIUnitsInformation");
}
return Class::Internal::unknown;
}
PIString PIUnits::Class::Information::unit(int type) const {
switch (type) {
case Bit: return "b"_tr("PIUnitsInformation");
case Byte: return "B"_tr("PIUnitsInformation");
}
return Class::Internal::unknown;
}
double PIUnits::Class::Information::convert(double v, int from, int to) const {
switch (to) {
case Bit: return v * 8;
case Byte: return v / 8;
}
return v;
}
PIString PIUnits::Class::Information::valueToString(double v, char format, int prec) const {
return PIString::fromNumber(static_cast<llong>(v));
}
bool PIUnits::Class::Information::supportPrefixes(int type) const {
return true;
}
bool PIUnits::Class::Information::supportPrefixesNon3(int type) const {
return false;
}
bool PIUnits::Class::Information::supportPrefixesGreater(int type) const {
return true;
}
bool PIUnits::Class::Information::supportPrefixesSmaller(int type) const {
return false;
}

View File

@@ -0,0 +1,39 @@
/*! \file piunits_class_information.h
* \ingroup Core
* \~\brief
* \~english Information units
* \~russian Единицы измерения информации
*/
/*
PIP - Platform Independent Primitives
Information units
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIUNITS_CLASS_INFORMATION_H
#define PIUNITS_CLASS_INFORMATION_H
#include "piunits_base.h"
DECLARE_UNIT_CLASS_BEGIN(Information, 0x100)
enum {
Bit = typeStart,
Byte,
_LastType,
};
DECLARE_UNIT_CLASS_END(Information)
#endif

View File

@@ -0,0 +1,86 @@
/*
PIP - Platform Independent Primitives
Pressure units
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "piunits_class_pressure.h"
PIString PIUnits::Class::Pressure::name(int type) const {
switch (type) {
case Pascal: return "pascal"_tr("PIUnitsPressure");
case Atmosphere: return "atmosphere"_tr("PIUnitsPressure");
case Bar: return "bar"_tr("PIUnitsPressure");
case MillimetreOfMercury: return "mm Hg"_tr("PIUnitsPressure");
}
return Class::Internal::unknown;
}
PIString PIUnits::Class::Pressure::unit(int type) const {
switch (type) {
case Pascal: return "Pa"_tr("PIUnitsPressure");
case Atmosphere: return "atm"_tr("PIUnitsPressure");
case Bar: return "bar"_tr("PIUnitsPressure");
case MillimetreOfMercury: return "mmHg"_tr("PIUnitsPressure");
}
return Class::Internal::unknown;
}
double PIUnits::Class::Pressure::convert(double v, int from, int to) const {
double pa = v;
switch (from) {
case Atmosphere: pa /= 9.86923E-6; break;
case Bar: pa /= 1.E-5; break;
case MillimetreOfMercury: pa *= 133.322387415; break;
default: break;
}
switch (to) {
case Atmosphere: return pa * 9.86923E-6;
case Bar: return pa * 1.E-5;
case MillimetreOfMercury: return pa / 133.322387415;
default: break;
}
return pa;
}
PIString PIUnits::Class::Pressure::valueToString(double v, char format, int prec) const {
return PIString::fromNumber(v, format, prec);
}
bool PIUnits::Class::Pressure::supportPrefixes(int type) const {
if (type == Pascal) return true;
return false;
}
bool PIUnits::Class::Pressure::supportPrefixesNon3(int type) const {
return false;
}
bool PIUnits::Class::Pressure::supportPrefixesGreater(int type) const {
return ClassBase::supportPrefixesGreater(type);
}
bool PIUnits::Class::Pressure::supportPrefixesSmaller(int type) const {
return ClassBase::supportPrefixesSmaller(type);
}

View File

@@ -0,0 +1,41 @@
/*! \file piunits_class_pressure.h
* \ingroup Core
* \~\brief
* \~english Pressure units
* \~russian Единицы измерения давления
*/
/*
PIP - Platform Independent Primitives
Pressure units
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIUNITS_CLASS_PRESSURE_H
#define PIUNITS_CLASS_PRESSURE_H
#include "piunits_base.h"
DECLARE_UNIT_CLASS_BEGIN(Pressure, 0x500)
enum {
Pascal = typeStart,
Atmosphere,
Bar,
MillimetreOfMercury,
_LastType,
};
DECLARE_UNIT_CLASS_END(Pressure)
#endif

View File

@@ -0,0 +1,82 @@
/*
PIP - Platform Independent Primitives
Temperature units
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "piunits_class_temperature.h"
PIString PIUnits::Class::Temperature::name(int type) const {
switch (type) {
case Kelvin: return "Kelvin"_tr("PIUnitsTemperature");
case Celsius: return "Celsius"_tr("PIUnitsTemperature");
case Fahrenheit: return "Fahrenheit"_tr("PIUnitsTemperature");
}
return Class::Internal::unknown;
}
PIString PIUnits::Class::Temperature::unit(int type) const {
switch (type) {
case Kelvin: return "K"_tr("PIUnitsTemperature");
case Celsius: return "°C"_tr("PIUnitsTemperature");
case Fahrenheit: return "°F"_tr("PIUnitsTemperature");
}
return Class::Internal::unknown;
}
double PIUnits::Class::Temperature::convert(double v, int from, int to) const {
double K = v;
switch (from) {
case Celsius: K += 273.15; break;
case Fahrenheit: K = (v + 459.67) * (5. / 9.); break;
default: break;
}
switch (to) {
case Celsius: return K - 273.15;
case Fahrenheit: return (K * (9. / 5.) - 459.67);
default: break;
}
return K;
}
PIString PIUnits::Class::Temperature::valueToString(double v, char format, int prec) const {
return PIString::fromNumber(v, format, prec);
}
bool PIUnits::Class::Temperature::supportPrefixes(int type) const {
if (type == Kelvin) return true;
return false;
}
bool PIUnits::Class::Temperature::supportPrefixesNon3(int type) const {
return false;
}
bool PIUnits::Class::Temperature::supportPrefixesGreater(int type) const {
return true;
}
bool PIUnits::Class::Temperature::supportPrefixesSmaller(int type) const {
return false;
}

View File

@@ -0,0 +1,40 @@
/*! \file piunits_class_temperature.h
* \ingroup Core
* \~\brief
* \~english Temperature units
* \~russian Единицы измерения температуры
*/
/*
PIP - Platform Independent Primitives
Temperature units
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIUNITS_CLASS_TEMPERATURE_H
#define PIUNITS_CLASS_TEMPERATURE_H
#include "piunits_base.h"
DECLARE_UNIT_CLASS_BEGIN(Temperature, 0x400)
enum {
Kelvin = typeStart,
Celsius,
Fahrenheit,
_LastType,
};
DECLARE_UNIT_CLASS_END(Temperature)
#endif

View File

@@ -0,0 +1,75 @@
/*
PIP - Platform Independent Primitives
Time units
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "piunits_class_time.h"
PIString PIUnits::Class::Time::name(int type) const {
switch (type) {
case Second: return "second"_tr("PIUnitsTime");
case Hertz: return "hertz"_tr("PIUnitsTime");
}
return Class::Internal::unknown;
}
PIString PIUnits::Class::Time::unit(int type) const {
switch (type) {
case Second: return "s"_tr("PIUnitsTime");
case Hertz: return "Hz"_tr("PIUnitsTime");
}
return Class::Internal::unknown;
}
double PIUnits::Class::Time::convert(double v, int from, int to) const {
if (piCompared(v, 0.)) return 0.;
switch (to) {
case Second: return 1. / v;
case Hertz: return 1. / v;
}
return v;
}
PIString PIUnits::Class::Time::valueToString(double v, char format, int prec) const {
return PIString::fromNumber(v, format, prec);
}
bool PIUnits::Class::Time::supportPrefixes(int type) const {
return true;
}
bool PIUnits::Class::Time::supportPrefixesNon3(int type) const {
return false;
}
bool PIUnits::Class::Time::supportPrefixesGreater(int type) const {
if (type == Hertz) return true;
return false;
}
bool PIUnits::Class::Time::supportPrefixesSmaller(int type) const {
if (type == Second) return true;
return false;
}

View File

@@ -0,0 +1,39 @@
/*! \file piunits_class_time.h
* \ingroup Core
* \~\brief
* \~english Time units
* \~russian Единицы измерения времени
*/
/*
PIP - Platform Independent Primitives
Time units
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIUNITS_CLASS_TIME_H
#define PIUNITS_CLASS_TIME_H
#include "piunits_base.h"
DECLARE_UNIT_CLASS_BEGIN(Time, 0x300)
enum {
Second = typeStart,
Hertz,
_LastType,
};
DECLARE_UNIT_CLASS_END(Time)
#endif

View File

@@ -0,0 +1,137 @@
/*
PIP - Platform Independent Primitives
Unit prefix
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "piunits_prefix.h"
#include "piliterals_string.h"
#include "pimathbase.h"
#include "pitranslator.h"
#include "piunits_base.h"
// quetta Q 10^30 1000000000000000000000000000000
// ronna R 10^27 1000000000000000000000000000
// yotta Y 10^24 1000000000000000000000000
// zetta Z 10^21 1000000000000000000000
// exa E 10^18 1000000000000000000
// peta P 10^15 1000000000000000
// tera T 10^12 1000000000000
// giga G 10^9 1000000000
// mega M 10^6 1000000
// kilo k 10^3 1000
// hecto h 10^2 100
// deca da 10^1 10
// — — 100 1 —
// deci d 10^1 0.1
// centi c 10^2 0.01
// milli m 10^3 0.001
// micro μ 10^6 0.000001
// nano n 10^9 0.000000001
// pico p 10^12 0.000000000001
// femto f 10^15 0.000000000000001
// atto a 10^18 0.000000000000000001
// zepto z 10^21 0.000000000000000000001
// yocto y 10^24 0.000000000000000000000001
// ronto r 10^27 0.000000000000000000000000001
PIString PIUnits::Prefix::name(int prefix) {
return instance().getPrefix(prefix).name;
}
PIString PIUnits::Prefix::prefix(int prefix) {
return instance().getPrefix(prefix).prefix;
}
PIString PIUnits::Prefix::valueToString(double v, void * type_class, int type, char format, int prec) {
auto * tc = reinterpret_cast<PIUnits::Class::Internal::ClassBase *>(type_class);
auto p =
instance().getPrefixForValue(v, tc->supportPrefixesNon3(type), tc->supportPrefixesGreater(type), tc->supportPrefixesSmaller(type));
return PIString::fromNumber(v / p.divider, format, prec) + " "_a + p.prefix;
}
double PIUnits::Prefix::multiplier(int prefix) {
return instance().getPrefix(prefix).divider;
}
PIUnits::Prefix::Prefix() {
def_prefix = {"", "", 0, 1., false};
// clang-format off
prefixes = {
{Deca, {"deca"_tr ("PIUnits"), "da"_tr("PIUnits") , 1 , pow10(1. ), true }},
{Hecto, {"hecto"_tr ("PIUnits"), "h"_tr ("PIUnits") , 2 , pow10(2. ), true }},
{Kilo, {"kilo"_tr ("PIUnits"), "k"_tr ("PIUnits") , 3 , pow10(3. ), false}},
{Mega, {"mega"_tr ("PIUnits"), "M"_tr ("PIUnits") , 6 , pow10(6. ), false}},
{Giga, {"giga"_tr ("PIUnits"), "G"_tr ("PIUnits") , 9 , pow10(9. ), false}},
{Tera, {"tera"_tr ("PIUnits"), "T"_tr ("PIUnits") , 12 , pow10(12. ), false}},
{Peta, {"peta"_tr ("PIUnits"), "P"_tr ("PIUnits") , 15 , pow10(15. ), false}},
{Exa, {"exa"_tr ("PIUnits"), "E"_tr ("PIUnits") , 18 , pow10(18. ), false}},
{Zetta, {"zetta"_tr ("PIUnits"), "Z"_tr ("PIUnits") , 21 , pow10(21. ), false}},
{Yotta, {"yotta"_tr ("PIUnits"), "Y"_tr ("PIUnits") , 24 , pow10(24. ), false}},
{Ronna, {"ronna"_tr ("PIUnits"), "R"_tr ("PIUnits") , 27 , pow10(27. ), false}},
{Quetta, {"quetta"_tr("PIUnits"), "Q"_tr ("PIUnits") , 30 , pow10(30. ), false}},
{Deci, {"deci"_tr ("PIUnits"), "d"_tr ("PIUnits") , -1 , pow10(-1. ), true }},
{Centi, {"centi"_tr ("PIUnits"), "c"_tr ("PIUnits") , -2 , pow10(-2. ), true }},
{Milli, {"milli"_tr ("PIUnits"), "m"_tr ("PIUnits") , -3 , pow10(-3. ), false}},
{Micro, {"micro"_tr ("PIUnits"), "u"_tr ("PIUnits") , -6 , pow10(-6. ), false}},
{Nano, {"nano"_tr ("PIUnits"), "n"_tr ("PIUnits") , -9 , pow10(-9. ), false}},
{Pico, {"pico"_tr ("PIUnits"), "p"_tr ("PIUnits") , -12, pow10(-12.), false}},
{Femto, {"femto"_tr ("PIUnits"), "f"_tr ("PIUnits") , -15, pow10(-15.), false}},
{Atto, {"atto"_tr ("PIUnits"), "a"_tr ("PIUnits") , -18, pow10(-18.), false}},
{Zepto, {"zepto"_tr ("PIUnits"), "z"_tr ("PIUnits") , -21, pow10(-21.), false}},
{Yocto, {"yocto"_tr ("PIUnits"), "y"_tr ("PIUnits") , -24, pow10(-24.), false}},
{Ronto, {"ronto"_tr ("PIUnits"), "r"_tr ("PIUnits") , -27, pow10(-27.), false}},
};
// clang-format on
auto it = prefixes.makeIterator();
while (it.next()) {
prefixes_by_pow[it.value().pow] = &it.value();
}
prefixes_by_pow[0] = &def_prefix;
}
const PIUnits::Prefix::P PIUnits::Prefix::getPrefixForValue(double v, bool use_non3, bool use_greater, bool use_smaller) const {
auto it = prefixes_by_pow.makeIterator();
const P * ret = &def_prefix;
while (it.next()) {
if (it.value()->pow < 0 && !use_smaller) continue;
if (it.value()->pow > 0 && !use_greater) continue;
if (it.value()->non3 && !use_non3) continue;
if (v < it.value()->divider) return *ret;
ret = it.value();
}
return def_prefix;
}
const PIUnits::Prefix::P PIUnits::Prefix::getPrefix(int p) const {
return prefixes.value(p, def_prefix);
}
PIUnits::Prefix & PIUnits::Prefix::instance() {
static Prefix ret;
return ret;
}

View File

@@ -0,0 +1,95 @@
/*! \file piunits_prefix.h
* \ingroup Core
* \~\brief
* \~english Unit prefixes
* \~russian Префиксы единиц измерения
*/
/*
PIP - Platform Independent Primitives
Unit prefix
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIUNITS_PREFIX_H
#define PIUNITS_PREFIX_H
#include "pistring.h"
namespace PIUnits {
class PIP_EXPORT Prefix {
friend class Value;
public:
enum {
None,
Deca = 0x100, // da 10^1 10
Hecto, // h 10^2 100
Kilo, // k 10^3 1000
Mega, // M 10^6 1000000
Giga, // G 10^9 1000000000
Tera, // T 10^12 1000000000000
Peta, // P 10^15 1000000000000000
Exa, // E 10^18 1000000000000000000
Zetta, // Z 10^21 1000000000000000000000
Yotta, // Y 10^24 1000000000000000000000000
Ronna, // R 10^27 1000000000000000000000000000
Quetta, // Q 10^30 1000000000000000000000000000000
Deci = 0x200, // d 10^1 0.1
Centi, // c 10^2 0.01
Milli, // m 10^3 0.001
Micro, // μ 10^6 0.000001
Nano, // n 10^9 0.000000001
Pico, // p 10^12 0.000000000001
Femto, // f 10^15 0.000000000000001
Atto, // a 10^18 0.000000000000000001
Zepto, // z 10^21 0.000000000000000000001
Yocto, // y 10^24 0.000000000000000000000001
Ronto, // r 10^27 0.000000000000000000000000001
};
static PIString name(int prefix);
static PIString prefix(int prefix);
static double multiplier(int prefix);
private:
Prefix();
NO_COPY_CLASS(Prefix);
static Prefix & instance();
static PIString valueToString(double v, void * type_class, int type, char format = 'g', int prec = 5);
struct P {
PIString name;
PIString prefix;
int pow;
double divider;
bool non3;
};
const P getPrefix(int p) const;
const P getPrefixForValue(double v, bool use_non3, bool use_greater, bool use_smaller) const;
PIMap<int, P> prefixes;
PIMap<int, P *> prefixes_by_pow;
P def_prefix;
};
} // namespace PIUnits
#endif

View File

@@ -0,0 +1,60 @@
/*
PIP - Platform Independent Primitives
Unit value
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "piunits_value.h"
#include "piliterals_string.h"
#include "piunits_prefix.h"
PIUnits::Value::Value(double v, int t) {
m_value = v;
m_class = Class::Internal::typeClasses.value(t);
if (m_class) m_type = t;
}
PIString PIUnits::Value::toString(char format, int prec) const {
if (isNotValid()) return Class::Internal::unknown;
PIString ret;
if (m_class->supportPrefixes(m_type)) {
ret = Prefix::valueToString(m_value, m_class, m_type, format, prec);
} else
ret = m_class->valueToString(m_value, format, prec) + " "_a;
ret += m_class->unit(m_type);
return ret;
}
bool PIUnits::Value::convert(int type_to) {
if (m_type == type_to) return true;
auto * class_to = Class::Internal::typeClasses.value(type_to);
if (!class_to) return false;
if (m_class->classID() != class_to->classID()) return false;
m_value = m_class->convert(m_value, m_type, type_to);
m_type = type_to;
return true;
}
PIUnits::Value PIUnits::Value::converted(int type_to) {
Value ret(*this);
if (!ret.convert(type_to)) return {};
return ret;
}

View File

@@ -0,0 +1,60 @@
/*! \file piunits_value.h
* \ingroup Core
* \~\brief
* \~english Unit value
* \~russian Единица измерения
*/
/*
PIP - Platform Independent Primitives
Unit value
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PIUNITS_VALUE_H
#define PIUNITS_VALUE_H
#include "piunits_base.h"
namespace PIUnits {
class PIP_EXPORT Value {
public:
Value(double v = 0., int t = Class::Invalid);
bool isValid() const { return m_type >= 0 && m_class; }
bool isNotValid() const { return m_type < 0 || !m_class; }
double value() const { return m_value; }
PIString toString(char format = 'g', int prec = 5) const;
bool convert(int type_to);
Value converted(int type_to);
private:
double m_value = 0.;
int m_type = -1;
Class::Internal::ClassBase * m_class = nullptr;
};
}; // namespace PIUnits
inline PICout operator<<(PICout s, const PIUnits::Value & v) {
s << v.toString();
return s;
}
#endif

437
main.cpp
View File

@@ -3,410 +3,71 @@
#include "pidigest.h"
#include "pihttpclient.h"
#include "pip.h"
#include "piunits.h"
#include "pivaluetree_conversions.h"
using namespace PICoutManipulators;
using namespace PIHTTP;
struct SN {
int _ii;
complexf _co;
PIIODevice::DeviceMode m;
};
struct S {
bool _b;
int _i;
float _f;
PIString str;
// SN _sn;
PIVector2D<bool> v2d;
PIByteArray ba;
PISystemTime st;
PINetworkAddress na;
PIPointd po;
PILined li;
PIRectd re;
};
template<>
PIJSON piSerializeJSON(const SN & v) {
PIJSON ret;
ret["_ii"] = piSerializeJSON(v._ii);
ret["_co"] = piSerializeJSON(v._co);
ret["m"] = piSerializeJSON(v.m);
return ret;
}
template<>
PIJSON piSerializeJSON(const S & v) {
PIJSON ret;
ret["_b"] = piSerializeJSON(v._b);
ret["_i"] = piSerializeJSON(v._i);
ret["_f"] = piSerializeJSON(v._f);
ret["str"] = piSerializeJSON(v.str);
// ret["_sn"] = piSerializeJSON(v._sn);
ret["v2d"] = piSerializeJSON(v.v2d);
ret["ba"] = piSerializeJSON(v.ba);
ret["st"] = piSerializeJSON(v.st);
ret["na"] = piSerializeJSON(v.na);
ret["po"] = piSerializeJSON(v.po);
ret["li"] = piSerializeJSON(v.li);
ret["re"] = piSerializeJSON(v.re);
return ret;
}
template<>
void piDeserializeJSON(SN & v, const PIJSON & js) {
v = {};
piDeserializeJSON(v._ii, js["_ii"]);
piDeserializeJSON(v._co, js["_co"]);
piDeserializeJSON(v.m, js["m"]);
}
template<>
void piDeserializeJSON(S & v, const PIJSON & js) {
v = {};
piDeserializeJSON(v._b, js["_b"]);
piDeserializeJSON(v._i, js["_i"]);
piDeserializeJSON(v._f, js["_f"]);
piDeserializeJSON(v.str, js["str"]);
// piDeserializeJSON(v._sn, js["_sn"]);
piDeserializeJSON(v.v2d, js["v2d"]);
piDeserializeJSON(v.ba, js["ba"]);
piDeserializeJSON(v.st, js["st"]);
piDeserializeJSON(v.na, js["na"]);
piDeserializeJSON(v.po, js["po"]);
piDeserializeJSON(v.li, js["li"]);
piDeserializeJSON(v.re, js["re"]);
}
PIKbdListener kbd;
using namespace PIUnits::Class;
int main(int argc, char * argv[]) {
if (argc < 2) return 0;
PIFile f(argv[1], PIIODevice::ReadOnly);
piCout << "read" << f.path();
auto fc = f.readAll();
piCout << fc.size();
if (!fc.isEmpty()) piCout << PIString::fromUTF8(fc.resized(32));
return 0;
PIHTTPServer server;
server.listen({"127.0.0.1:7777"});
// server.setBasicAuthRealm("pip");
// server.setBasicAuthEnabled(true);
// server.setBasicAuthCallback([](const PIString & u, const PIString & p) -> bool {
// piCout << "basic auth" << u << p;
// return (u == "u" && p == "p");
auto reg = [&server](const PIString & path) {
server.registerPath(path, Method::Get, [path](const PIHTTP::MessageConst & msg) -> PIHTTP::MessageMutable {
piCout << "\nserver rec:\n\tpath: %1\n\t url: %2\n\t args: %3\n\tQ args: %4\n\tP args: %5"_a.arg(path)
.arg(msg.path())
.arg(piStringify(msg.arguments()))
.arg(piStringify(msg.queryArguments()))
.arg(piStringify(msg.pathArguments()));
return MessageMutable().setCode(Code::Accepted);
});
};
// });
reg(" /*/a/get ");
reg(" /*/{ID}/get ");
reg(" /*/*/get ");
reg(" /*/*_b/get ");
reg("/api/{ID}/get");
reg("/api/1/get");
// reg("/api/1/bort{bortID}/get");
// reg("/api/**");
// reg("/api/1/bort2/get");
// reg("/api/**/bort2/get");
/*server.registerPath("api/{ID}/bort{bortID}/get", Method::Get, [](const PIHTTP::MessageConst & msg) -> PIHTTP::MessageMutable {
piCout << "server rec:\n\tpath: %1\n\targs: %2\n\tQ args: %3\n\tP args: %4\n"_a.arg(msg.path())
.arg(piStringify(msg.arguments()))
.arg(piStringify(msg.queryArguments()))
.arg(piStringify(msg.pathArguments()));
return MessageMutable().setCode(Code::Accepted);
});
server.registerPath("sendMessage", Method::Post, [](const PIHTTP::MessageConst & msg) -> PIHTTP::MessageMutable {
return MessageMutable().setCode(Code::Accepted);
});
server.registerUnhandled([](const PIHTTP::MessageConst & msg) -> PIHTTP::MessageMutable {
PIHTTP::MessageMutable ret;
piCout << "server rec:\n\tpath: %1\n\tmethod: %2\n\targs: %3\n\theaders: %4\n\tbody: %5\n"_a.arg(msg.path())
.arg(PIHTTP::methodName(msg.method()))
.arg(piStringify(msg.arguments()))
.arg(PIStringList(msg.headers().map<PIString>([](PIString k, PIString v) { return k + " = " + v; })).join("\n\t\t "))
.arg(PIString::fromUTF8(msg.body()));
ret.setCode(PIHTTP::Code::BadRequest);
ret.setBody(PIByteArray::fromAscii("hello client! 0123456789"));
return ret;
});*/
kbd.enableExitCapture('Q');
WAIT_FOR_EXIT;
return 0;
// PIRegularExpression pire("привет"_u8, PIRegularExpression::CaseInsensitive);
// PIString subj = "the dog ПриВет sat on the cat"_u8;
// PIRegularExpression pire("^(?<date>\\d\\d)/(?<month>\\d\\d)/(?<year>\\d\\d\\d\\d)$"_u8);
// PIString subj = "08/12/1985"_u8;
PIString pat = "*.Exe";
PIRegularExpression re_g = PIRegularExpression::fromGlob(pat, PIRegularExpression::CaseInsensitive);
PIRegularExpression re_p = PIRegularExpression::fromPOSIX(pat, PIRegularExpression::CaseInsensitive);
PIStringList files = {
"(Audio) 20250318-0852-16.8641941.m4a",
"dxwebsetup.exe",
"Firefox Installer.exe",
"LTA8092XS8_R8.pdf",
"SteamSetup.exe",
"TBT_1.41.1325.0.exe",
};
piCout << " src pat" << pat.quoted();
piCout << " Glob pat" << re_g.pattern().quoted();
piCout << "POSIX pat" << re_p.pattern().quoted();
piCout << "\nG P File";
for (auto f: files) {
piCout << (re_g.match(f) ? 1 : 0) << (re_p.match(f) ? 1 : 0) << f;
}
// return 0;
PIRegularExpression pire("(?:\\/\\/\\s*)?.*\\n?(?:\\bfunction\\b)\\s*(?<name>\\b\\w+\\b)\\s*(?:\\((?<args>[^;()]*?)\\))",
PIRegularExpression::Multiline);
PIString subj = PIString::fromUTF8(PIFile::readAll("telegram.qs"));
piCout << "Pattern:" << pire.pattern();
piCout << "Valid:" << pire.isValid();
piCout << "Error at" << pire.errorPosition() << ":" << pire.errorString();
piCout << "Groups count:" << pire.captureGroupsCount();
piCout << "Named groups:" << pire.captureGroupNames();
piCout << "";
auto mr = pire.matchIterator(subj);
auto pire2 = pire;
while (mr.next()) {
// piCout << "Subject" << subj;
piCout << "Matched:" << mr.hasMatch();
piCout << "By number";
for (int i = 0; i <= pire.captureGroupsCount(); ++i)
piCout << i << "=" << mr.matchedString(i).trimmed();
piCout << "By name";
for (auto g: pire.captureGroupNames())
piCout << g.quoted() << "=" << mr.matchedString(g);
piCout << "";
}
piCout << "!!!!!!!!!!!!!!!!!";
pire.match("vfsmndvbjbdlgdvb gdgf");
pire.match(subj);
{
PIVector<complexf> vec;
vec << complexf{0.1, 0.2} << complexf{-1, 0.5};
auto js = PIJSON::serialize(vec);
piCout << vec;
piCout << js;
piCout << PIJSON::deserialize<typeof(vec)>(js);
}
return 0;
/*PICodeParser parser;
parser.parseFile("c:/work/shstk/pip/test_header.h", false);
for (const auto * e: parser.entities) {
piCout << e->type << e->name << "{";
for (const auto & m: e->members) {
piCout << " " << m.type << m.name;
PITranslator::loadLang("ru");
/*auto ucl = PIUnits::allClasses();
for (auto c: ucl) {
piCout << (c->className() + ":");
for (auto t: c->allTypes()) {
piCout << " " << c->name(t) << "->" << c->unit(t);
}
piCout << "}";
}
}*/
return 0;*/
// PIUnits::Value(1);
// piCout << PIUnits::name(PIUnits::Class::Information::Bit);
// piCout << PIUnits::name(PIUnits::Class::Information::Byte);
// piCout << PIUnits::name(PIUnits::Class::Information::_LastType);
// piCout << PIUnits::name((int)PIUnits::Class::Angle::Degree);
// PIJSON j = piSerializeJSON(s);
// piDeserializeJSON(s, j);
PIVector<complexf> vec;
vec << complexf{0.1, 0.2} << complexf{-1, 0.5};
auto js = PIJSON::serialize(vec);
piCout << vec;
piCout << js;
piCout << PIJSON::deserialize<typeof(vec)>(js);
// piCout << PIUnits::unit(PIUnits::Class::Information::Bit);
// piCout << PIUnits::unit(PIUnits::Class::Information::Byte);
// piCout << PIUnits::unit(PIUnits::Class::Information::_LastType);
// piCout << PIUnits::unit((int)PIUnits::Class::Angle::Degree);
/*PIVector<S> s;
s << S{false, 0, 0.1} << S{true, 1, -10.1};
PIMap<int, S> m;
m[1] = S{false, 0, 0.15};
m[2] = S{true, 1, -10.1};
// m[1]._sn._co = {3, 4};
PIJSON j = piSerializeJSON(m);
piCout << j;
piDeserializeJSON(m, j);
piCout << m[1]._f;*/
// piCout << m[1]._sn._co;
// for (int i = -10; i < 10; ++i)
// piCout << PIUnits::Value(pow10(i * 0.99), PIUnits::Class::Distance::Meter).toString();
/*PIVector<int> v({-1, 0, 10, 200});
PIMap<int, float> m({
{-1, -0.1 },
{0, 0.1 },
{100, 200.2}
});
auto v = PIUnits::Value(M_PI, Angle::Radian);
piCout << v << "=" << v.converted(Angle::Degree);
piCout << v;
piCout << piSerializeJSON(v);
piDeserializeJSON(v, piSerializeJSON(v));
piCout << v;
piCout << m;
piDeserializeJSON(m, piSerializeJSON(m));
piCout << piSerializeJSON(m);*/
v = PIUnits::Value(45, Angle::Degree);
piCout << v << "=" << v.converted(Angle::Radian);
return 0;
piCout << PIUnits::Value(5E-5, Time::Second);
piCout << PIUnits::Value(3E-3, Time::Second);
piCout << PIUnits::Value(0.8, Time::Second);
piCout << PIUnits::Value(1.2, Time::Second);
piCout << PIUnits::Value(1001, Time::Second);
piCout << PIUnits::Value(1000001, Time::Second);
/*auto src = PIByteArray::fromAscii("The quick brown fox jumps over the lazy dog");
auto key = PIByteArray::fromAscii("key");
piCout << PIUnits::Value(1_KB, Information::Byte);
piCout << PIUnits::Value(1_MB, Information::Byte);
piCout << PIUnits::Value(1_MiB, Information::Byte);
piCout << PIUnits::Value(1_MB, Information::Byte).converted(Information::Bit);
piCout << PIUnits::Value(1_MiB, Information::Byte).converted(Information::Bit);
PIStringList tnl;
int max_size = 0;
for (int t = 0; t < (int)PIDigest::Type::C ount; ++t) {
tnl << PIDigest::typeName((PIDigest::Type)t);
max_size = piMaxi(max_size, tnl.back().size_s());
}
PIByteArray hs;
piCout << PIString::fromAscii(src);
for (int t = 0; t < (int)PIDigest::Type::Count; ++t) {
hs = PIDigest::calculate(src, (PIDigest::Type)t);
piCout << tnl[t].expandLeftTo(max_size, ' ') << "->" << hs.toHex();
}
for (int t = 0; t < (int)PIDigest::Type::Count; ++t) {
const int bench_count = 100000;
PITimeMeasurer tm;
piForTimes(bench_count) {
hs = PIDigest::calculate(src, (PIDigest::Type)t);
}
auto el = tm.elapsed();
piCout << tnl[t].expandLeftTo(max_size, ' ') << "time" << el.toMilliseconds();
}
piCout << PIUnits::Value(0., Temperature::Celsius).converted(Temperature::Kelvin);
piCout << PIUnits::Value(0., Temperature::Celsius).converted(Temperature::Fahrenheit);
piCout << PIUnits::Value(100., Temperature::Celsius).converted(Temperature::Fahrenheit);
// src.clear();
// crypto_hash_sha512(sout.data(), src.data(), src.size());
// piCout << "sod:" << sout.toHex();
// piCout << "512:" << sha5xx(src, initial_512, 64).toHex();
return 0;*/
/*PIHTTP::MessageMutable req;
req.setBody(PIByteArray::fromAscii("hello server!")).addArgument("a0", "val.0").addArgument("a~r1", "знач,1"_u8);
auto * c = PIHTTPClient::create("http://u:p@127.0.0.1:7777/api", PIHTTP::Method::Get, req);
c->onFinish([](PIHTTP::MessageConst msg) {
piCout << "client rec:\n\tpath: %1\n\tmethod: %2\n\targs: %3\n\theaders: %4\n\tbody: %5\n"_a.arg(msg.path())
.arg(PIHTTP::methodName(msg.method()))
.arg(piStringify(msg.arguments()))
.arg(
PIStringList(msg.headers().map<PIString>([](PIString k, PIString v) { return k + " = " + v; })).join("\n\t\t
")) .arg(PIString::fromUTF8(msg.body()));
})
->onError([c](PIHTTP::MessageConst r) {
piCout << "error" << (int)r.code();
piCout << "msg" << c->lastError();
})
->onAbort([c](PIHTTP::MessageConst r) {
piCout << "abort" << (int)r.code();
piCout << "msg" << c->lastError();
})
->start();*/
auto * c = PIHTTPClient::create(
PIString("127.0.0.1:7777/%1").arg("sendMessag"),
Method::Post,
MessageMutable().addHeader(Header::ContentType, "application/json").setBody(PIByteArray::fromAscii("{hello}")));
c->onFinish([](const PIHTTP::MessageConst & msg) { piCout << "message finish" << (int)msg.code() << PIString::fromUTF8(msg.body()); })
->onError([c](const PIHTTP::MessageConst & msg) { piCout << "message error" << c->lastError(); })
->onAbort([c](const PIHTTP::MessageConst & msg) { piCout << "aborted"; })
->start();
piMSleep(1000);
// CurlThreadPool::instance()->destroy();
// kbd.enableExitCapture();
// WAIT_FOR_EXIT
// kbd.stopAndWait();
// server.stop();
c->abort();
piMSleep(10);
return 0;
// piCout << PIString::readableSize(PISystemMonitor::usedRAM());
/*PIVector<int> vi;
piForTimes(10) {
piSleep(2.);
vi.enlarge(1000000);
piCout << "now" << vi.size() << vi.capacity();
}
piSleep(5.);*/
/*kbd.enableExitCapture();
PIHTTPServer server;
server.setFavicon(PIFile::readAll("logo.png", false));
// server.setOption(MicrohttpdServer::Option::HTTPSEnabled, true);
server.listen({"127.0.0.1", 7777});
// server.listen({"192.168.1.10", 7778});
server.registerPath("/", MicrohttpdServer::Method::Get, [](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
MicrohttpdServer::Reply ret;
ret.setBody(PIByteArray::fromAscii(pageTitle));
return ret;
});
server.registerPath("/html", MicrohttpdServer::Method::Get, [](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
MicrohttpdServer::Reply ret;
ret.setBody("<!DOCTYPE html><html><body><p>arg=%1</p></body></html>"_a.arg(r.args.value("a0")).toUTF8());
return ret;
});
server.registerPath("/api", MicrohttpdServer::Method::Put, [](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
MicrohttpdServer::Reply ret;
ret.setBody(PIByteArray::fromAscii("<!DOCTYPE html><html><body>API</body></html>"));
return ret;
});
server.registerPath("/api/", MicrohttpdServer::Method::Post, [](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
MicrohttpdServer::Reply ret;
ret.setBody("<!DOCTYPE html><html><body>API etry %1</body></html>"_a.arg(r.path).toUTF8());
ret.setCode(405);
return ret;
});
server.registerUnhandled([](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
MicrohttpdServer::Reply ret;
ret.setBody("<!DOCTYPE html><html><body>Unknown</body></html>"_a.arg(r.path).toUTF8());
ret.setCode(404);
return ret;
});*/
/*server.setRequestCallback([](MicrohttpdServer::Request r) -> MicrohttpdServer::Reply {
MicrohttpdServer::Reply rep;
piCout << "request" << r.path;
piCout << " header" << r.headers;
piCout << " args" << r.args;
piCout << " body" << r.body;
piCout << "";
rep.setBody(PIByteArray::fromAscii("[{\"value1\": true, \"value2\": \"ыекштп\"}]"));
return rep;
});*/
/*piCout << "start" << server.isListen();
WAIT_FOR_EXIT
server.stop();*/
piCout << PIUnits::Value(1., Pressure::Atmosphere).converted(Pressure::Pascal);
piCout << PIUnits::Value(1., Pressure::Atmosphere).converted(Pressure::MillimetreOfMercury);
piCout << PIUnits::Value(766., Pressure::MillimetreOfMercury).converted(Pressure::Atmosphere);
piCout << PIUnits::Value(5E-5, Time::Second).converted(Time::Hertz);
piCout << PIUnits::Value(3E-3, Time::Second).converted(Time::Hertz);
piCout << PIUnits::Value(0.8, Time::Second).converted(Time::Hertz);
piCout << PIUnits::Value(1.2, Time::Second).converted(Time::Hertz);
piCout << PIUnits::Value(1001, Time::Second).converted(Time::Hertz);
piCout << PIUnits::Value(1000001, Time::Second).converted(Time::Hertz);
// piCout << PIUnits::Value(0.2, Time::Second).converted(Time::Hertz);
// piCout << PIUnits::Value(5E-5, Time::Second).converted(Time::Hertz);
return 0;
}