From 3504c25f84972febaf70c0a60aa661c17819d02a Mon Sep 17 00:00:00 2001 From: peri4 Date: Mon, 11 Aug 2025 19:27:12 +0300 Subject: [PATCH] PIRegularExpression::from static constructor --- libs/main/serialization/pijsonserialization.h | 6 ++-- libs/main/text/piregularexpression.cpp | 34 +++++++++++++++++++ libs/main/text/piregularexpression.h | 5 +++ main_picloud_test.cpp | 6 +++- 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/libs/main/serialization/pijsonserialization.h b/libs/main/serialization/pijsonserialization.h index 36cc72d8..1edf7c00 100644 --- a/libs/main/serialization/pijsonserialization.h +++ b/libs/main/serialization/pijsonserialization.h @@ -52,7 +52,8 @@ template::value, int>::type = 0, typename std::enable_if::value, int>::type = 0> inline PIJSON piSerializeJSON(const T & v) { - static_assert(false, "[piSerializeJSON] Error: using undeclared piSerializeJSON() for complex type!"); + static_assert(std::is_enum::value || std::is_arithmetic::value, + "[piSerializeJSON] Error: using undeclared piSerializeJSON() for complex type!"); return {}; } @@ -239,7 +240,8 @@ template::value, int>::type = 0, typename std::enable_if::value, int>::type = 0> inline void piDeserializeJSON(T & v, const PIJSON & js) { - static_assert(false, "[piDeserializeJSON] Error: using undeclared piDeserializeJSON() for complex type!"); + static_assert(std::is_enum::value || std::is_arithmetic::value, + "[piDeserializeJSON] Error: using undeclared piDeserializeJSON() for complex type!"); v = {}; } diff --git a/libs/main/text/piregularexpression.cpp b/libs/main/text/piregularexpression.cpp index b7336765..82772a22 100644 --- a/libs/main/text/piregularexpression.cpp +++ b/libs/main/text/piregularexpression.cpp @@ -286,3 +286,37 @@ int PIRegularExpression::Matcher::matchedStart(const PIString & gname) const { int PIRegularExpression::Matcher::matchedSize(const PIString & gname) const { return matchedSize(parent->PRIVATEWB->named_group_index.value(gname)); } + + +PIRegularExpression PIRegularExpression::fromGlob(const PIString & pattern, Options opt) { + PIRegularExpression ret; + ret.convertFrom(pattern, PCRE2_CONVERT_GLOB, opt); + return ret; +} + + +PIRegularExpression PIRegularExpression::fromPOSIX(const PIString & pattern, Options opt) { + PIRegularExpression ret; + ret.convertFrom(pattern, PCRE2_CONVERT_POSIX_BASIC, opt); + return ret; +} + + +void PIRegularExpression::convertFrom(const PIString & pattern, uint type, Options opt) { + if (pattern.isEmpty()) return; + PIChar * cptr = &((PIString &)pattern)[0]; + PCRE2_UCHAR * out = nullptr; + PCRE2_SIZE out_size = 0; + int rc = pcre2_pattern_convert((PCRE2_SPTR)cptr, + pattern.size_s(), + type | PCRE2_CONVERT_UTF | PCRE2_CONVERT_NO_UTF_CHECK, + &out, + &out_size, + nullptr); + if (rc != 0) { + piCout << "PIRegularExpression::convertFrom error" << rc; + } else { + setPattern(PIString((PIChar *)out, out_size), opt); + } + pcre2_converted_pattern_free(out); +} diff --git a/libs/main/text/piregularexpression.h b/libs/main/text/piregularexpression.h index cce5a567..82c39bf6 100644 --- a/libs/main/text/piregularexpression.h +++ b/libs/main/text/piregularexpression.h @@ -109,7 +109,12 @@ public: Matcher makeMatcher(const PIString & subject, size_t offset = 0); Matcher makeMatcher(PIString & subject, size_t offset = 0); + static PIRegularExpression fromGlob(const PIString & pattern, Options opt = None); + static PIRegularExpression fromPOSIX(const PIString & pattern, Options opt = None); + private: + void convertFrom(const PIString & pattern, uint type, Options opt); + PRIVATE_DECLARATION(PIP_EXPORT) PIString pat_, subj_own; Options opt_; diff --git a/main_picloud_test.cpp b/main_picloud_test.cpp index 797dc648..e83e61eb 100644 --- a/main_picloud_test.cpp +++ b/main_picloud_test.cpp @@ -1,5 +1,9 @@ +#include "picli.h" +#include "picloudclient.h" +#include "picloudserver.h" +#include "pikbdlistener.h" #include "piliterals_time.h" -#include "pip.h" +#include "pitimer.h" int main(int argc, char * argv[]) { PIByteArray rnd;