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