Skip to content

Commit

Permalink
brace style
Browse files Browse the repository at this point in the history
  • Loading branch information
y5nw committed Oct 9, 2024
1 parent 8c2c55d commit aec957d
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 21 deletions.
51 changes: 33 additions & 18 deletions src/gettext_plural_form.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,40 +4,48 @@
#include "gettext_plural_form.h"
#include "util/string.h"

static size_t minsize(const GettextPluralForm::Ptr &form) {
static size_t minsize(const GettextPluralForm::Ptr &form)
{
return form ? form->size() : 0;
}

static size_t minsize(const GettextPluralForm::Ptr &f, const GettextPluralForm::Ptr &g) {
static size_t minsize(const GettextPluralForm::Ptr &f, const GettextPluralForm::Ptr &g)
{
if (sizeof(g) > 0)
return std::min(minsize(f), minsize(g));
return f ? f->size() : 0;
}

class Identity: public GettextPluralForm {
class Identity: public GettextPluralForm
{
public:
Identity(size_t nplurals): GettextPluralForm(nplurals) {};
NumT operator()(const NumT n) const override {
NumT operator()(const NumT n) const override
{
return n;
}
};

class ConstValue: public GettextPluralForm {
class ConstValue: public GettextPluralForm
{
public:
ConstValue(size_t nplurals, NumT val): GettextPluralForm(nplurals), value(val) {};
NumT operator()(const NumT n) const override {
NumT operator()(const NumT n) const override
{
return value;
}
private:
NumT value;
};

template<template<typename> typename F>
class UnaryOperation: public GettextPluralForm {
class UnaryOperation: public GettextPluralForm
{
public:
UnaryOperation(const Ptr &op):
GettextPluralForm(minsize(op)), op(op) {}
NumT operator()(const NumT n) const override {
NumT operator()(const NumT n) const override
{
if (operator bool())
return func((*op)(n));
return 0;
Expand All @@ -48,12 +56,14 @@ class UnaryOperation: public GettextPluralForm {
};

template<template<typename> typename F>
class BinaryOperation: public GettextPluralForm {
class BinaryOperation: public GettextPluralForm
{
public:
BinaryOperation(const Ptr &lhs, const Ptr &rhs):
GettextPluralForm(minsize(lhs, rhs)),
lhs(lhs), rhs(rhs) {}
NumT operator()(const NumT n) const override {
NumT operator()(const NumT n) const override
{
if (operator bool())
return func((*lhs)(n), (*rhs)(n));
return 0;
Expand All @@ -63,12 +73,14 @@ class BinaryOperation: public GettextPluralForm {
static constexpr F<NumT> func = {};
};

class TernaryOperation: public GettextPluralForm {
class TernaryOperation: public GettextPluralForm
{
public:
TernaryOperation(const Ptr &cond, const Ptr &val, const Ptr &alt):
GettextPluralForm(std::min(minsize(cond), minsize(val, alt))),
cond(cond), val(val), alt(alt) {}
NumT operator()(const NumT n) const override {
NumT operator()(const NumT n) const override
{
if (operator bool())
return (*cond)(n) ? (*val)(n) : (*alt)(n);
return 0;
Expand Down Expand Up @@ -102,21 +114,22 @@ static ParserResult reduce_ltr(const size_t nplurals, const ParserResult &res, c
}

template<Parser Parser, template<typename> typename Operator, template<typename> typename... Operators>
static ParserResult reduce_ltr(const size_t nplurals, const ParserResult &res, const wchar_t** patterns) {
static ParserResult reduce_ltr(const size_t nplurals, const ParserResult &res, const wchar_t** patterns)
{
auto next = reduce_ltr<Parser, Operator>(nplurals, res, patterns[0]);
if (next.first || next.second != res.second)
return next;
return reduce_ltr<Parser, Operators...>(nplurals, res, patterns+1);
}

template<Parser Parser, template<typename> typename Operator, template<typename> typename... Operators>
static ParserResult parse_ltr(const size_t nplurals, const std::wstring_view &str, const wchar_t** patterns) {
static ParserResult parse_ltr(const size_t nplurals, const std::wstring_view &str, const wchar_t** patterns)
{
auto &&pres = Parser(nplurals, str);
if (!pres.first)
return pres;
pres.second = trim(pres.second);
while (!pres.second.empty())
{
while (!pres.second.empty()) {
auto next = reduce_ltr<Parser, Operator, Operators...>(nplurals, pres, patterns);
if (!next.first)
return pres;
Expand Down Expand Up @@ -221,7 +234,8 @@ static ParserResult parse_expr(const size_t nplurals, const std::wstring_view &s
return parse_ternary(nplurals, trim(str));
}

GettextPluralForm::Ptr GettextPluralForm::parse(const size_t nplurals, const std::wstring_view &str) {
GettextPluralForm::Ptr GettextPluralForm::parse(const size_t nplurals, const std::wstring_view &str)
{
if (nplurals == 0)
return nullptr;
auto result = parse_expr(nplurals, str);
Expand All @@ -230,7 +244,8 @@ GettextPluralForm::Ptr GettextPluralForm::parse(const size_t nplurals, const std
return result.first;
}

GettextPluralForm::Ptr GettextPluralForm::parseHeaderLine(const std::wstring_view &str) {
GettextPluralForm::Ptr GettextPluralForm::parseHeaderLine(const std::wstring_view &str)
{
if (!str_starts_with(str, L"Plural-Forms: nplurals=") || !str_ends_with(str, L";"))
return nullptr;
auto nplurals = wcstoul(str.data()+23, nullptr, 10);
Expand Down
14 changes: 11 additions & 3 deletions src/gettext_plural_form.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,21 @@

// Note that this only implements a subset of C expressions. See:
// https://git.savannah.gnu.org/gitweb/?p=gettext.git;a=blob;f=gettext-runtime/intl/plural.y
class GettextPluralForm {
class GettextPluralForm
{
public:
using NumT = unsigned long;
using Ptr = std::shared_ptr<GettextPluralForm>;
size_t size() const { return nplurals; };

size_t size() const
{
return nplurals;
};
virtual NumT operator()(const NumT) const = 0;
virtual operator bool() const { return size() > 0; }
virtual operator bool() const
{
return size() > 0;
}
virtual ~GettextPluralForm() {};

static GettextPluralForm::Ptr parse(const size_t nplurals, const std::wstring_view &str);
Expand Down

0 comments on commit aec957d

Please sign in to comment.