Compare commits

10 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
2368de6e93 rename PRIVATE_DEFINITION_FINISH to PRIVATE_DEFINITION_END_NO_INITIALIZE 2025-09-21 21:05:56 +03:00
43 changed files with 1939 additions and 577 deletions

View File

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

View File

@@ -5,7 +5,7 @@ if (POLICY CMP0177)
endif() endif()
project(PIP) project(PIP)
set(PIP_MAJOR 5) set(PIP_MAJOR 5)
set(PIP_MINOR 3) set(PIP_MINOR 5)
set(PIP_REVISION 0) set(PIP_REVISION 0)
set(PIP_SUFFIX ) set(PIP_SUFFIX )
set(PIP_COMPANY SHS) 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(INTROSPECTION "Build with introspection" OFF)
option(TESTS "Build tests and perform their before install step" OFF) option(TESTS "Build tests and perform their before install step" OFF)
option(COVERAGE "Build project with coverage info" 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(PIP_UTILS 1)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE) set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD 11)
@@ -436,8 +439,23 @@ if (NOT CROSSTOOLS)
if (PIP_BUILD_FFTW) if (PIP_BUILD_FFTW)
# Check if PIP support fftw3 for PIFFT using in math module # Check if PIP support fftw3 for PIFFT using in math module
set(FFTW_LIB_NAME fftw3) 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_LIB_SUFFIXES2 "" "-3")
set(FFTW_MSG "")
set(FFTW_LIBS) set(FFTW_LIBS)
set(FFTW_ABS_LIBS) set(FFTW_ABS_LIBS)
set(CMAKE_REQUIRED_INCLUDES fftw3.h) set(CMAKE_REQUIRED_INCLUDES fftw3.h)
@@ -452,6 +470,10 @@ if (NOT CROSSTOOLS)
set(${FFTW_CLN}_FOUND FALSE) set(${FFTW_CLN}_FOUND FALSE)
set(${FFTW_CLNT}_FOUND FALSE) set(${FFTW_CLNT}_FOUND FALSE)
if(${FFTW_CLN}_LIBRARIES) 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) set(${FFTW_CLN}_FOUND TRUE)
list(APPEND FFTW_LIBS "${FFTW_CLN}") list(APPEND FFTW_LIBS "${FFTW_CLN}")
list(APPEND FFTW_ABS_LIBS "${${FFTW_CLN}_LIBRARIES}") list(APPEND FFTW_ABS_LIBS "${${FFTW_CLN}_LIBRARIES}")
@@ -475,7 +497,7 @@ if (NOT CROSSTOOLS)
endforeach() endforeach()
endforeach() endforeach()
if(FFTW_LIBS) if(FFTW_LIBS)
pip_module(fftw "${FFTW_LIBS}" "PIP FFTW support" "" "" "") pip_module(fftw "${FFTW_LIBS}" "PIP FFTW support" "" "" " (${FFTW_MSG})")
endif() endif()
endif() endif()

Binary file not shown.

View File

@@ -20,7 +20,7 @@
<context> <context>
<name>PIFile</name> <name>PIFile</name>
<message> <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> <source>Downsize is not supported yet :-(</source>
<translation>Уменьшение размера не поддерживается</translation> <translation>Уменьшение размера не поддерживается</translation>
</message> </message>
@@ -66,6 +66,239 @@
<translation type="vanished">Предупреждение: PICrypt неактивен, для активации установите библиотеку sodium и пересоберите PIP</translation> <translation type="vanished">Предупреждение: PICrypt неактивен, для активации установите библиотеку sodium и пересоберите PIP</translation>
</message> </message>
</context> </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> <context>
<name>PIBinLog</name> <name>PIBinLog</name>
<message> <message>
@@ -253,47 +486,47 @@
<context> <context>
<name>PIString</name> <name>PIString</name>
<message> <message>
<location filename="../libs/main/text/pistring.cpp" line="1787"/> <location filename="../libs/main/text/pistring.cpp" line="1807"/>
<source>B</source> <source>B</source>
<translation>Б</translation> <translation>Б</translation>
</message> </message>
<message> <message>
<location filename="../libs/main/text/pistring.cpp" line="1807"/> <location filename="../libs/main/text/pistring.cpp" line="1827"/>
<source>EiB</source> <source>EiB</source>
<translation>ЭиБ</translation> <translation>ЭиБ</translation>
</message> </message>
<message> <message>
<location filename="../libs/main/text/pistring.cpp" line="1804"/> <location filename="../libs/main/text/pistring.cpp" line="1824"/>
<source>GiB</source> <source>GiB</source>
<translation>ГиБ</translation> <translation>ГиБ</translation>
</message> </message>
<message> <message>
<location filename="../libs/main/text/pistring.cpp" line="1802"/> <location filename="../libs/main/text/pistring.cpp" line="1822"/>
<source>KiB</source> <source>KiB</source>
<translation>КиБ</translation> <translation>КиБ</translation>
</message> </message>
<message> <message>
<location filename="../libs/main/text/pistring.cpp" line="1803"/> <location filename="../libs/main/text/pistring.cpp" line="1823"/>
<source>MiB</source> <source>MiB</source>
<translation>МиБ</translation> <translation>МиБ</translation>
</message> </message>
<message> <message>
<location filename="../libs/main/text/pistring.cpp" line="1806"/> <location filename="../libs/main/text/pistring.cpp" line="1826"/>
<source>PiB</source> <source>PiB</source>
<translation>ПиБ</translation> <translation>ПиБ</translation>
</message> </message>
<message> <message>
<location filename="../libs/main/text/pistring.cpp" line="1805"/> <location filename="../libs/main/text/pistring.cpp" line="1825"/>
<source>TiB</source> <source>TiB</source>
<translation>ТиБ</translation> <translation>ТиБ</translation>
</message> </message>
<message> <message>
<location filename="../libs/main/text/pistring.cpp" line="1809"/> <location filename="../libs/main/text/pistring.cpp" line="1829"/>
<source>YiB</source> <source>YiB</source>
<translation>ЙиБ</translation> <translation>ЙиБ</translation>
</message> </message>
<message> <message>
<location filename="../libs/main/text/pistring.cpp" line="1808"/> <location filename="../libs/main/text/pistring.cpp" line="1828"/>
<source>ZiB</source> <source>ZiB</source>
<translation>ЗиБ</translation> <translation>ЗиБ</translation>
</message> </message>
@@ -319,7 +552,7 @@
<context> <context>
<name>PIProcess</name> <name>PIProcess</name>
<message> <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> <source>&quot;CreateProcess&quot; error: %1</source>
<translation>Ошибка &quot;CreateProcess&quot;: %1</translation> <translation>Ошибка &quot;CreateProcess&quot;: %1</translation>
</message> </message>
@@ -327,12 +560,12 @@
<context> <context>
<name>PIVariant</name> <name>PIVariant</name>
<message> <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> <source>Can`t initialize PIVariant from unregistered type &quot;%1&quot;!</source>
<translation>Невозможно инициализировать PIVariant из незарегистрированного типа &quot;%1&quot;!</translation> <translation>Невозможно инициализировать PIVariant из незарегистрированного типа &quot;%1&quot;!</translation>
</message> </message>
<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> <source>Can`t initialize PIVariant from unregistered typeID &quot;%1&quot;!</source>
<translation>Невозможно инициализировать PIVariant из незарегистрированного ID типа &quot;%1&quot;!</translation> <translation>Невозможно инициализировать PIVariant из незарегистрированного ID типа &quot;%1&quot;!</translation>
</message> </message>
@@ -358,7 +591,7 @@
<context> <context>
<name>PIEthernet</name> <name>PIEthernet</name>
<message> <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> <source>Can`t get interfaces: %1</source>
<translation>Невозможно получить интерфейсы: %1</translation> <translation>Невозможно получить интерфейсы: %1</translation>
</message> </message>
@@ -389,6 +622,34 @@
<translation>Ошибка: Режим ReadWrite не поддерживается, используйте WriteOnly или ReadOnly</translation> <translation>Ошибка: Режим ReadWrite не поддерживается, используйте WriteOnly или ReadOnly</translation>
</message> </message>
</context> </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> <context>
<name>PIConnection</name> <name>PIConnection</name>
<message> <message>
@@ -455,6 +716,29 @@
<translation>toSystemTime() Предупреждение: неверная частота: %1</translation> <translation>toSystemTime() Предупреждение: неверная частота: %1</translation>
</message> </message>
</context> </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> <context>
<name>PIEthUtilBase</name> <name>PIEthUtilBase</name>
<message> <message>
@@ -528,4 +812,111 @@
<translation>Невозможно открыть процесс с ID = %1, %2!</translation> <translation>Невозможно открыть процесс с ID = %1, %2!</translation>
</message> </message>
</context> </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> </TS>

View File

@@ -189,8 +189,8 @@ void PIScreen::SystemConsole::print() {
for (int j = 0; j < dh; ++j) { for (int j = 0; j < dh; ++j) {
int k = j * dw + i; int k = j * dw + i;
Cell & c(cells[j + dy0][i + dx0]); Cell & c(cells[j + dy0][i + dx0]);
PRIVATE->chars[k].Char.UnicodeChar = 0; PRIVATE->chars[k].Char.UnicodeChar = c.symbol.unicode16Code();
PRIVATE->chars[k].Char.AsciiChar = c.symbol.toConsole1Byte(); // PRIVATE->chars[k].Char.AsciiChar = c.symbol.toConsole1Byte();
PRIVATE->chars[k].Attributes = attributes(c); PRIVATE->chars[k].Attributes = attributes(c);
} }
// piCout << "draw" << dw << dh; // piCout << "draw" << dw << dh;
@@ -200,7 +200,7 @@ void PIScreen::SystemConsole::print() {
PRIVATE->srect.Top += dy0; PRIVATE->srect.Top += dy0;
PRIVATE->srect.Right -= width - dx1 - 1; PRIVATE->srect.Right -= width - dx1 - 1;
PRIVATE->srect.Bottom -= height - dy1 - 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 #else
PIString s; PIString s;
int si = 0, sj = 0; 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::ContentType, "application/json; charset=utf-8");
} }
} }
msg.addHeader(Header::AccessControlAllowOrigin, "*"); // msg.addHeader(Header::AccessControlAllowOrigin, "*");
} }

View File

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

View File

@@ -333,8 +333,8 @@ typedef long long ssize_t;
__PrivateInitializer__ __privateinitializer__; __PrivateInitializer__ __privateinitializer__;
# define PRIVATE_DEFINITION_START(c) struct c::__Private__ { # define PRIVATE_DEFINITION_START(c) struct c::__Private__ {
# define PRIVATE_DEFINITION_FINISH(c) \ # define PRIVATE_DEFINITION_END_NO_INITIALIZE(c) \
} \ } \
; ;
# define PRIVATE_DEFINITION_INITIALIZE(c) \ # define PRIVATE_DEFINITION_INITIALIZE(c) \
c::__PrivateInitializer__::__PrivateInitializer__() { \ c::__PrivateInitializer__::__PrivateInitializer__() { \
@@ -351,9 +351,9 @@ typedef long long ssize_t;
p = new c::__Private__(); \ p = new c::__Private__(); \
return *this; \ return *this; \
} }
# define PRIVATE_DEFINITION_END(c) \ # define PRIVATE_DEFINITION_END(c) \
PRIVATE_DEFINITION_FINISH(c) \ PRIVATE_DEFINITION_END_NO_INITIALIZE \
PRIVATE_DEFINITION_INITIALIZE(c) (c) PRIVATE_DEFINITION_INITIALIZE(c)
# define PRIVATE (__privateinitializer__.p) # define PRIVATE (__privateinitializer__.p)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -187,7 +187,7 @@ PIString PISPI::constructFullPathDevice() const {
void PISPI::configureFromFullPathDevice(const PIString & full_path) { void PISPI::configureFromFullPathDevice(const PIString & full_path) {
PIStringList pl = full_path.split(":"); PIStringList pl = full_path.split(":");
for (int i = 0; i < pl.size_s(); ++i) { for (int i = 0; i < pl.size_s(); ++i) {
PIString p(pl[i]); PIString p(pl[i].trimmed());
switch (i) { switch (i) {
case 0: setPath(p); break; case 0: setPath(p); break;
case 1: setSpeed(p.toInt()); 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 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 _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 Type & v1, const _CVector & v2) { return v2 * v1; }
static _CVector mul(const _CVector & v1, const Type & v2) { return v1 * v2; } 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 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 _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 Type & v1, const _CVector & v2) { return v2 * v1; }
static _CVector mul(const _CVector & v1, const Type & v2) { return v1 * v2; } static _CVector mul(const _CVector & v1, const Type & v2) { return v1 * v2; }

View File

@@ -712,6 +712,11 @@ int PIVariant::toInt() const {
ba >> r; ba >> r;
return (int)r.rgba; 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); case PIVariant::pivCustom: return getAsValue<int>(*this);
default: break; default: break;
} }
@@ -817,6 +822,11 @@ llong PIVariant::toLLong() const {
ba >> r; ba >> r;
return llong(r.selectedValue()); 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); case PIVariant::pivCustom: return getAsValue<llong>(*this);
default: break; default: break;
} }
@@ -922,6 +932,11 @@ float PIVariant::toFloat() const {
ba >> r; ba >> r;
return float(r.selectedValue()); 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); case PIVariant::pivCustom: return getAsValue<float>(*this);
default: break; default: break;
} }
@@ -1027,6 +1042,11 @@ double PIVariant::toDouble() const {
ba >> r; ba >> r;
return double(r.selectedValue()); 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); case PIVariant::pivCustom: return getAsValue<double>(*this);
default: break; default: break;
} }
@@ -1132,6 +1152,11 @@ ldouble PIVariant::toLDouble() const {
ba >> r; ba >> r;
return ldouble(r.selectedValue()); 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); case PIVariant::pivCustom: return getAsValue<float>(*this);
default: break; 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 "pidigest.h"
#include "pihttpclient.h" #include "pihttpclient.h"
#include "pip.h" #include "pip.h"
#include "piunits.h"
#include "pivaluetree_conversions.h" #include "pivaluetree_conversions.h"
using namespace PICoutManipulators; using namespace PICoutManipulators;
using namespace PIHTTP; using namespace PIHTTP;
using namespace PIUnits::Class;
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;
int main(int argc, char * argv[]) { int main(int argc, char * argv[]) {
if (argc < 2) return 0; PITranslator::loadLang("ru");
PIFile f(argv[1], PIIODevice::ReadOnly); /*auto ucl = PIUnits::allClasses();
piCout << "read" << f.path(); for (auto c: ucl) {
auto fc = f.readAll(); piCout << (c->className() + ":");
piCout << fc.size(); for (auto t: c->allTypes()) {
if (!fc.isEmpty()) piCout << PIString::fromUTF8(fc.resized(32)); piCout << " " << c->name(t) << "->" << c->unit(t);
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;
} }
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); // piCout << PIUnits::unit(PIUnits::Class::Information::Bit);
// piDeserializeJSON(s, j); // piCout << PIUnits::unit(PIUnits::Class::Information::Byte);
PIVector<complexf> vec; // piCout << PIUnits::unit(PIUnits::Class::Information::_LastType);
vec << complexf{0.1, 0.2} << complexf{-1, 0.5}; // piCout << PIUnits::unit((int)PIUnits::Class::Angle::Degree);
auto js = PIJSON::serialize(vec);
piCout << vec;
piCout << js;
piCout << PIJSON::deserialize<typeof(vec)>(js);
/*PIVector<S> s; // for (int i = -10; i < 10; ++i)
s << S{false, 0, 0.1} << S{true, 1, -10.1}; // piCout << PIUnits::Value(pow10(i * 0.99), PIUnits::Class::Distance::Meter).toString();
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;
/*PIVector<int> v({-1, 0, 10, 200}); auto v = PIUnits::Value(M_PI, Angle::Radian);
PIMap<int, float> m({ piCout << v << "=" << v.converted(Angle::Degree);
{-1, -0.1 },
{0, 0.1 },
{100, 200.2}
});
piCout << v; v = PIUnits::Value(45, Angle::Degree);
piCout << piSerializeJSON(v); piCout << v << "=" << v.converted(Angle::Radian);
piDeserializeJSON(v, piSerializeJSON(v));
piCout << v;
piCout << m;
piDeserializeJSON(m, piSerializeJSON(m));
piCout << piSerializeJSON(m);*/
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"); piCout << PIUnits::Value(1_KB, Information::Byte);
auto key = PIByteArray::fromAscii("key"); 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; piCout << PIUnits::Value(0., Temperature::Celsius).converted(Temperature::Kelvin);
int max_size = 0; piCout << PIUnits::Value(0., Temperature::Celsius).converted(Temperature::Fahrenheit);
for (int t = 0; t < (int)PIDigest::Type::C ount; ++t) { piCout << PIUnits::Value(100., Temperature::Celsius).converted(Temperature::Fahrenheit);
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();
}
// src.clear(); piCout << PIUnits::Value(1., Pressure::Atmosphere).converted(Pressure::Pascal);
// crypto_hash_sha512(sout.data(), src.data(), src.size()); piCout << PIUnits::Value(1., Pressure::Atmosphere).converted(Pressure::MillimetreOfMercury);
// piCout << "sod:" << sout.toHex(); piCout << PIUnits::Value(766., Pressure::MillimetreOfMercury).converted(Pressure::Atmosphere);
// 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(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; return 0;
} }