1 // tinygettext - A gettext replacement that works directly on .po files
2 // Copyright (c) 2006 Ingo Ruhnke <grumbel@gmail.com>
3 //
4 // This software is provided 'as-is', without any express or implied
5 // warranty. In no event will the authors be held liable for any damages
6 // arising from the use of this software.
7 //
8 // Permission is granted to anyone to use this software for any purpose,
9 // including commercial applications, and to alter it and redistribute it
10 // freely, subject to the following restrictions:
11 //
12 // 1. The origin of this software must not be misrepresented; you must not
13 //    claim that you wrote the original software. If you use this software
14 //    in a product, an acknowledgement in the product documentation would be
15 //    appreciated but is not required.
16 // 2. Altered source versions must be plainly marked as such, and must not be
17 //    misrepresented as being the original software.
18 // 3. This notice may not be removed or altered from any source distribution.
19 
20 #ifndef HEADER_TINYGETTEXT_PLURAL_FORMS_HPP
21 #define HEADER_TINYGETTEXT_PLURAL_FORMS_HPP
22 
23 #include <string>
24 #include <memory>
25 
26 namespace tinygettext {
27 
28 class PluralFunctor
29 {
30 public:
31   virtual unsigned int operator()(int n) const = 0;
32   virtual ~PluralFunctor();
33 };
34 
35 typedef unsigned int (*PluralFunc)(int n);
36 
37 class PluralFuncFunctor : public PluralFunctor
38 {
39 private:
40   PluralFunc plural;
41 public:
PluralFuncFunctor(PluralFunc plural_)42   PluralFuncFunctor(PluralFunc plural_) : plural(plural_) {}
43   unsigned int operator()(int n) const override;
44   ~PluralFuncFunctor();
45 };
46 
47 class PluralForms
48 {
49 private:
50   unsigned int nplural;
51   std::shared_ptr<PluralFunctor> plural;
52 
53 public:
54   static PluralForms from_string(const std::string& str);
55 
PluralForms()56   PluralForms()
57     : nplural(0),
58       plural(0)
59   {}
60 
PluralForms(unsigned int nplural_,PluralFunc plural_)61   PluralForms(unsigned int nplural_, PluralFunc plural_)
62     : nplural(nplural_),
63       plural(new PluralFuncFunctor(plural_))
64   {}
65 
PluralForms(unsigned int nplural_,PluralFunctor * plural_)66   PluralForms(unsigned int nplural_, PluralFunctor* plural_)
67     : nplural(nplural_),
68       plural(plural_)
69   {}
70 
get_nplural() const71   unsigned int get_nplural() const { return nplural; }
get_plural(int n) const72   unsigned int get_plural(int n) const { if (plural) return (*plural)(n); else return 0; }
73 
operator ==(const PluralForms & other)74   bool operator==(const PluralForms& other) { return nplural == other.nplural && plural == other.plural; }
operator !=(const PluralForms & other)75   bool operator!=(const PluralForms& other) { return !(*this == other); }
76 
operator bool() const77   explicit operator bool() const {
78     return plural != NULL;
79   }
80 };
81 
82 } // namespace tinygettext
83 
84 #endif
85 
86 /* EOF */
87