Home | History | Annotate | Download | only in i18n
      1 /*
      2  * Copyright (C) 2015, International Business Machines
      3  * Corporation and others.  All Rights Reserved.
      4  *
      5  * file name: pluralaffix.cpp
      6  */
      7 
      8 #include "unicode/utypes.h"
      9 
     10 #if !UCONFIG_NO_FORMATTING
     11 
     12 #include "cstring.h"
     13 #include "digitaffix.h"
     14 #include "pluralaffix.h"
     15 
     16 U_NAMESPACE_BEGIN
     17 
     18 UBool
     19 PluralAffix::setVariant(
     20         const char *variant, const UnicodeString &value, UErrorCode &status) {
     21     DigitAffix *current = affixes.getMutable(variant, status);
     22     if (U_FAILURE(status)) {
     23         return FALSE;
     24     }
     25     current->remove();
     26     current->append(value);
     27     return TRUE;
     28 }
     29 
     30 void
     31 PluralAffix::remove() {
     32     affixes.clear();
     33 }
     34 
     35 void
     36 PluralAffix::appendUChar(
     37         const UChar value, int32_t fieldId) {
     38     PluralMapBase::Category index = PluralMapBase::NONE;
     39     for (DigitAffix *current = affixes.nextMutable(index);
     40             current != NULL; current = affixes.nextMutable(index)) {
     41         current->appendUChar(value, fieldId);
     42     }
     43 }
     44 
     45 void
     46 PluralAffix::append(
     47         const UnicodeString &value, int32_t fieldId) {
     48     PluralMapBase::Category index = PluralMapBase::NONE;
     49     for (DigitAffix *current = affixes.nextMutable(index);
     50             current != NULL; current = affixes.nextMutable(index)) {
     51         current->append(value, fieldId);
     52     }
     53 }
     54 
     55 void
     56 PluralAffix::append(
     57         const UChar *value, int32_t charCount, int32_t fieldId) {
     58     PluralMapBase::Category index = PluralMapBase::NONE;
     59     for (DigitAffix *current = affixes.nextMutable(index);
     60             current != NULL; current = affixes.nextMutable(index)) {
     61         current->append(value, charCount, fieldId);
     62     }
     63 }
     64 
     65 UBool
     66 PluralAffix::append(
     67         const PluralAffix &rhs, int32_t fieldId, UErrorCode &status) {
     68     if (U_FAILURE(status)) {
     69         return FALSE;
     70     }
     71     PluralMapBase::Category index = PluralMapBase::NONE;
     72     while(rhs.affixes.next(index) != NULL) {
     73         affixes.getMutableWithDefault(index, affixes.getOther(), status);
     74     }
     75     index = PluralMapBase::NONE;
     76     for (DigitAffix *current = affixes.nextMutable(index);
     77             current != NULL; current = affixes.nextMutable(index)) {
     78         current->append(rhs.affixes.get(index).toString(), fieldId);
     79     }
     80     return TRUE;
     81 }
     82 
     83 const DigitAffix &
     84 PluralAffix::getByCategory(const char *category) const {
     85     return affixes.get(category);
     86 }
     87 
     88 const DigitAffix &
     89 PluralAffix::getByCategory(const UnicodeString &category) const {
     90     return affixes.get(category);
     91 }
     92 
     93 UBool
     94 PluralAffix::hasMultipleVariants() const {
     95     // This works because OTHER is guaranteed to be the first enum value
     96     PluralMapBase::Category index = PluralMapBase::OTHER;
     97     return (affixes.next(index) != NULL);
     98 }
     99 
    100 U_NAMESPACE_END
    101 
    102 #endif /* #if !UCONFIG_NO_FORMATTING */
    103