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