Guest User

Untitled

a guest
Sep 10th, 2025
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.40 KB | None | 0 0
  1. diff --git a/src/gettext_plural_form.cpp b/src/gettext_plural_form.cpp
  2. index 89dd721a4..0e2f95ce4 100644
  3. --- a/src/gettext_plural_form.cpp
  4. +++ b/src/gettext_plural_form.cpp
  5. @@ -3,6 +3,7 @@
  6.  
  7.  #include "gettext_plural_form.h"
  8.  #include "util/string.h"
  9. +#include <type_traits>
  10.  
  11.  static size_t minsize(const GettextPluralForm::Ptr &form)
  12.  {
  13. @@ -95,11 +96,11 @@ typedef ParserResult (*Parser)(const size_t, std::wstring_view);
  14.  static ParserResult parse_expr(const size_t nplurals, std::wstring_view str);
  15.  
  16.  template<Parser Parser, template<typename> typename Operator>
  17. -static ParserResult reduce_ltr(const size_t nplurals, const ParserResult &res, const wchar_t* pattern)
  18. +static ParserResult reduce_ltr_single(const size_t nplurals, const ParserResult &res, const std::wstring &pattern)
  19.  {
  20.     if (!str_starts_with(res.second, pattern))
  21.         return ParserResult(nullptr, res.second);
  22. -   auto next = Parser(nplurals, trim(res.second.substr(std::char_traits<wchar_t>::length(pattern))));
  23. +   auto next = Parser(nplurals, trim(res.second.substr(pattern.size())));
  24.     if (!next.first)
  25.         return next;
  26.     next.first = GettextPluralForm::Ptr(new BinaryOperation<Operator>(res.first, next.first));
  27. @@ -108,29 +109,29 @@ static ParserResult reduce_ltr(const size_t nplurals, const ParserResult &res, c
  28.  }
  29.  
  30.  template<Parser Parser>
  31. -static ParserResult reduce_ltr(const size_t nplurals, const ParserResult &res, const wchar_t**)
  32. +static ParserResult reduce_ltr(const size_t nplurals, const ParserResult &res)
  33.  {
  34.     return ParserResult(nullptr, res.second);
  35.  }
  36.  
  37.  template<Parser Parser, template<typename> typename Operator, template<typename> typename... Operators>
  38. -static ParserResult reduce_ltr(const size_t nplurals, const ParserResult &res, const wchar_t** patterns)
  39. +static ParserResult reduce_ltr(const size_t nplurals, const ParserResult &res, const std::wstring &pattern, const typename std::conditional<1,std::wstring,Operators<GettextPluralForm::NumT>>::type&... patterns)
  40.  {
  41. -   auto next = reduce_ltr<Parser, Operator>(nplurals, res, patterns[0]);
  42. +   auto next = reduce_ltr_single<Parser, Operator>(nplurals, res, pattern);
  43.     if (next.first || next.second != res.second)
  44.         return next;
  45. -   return reduce_ltr<Parser, Operators...>(nplurals, res, patterns+1);
  46. +   return reduce_ltr<Parser, Operators...>(nplurals, res, patterns...);
  47.  }
  48.  
  49. -template<Parser Parser, template<typename> typename Operator, template<typename> typename... Operators>
  50. -static ParserResult parse_ltr(const size_t nplurals, std::wstring_view str, const wchar_t** patterns)
  51. +template<Parser Parser, template<typename> typename... Operators>
  52. +static ParserResult parse_ltr(const size_t nplurals, std::wstring_view str, const typename std::conditional<1,std::wstring,Operators<GettextPluralForm::NumT>>::type&... patterns)
  53.  {
  54.     auto &&pres = Parser(nplurals, str);
  55.     if (!pres.first)
  56.         return pres;
  57.     pres.second = trim(pres.second);
  58.     while (!pres.second.empty()) {
  59. -       auto next = reduce_ltr<Parser, Operator, Operators...>(nplurals, pres, patterns);
  60. +       auto next = reduce_ltr<Parser, Operators...>(nplurals, pres, patterns...);
  61.         if (!next.first)
  62.             return pres;
  63.         next.second = trim(next.second);
  64. @@ -181,38 +182,32 @@ static ParserResult parse_negation(const size_t nplurals, std::wstring_view str)
  65.  
  66.  static ParserResult parse_multiplicative(const size_t nplurals, std::wstring_view str)
  67.  {
  68. -   static const wchar_t *patterns[] = { L"*", L"/", L"%" };
  69. -   return parse_ltr<parse_negation, std::multiplies, std::divides, std::modulus>(nplurals, str, patterns);
  70. +   return parse_ltr<parse_negation, std::multiplies, std::divides, std::modulus>(nplurals, str, L"*", L"/", L"%");
  71.  }
  72.  
  73.  static ParserResult parse_additive(const size_t nplurals, std::wstring_view str)
  74.  {
  75. -   static const wchar_t *patterns[] = { L"+", L"-" };
  76. -   return parse_ltr<parse_multiplicative, std::plus, std::minus>(nplurals, str, patterns);
  77. +   return parse_ltr<parse_multiplicative, std::plus, std::minus>(nplurals, str, L"+", L"-");
  78.  }
  79.  
  80.  static ParserResult parse_comparison(const size_t nplurals, std::wstring_view str)
  81.  {
  82. -   static const wchar_t *patterns[] = { L"<=", L">=", L"<", L">" };
  83. -   return parse_ltr<parse_additive, std::less_equal, std::greater_equal, std::less, std::greater>(nplurals, str, patterns);
  84. +   return parse_ltr<parse_additive, std::less_equal, std::greater_equal, std::less, std::greater>(nplurals, str, L"<=", L">=", L"<", L">");
  85.  }
  86.  
  87.  static ParserResult parse_equality(const size_t nplurals, std::wstring_view str)
  88.  {
  89. -   static const wchar_t *patterns[] = { L"==", L"!=" };
  90. -   return parse_ltr<parse_comparison, std::equal_to, std::not_equal_to>(nplurals, str, patterns);
  91. +   return parse_ltr<parse_comparison, std::equal_to, std::not_equal_to>(nplurals, str, L"==", L"!=");
  92.  }
  93.  
  94.  static ParserResult parse_conjunction(const size_t nplurals, std::wstring_view str)
  95.  {
  96. -   static const wchar_t *and_pattern[] = { L"&&" };
  97. -   return parse_ltr<parse_equality, std::logical_and>(nplurals, str, and_pattern);
  98. +   return parse_ltr<parse_equality, std::logical_and>(nplurals, str, L"&&");
  99.  }
  100.  
  101.  static ParserResult parse_disjunction(const size_t nplurals, std::wstring_view str)
  102.  {
  103. -   static const wchar_t *or_pattern[] = { L"||" };
  104. -   return parse_ltr<parse_conjunction, std::logical_or>(nplurals, str, or_pattern);
  105. +   return parse_ltr<parse_conjunction, std::logical_or>(nplurals, str, L"||");
  106.  }
  107.  
  108.  static ParserResult parse_ternary(const size_t nplurals, std::wstring_view str)
  109.  
Advertisement
Add Comment
Please, Sign In to add comment