version 5.4.0

remove CORS default header from PIHTTPServer
fix several docs
fix PIMathVector::dot return type
add units directory with PIUnits facility
This commit is contained in:
2025-09-26 21:33:45 +03:00
parent daab41e41e
commit 5db97ca959
30 changed files with 1888 additions and 556 deletions

View File

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

View File

@@ -5,7 +5,7 @@ if (POLICY CMP0177)
endif()
project(PIP)
set(PIP_MAJOR 5)
set(PIP_MINOR 3)
set(PIP_MINOR 4)
set(PIP_REVISION 0)
set(PIP_SUFFIX )
set(PIP_COMPANY SHS)

Binary file not shown.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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,81 @@
/*! \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 {
/*
enum class Angle {
Degree = 0x200,
Radian,
};
enum class Time {
Second = 0x300,
Hertz,
};
enum class Temperature {
Kelvin = 0x400,
Celsius,
Fahrenheit,
};
enum class Pressure {
Pascal = 0x500,
};
enum class Distance {
Meter = 0x500,
};
};
*/
class PIP_EXPORT Value {
public:
Value(double v = 0., int t = Class::Invalid);
bool isValid() const { return m_type >= 0 && m_class; }
bool isNotValid() const { return m_type < 0 || !m_class; }
double value() const { return m_value; }
PIString toString(char format = 'g', int prec = 5) const;
bool convert(int type_to);
Value converted(int type_to);
private:
double m_value = 0.;
int m_type = -1;
Class::Internal::ClassBase * m_class = nullptr;
};
}; // namespace PIUnits
inline PICout operator<<(PICout s, const PIUnits::Value & v) {
s << v.toString();
return s;
}
#endif

437
main.cpp
View File

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