154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/*
254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*******************************************************************************
359d709d503bab6e2b61931737e662dd293b40578ccornelius* Copyright (C) 2008-2013, International Business Machines Corporation and
454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* others. All Rights Reserved.
554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*******************************************************************************
654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*
754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*
854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* File GENDER.CPP
954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*
1054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* Modification History:*
1154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*   Date        Name        Description
1254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*
1354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius********************************************************************************
1454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*/
1554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
1654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "unicode/utypes.h"
1754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
1854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if !UCONFIG_NO_FORMATTING
1954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
2054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "unicode/gender.h"
2154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "unicode/ugender.h"
2254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "unicode/ures.h"
2354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
2454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "cmemory.h"
2554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "cstring.h"
2654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "mutex.h"
2759d709d503bab6e2b61931737e662dd293b40578ccornelius#include "uassert.h"
2854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "ucln_in.h"
2954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "umutex.h"
3054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "uhash.h"
3154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
3254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic UHashtable* gGenderInfoCache = NULL;
3354dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic UMutex gGenderMetaLock = U_MUTEX_INITIALIZER;
3454dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic const char* gNeutralStr = "neutral";
3554dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic const char* gMailTaintsStr = "maleTaints";
3654dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic const char* gMixedNeutralStr = "mixedNeutral";
3754dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic icu::GenderInfo* gObjs = NULL;
3859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic icu::UInitOnce gGenderInitOnce = U_INITONCE_INITIALIZER;
3954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
4054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusenum GenderStyle {
4154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  NEUTRAL,
4254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  MIXED_NEUTRAL,
4354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  MALE_TAINTS,
4454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  GENDER_STYLE_LENGTH
4554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius};
4654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
4754dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CDECL_BEGIN
4854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
4954dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic UBool U_CALLCONV gender_cleanup(void) {
5054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (gGenderInfoCache != NULL) {
5154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    uhash_close(gGenderInfoCache);
5254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    gGenderInfoCache = NULL;
5354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    delete [] gObjs;
5454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
5559d709d503bab6e2b61931737e662dd293b40578ccornelius  gGenderInitOnce.reset();
5654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  return TRUE;
5754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
5854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
5954dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CDECL_END
6054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
6154dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_NAMESPACE_BEGIN
6254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
6359d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid U_CALLCONV GenderInfo_initCache(UErrorCode &status) {
6459d709d503bab6e2b61931737e662dd293b40578ccornelius  ucln_i18n_registerCleanup(UCLN_I18N_GENDERINFO, gender_cleanup);
6559d709d503bab6e2b61931737e662dd293b40578ccornelius  U_ASSERT(gGenderInfoCache == NULL);
6659d709d503bab6e2b61931737e662dd293b40578ccornelius  if (U_FAILURE(status)) {
6759d709d503bab6e2b61931737e662dd293b40578ccornelius      return;
6859d709d503bab6e2b61931737e662dd293b40578ccornelius  }
6959d709d503bab6e2b61931737e662dd293b40578ccornelius  gObjs = new GenderInfo[GENDER_STYLE_LENGTH];
7059d709d503bab6e2b61931737e662dd293b40578ccornelius  if (gObjs == NULL) {
7159d709d503bab6e2b61931737e662dd293b40578ccornelius    status = U_MEMORY_ALLOCATION_ERROR;
7259d709d503bab6e2b61931737e662dd293b40578ccornelius    return;
7359d709d503bab6e2b61931737e662dd293b40578ccornelius  }
7459d709d503bab6e2b61931737e662dd293b40578ccornelius  for (int i = 0; i < GENDER_STYLE_LENGTH; i++) {
7559d709d503bab6e2b61931737e662dd293b40578ccornelius    gObjs[i]._style = i;
7659d709d503bab6e2b61931737e662dd293b40578ccornelius  }
7759d709d503bab6e2b61931737e662dd293b40578ccornelius  gGenderInfoCache = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &status);
7859d709d503bab6e2b61931737e662dd293b40578ccornelius  if (U_FAILURE(status)) {
7959d709d503bab6e2b61931737e662dd293b40578ccornelius    delete [] gObjs;
8059d709d503bab6e2b61931737e662dd293b40578ccornelius    return;
8159d709d503bab6e2b61931737e662dd293b40578ccornelius  }
8259d709d503bab6e2b61931737e662dd293b40578ccornelius  uhash_setKeyDeleter(gGenderInfoCache, uprv_free);
8359d709d503bab6e2b61931737e662dd293b40578ccornelius}
8459d709d503bab6e2b61931737e662dd293b40578ccornelius
8559d709d503bab6e2b61931737e662dd293b40578ccornelius
8654dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusGenderInfo::GenderInfo() {
8754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
8854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
8954dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusGenderInfo::~GenderInfo() {
9054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
9154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
9254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusconst GenderInfo* GenderInfo::getInstance(const Locale& locale, UErrorCode& status) {
9359d709d503bab6e2b61931737e662dd293b40578ccornelius  // Make sure our cache exists.
9459d709d503bab6e2b61931737e662dd293b40578ccornelius  umtx_initOnce(gGenderInitOnce, &GenderInfo_initCache, status);
9554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (U_FAILURE(status)) {
9654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return NULL;
9754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
9854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
9954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  const GenderInfo* result = NULL;
10054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  const char* key = locale.getName();
10154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  {
10254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    Mutex lock(&gGenderMetaLock);
10354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    result = (const GenderInfo*) uhash_get(gGenderInfoCache, key);
10454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
10554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (result) {
10654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return result;
10754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
10854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
10954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  // On cache miss, try to create GenderInfo from CLDR data
11054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  result = loadInstance(locale, status);
11154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (U_FAILURE(status)) {
11254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return NULL;
11354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
11454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
11554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  // Try to put our GenderInfo object in cache. If there is a race condition,
11654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  // favor the GenderInfo object that is already in the cache.
11754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  {
11854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    Mutex lock(&gGenderMetaLock);
11954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    GenderInfo* temp = (GenderInfo*) uhash_get(gGenderInfoCache, key);
12054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if (temp) {
12154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      result = temp;
12254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else {
12354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      uhash_put(gGenderInfoCache, uprv_strdup(key), (void*) result, &status);
12454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      if (U_FAILURE(status)) {
12554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        return NULL;
12654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      }
12754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
12854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
12954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  return result;
13054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
13154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
13254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusconst GenderInfo* GenderInfo::loadInstance(const Locale& locale, UErrorCode& status) {
13354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  LocalUResourceBundlePointer rb(
13454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      ures_openDirect(NULL, "genderList", &status));
13554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (U_FAILURE(status)) {
13654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return NULL;
13754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
13854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  LocalUResourceBundlePointer locRes(ures_getByKey(rb.getAlias(), "genderList", NULL, &status));
13954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (U_FAILURE(status)) {
14054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return NULL;
14154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
14254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  int32_t resLen = 0;
14354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  const char* curLocaleName = locale.getName();
14454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  UErrorCode key_status = U_ZERO_ERROR;
14554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  const UChar* s = ures_getStringByKey(locRes.getAlias(), curLocaleName, &resLen, &key_status);
14654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (s == NULL) {
14754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    key_status = U_ZERO_ERROR;
14854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    char parentLocaleName[ULOC_FULLNAME_CAPACITY];
14954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    uprv_strcpy(parentLocaleName, curLocaleName);
15054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    while (s == NULL && uloc_getParent(parentLocaleName, parentLocaleName, ULOC_FULLNAME_CAPACITY, &key_status) > 0) {
15154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      key_status = U_ZERO_ERROR;
15254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      resLen = 0;
15354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      s = ures_getStringByKey(locRes.getAlias(), parentLocaleName, &resLen, &key_status);
15454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      key_status = U_ZERO_ERROR;
15554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
15654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
15754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (s == NULL) {
15854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return &gObjs[NEUTRAL];
15954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
16054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  char type_str[256];
16154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  u_UCharsToChars(s, type_str, resLen + 1);
16254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (uprv_strcmp(type_str, gNeutralStr) == 0) {
16354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return &gObjs[NEUTRAL];
16454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
16554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (uprv_strcmp(type_str, gMixedNeutralStr) == 0) {
16654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return &gObjs[MIXED_NEUTRAL];
16754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
16854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (uprv_strcmp(type_str, gMailTaintsStr) == 0) {
16954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return &gObjs[MALE_TAINTS];
17054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
17154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  return &gObjs[NEUTRAL];
17254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
17354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
17454dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUGender GenderInfo::getListGender(const UGender* genders, int32_t length, UErrorCode& status) const {
17554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (U_FAILURE(status)) {
17654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return UGENDER_OTHER;
17754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
1788393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius  if (length == 0) {
17954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return UGENDER_OTHER;
18054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
18154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  if (length == 1) {
18254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return genders[0];
18354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
18454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  UBool has_female = FALSE;
18554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  UBool has_male = FALSE;
18654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  switch (_style) {
1878393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    case NEUTRAL:
1888393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius      return UGENDER_OTHER;
18954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    case MIXED_NEUTRAL:
19054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      for (int32_t i = 0; i < length; ++i) {
19154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        switch (genders[i]) {
19254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          case UGENDER_OTHER:
19354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            return UGENDER_OTHER;
19454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            break;
19554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          case UGENDER_FEMALE:
19654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            if (has_male) {
19754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              return UGENDER_OTHER;
19854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            }
19954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            has_female = TRUE;
20054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            break;
20154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          case UGENDER_MALE:
20254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            if (has_female) {
20354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              return UGENDER_OTHER;
20454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            }
20554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            has_male = TRUE;
20654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            break;
20754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          default:
20854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            break;
20954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
21054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      }
21154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      return has_male ? UGENDER_MALE : UGENDER_FEMALE;
21254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      break;
21354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    case MALE_TAINTS:
21454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      for (int32_t i = 0; i < length; ++i) {
21554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if (genders[i] != UGENDER_FEMALE) {
21654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          return UGENDER_MALE;
21754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
21854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      }
21954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      return UGENDER_FEMALE;
22054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      break;
22154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    default:
22254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      return UGENDER_OTHER;
22354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      break;
22454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  }
22554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
22654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
22754dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusconst GenderInfo* GenderInfo::getNeutralInstance() {
22854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  return &gObjs[NEUTRAL];
22954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
23054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
23154dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusconst GenderInfo* GenderInfo::getMixedNeutralInstance() {
23254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  return &gObjs[MIXED_NEUTRAL];
23354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
23454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
23554dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusconst GenderInfo* GenderInfo::getMaleTaintsInstance() {
23654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  return &gObjs[MALE_TAINTS];
23754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
23854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
23954dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_NAMESPACE_END
24054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
24154dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI const UGenderInfo* U_EXPORT2
24254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusugender_getInstance(const char* locale, UErrorCode* status) {
24354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  return (const UGenderInfo*) icu::GenderInfo::getInstance(locale, *status);
24454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
24554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
24654dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI UGender U_EXPORT2
24754dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusugender_getListGender(const UGenderInfo* genderInfo, const UGender* genders, int32_t size, UErrorCode* status) {
24854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  return ((const icu::GenderInfo *)genderInfo)->getListGender(genders, size, *status);
24954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
25054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
25154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif /* #if !UCONFIG_NO_FORMATTING */
252