static void multiplyAndReduct( const SparseBlockMatrixBase< Derived >& matrix, const RhsT& rhs, ResT& res, const LocalResT&, ScalarT alpha ) { typedef typename Derived::Index Index ; const int RhsSegDim = BlockDims< typename Derived::BlockType, Transpose >::Cols ; typedef Segmenter< RhsSegDim, const RhsT, Index > RhsSegmenter ; const RhsSegmenter rhsSegmenter( rhs, matrix.minorIndex().innerOffsetsData() ) ; const Lock& lock = matrix.lock(); #pragma omp parallel { LocalResT locRes( res.rows(), res.cols() ) ; locRes.setZero() ; #pragma omp for for( Index i = 0 ; i < matrix.majorIndex().outerSize() ; ++i ) { innerColMultiply< Transpose >( matrix.data(), matrix.majorIndex(), i, rhsSegmenter[i], locRes, alpha ) ; } { Lock::Guard<> guard( lock ) ; res += locRes ; } } }
const GenderInfo* GenderInfo::loadInstance(const Locale& locale, UErrorCode& status) { LocalUResourceBundlePointer rb( ures_openDirect(NULL, "genderList", &status)); if (U_FAILURE(status)) { return NULL; } LocalUResourceBundlePointer locRes(ures_getByKey(rb.getAlias(), "genderList", NULL, &status)); if (U_FAILURE(status)) { return NULL; } int32_t resLen = 0; const char* curLocaleName = locale.getName(); UErrorCode key_status = U_ZERO_ERROR; const UChar* s = ures_getStringByKey(locRes.getAlias(), curLocaleName, &resLen, &key_status); if (s == NULL) { key_status = U_ZERO_ERROR; char parentLocaleName[ULOC_FULLNAME_CAPACITY]; uprv_strcpy(parentLocaleName, curLocaleName); while (s == NULL && uloc_getParent(parentLocaleName, parentLocaleName, ULOC_FULLNAME_CAPACITY, &key_status) > 0) { key_status = U_ZERO_ERROR; resLen = 0; s = ures_getStringByKey(locRes.getAlias(), parentLocaleName, &resLen, &key_status); key_status = U_ZERO_ERROR; } } if (s == NULL) { return &gObjs[NEUTRAL]; } char type_str[256]; u_UCharsToChars(s, type_str, resLen + 1); if (uprv_strcmp(type_str, gNeutralStr) == 0) { return &gObjs[NEUTRAL]; } if (uprv_strcmp(type_str, gMixedNeutralStr) == 0) { return &gObjs[MIXED_NEUTRAL]; } if (uprv_strcmp(type_str, gMailTaintsStr) == 0) { return &gObjs[MALE_TAINTS]; } return &gObjs[NEUTRAL]; }
static void multiplyAndReduct( const SparseBlockMatrixBase< Derived >& matrix, const RhsT& rhs, ResT& res, const LocalResT&, ScalarT alpha ) { const int SegDim = BlockDims< typename Derived::BlockType, Transpose >::Rows ; typedef Segmenter< SegDim, LocalResT, typename Derived::Index > ResSegmenter ; typedef Segmenter< SegDim, const RhsT, typename Derived::Index > RhsSegmenter ; const RhsSegmenter rhsSegmenter( rhs, matrix.majorIndex().innerOffsetsData() ) ; const Lock& lock = matrix.lock(); typedef typename SparseBlockMatrixBase< Derived >::MajorIndexType MajorIndexType ; #pragma omp parallel { LocalResT locRes( res.rows(), res.cols() ) ; locRes.setZero() ; ResSegmenter resSegmenter( locRes, matrix.minorIndex().innerOffsetsData() ) ; #pragma omp for for( typename Derived::Index i = 0 ; i < matrix.majorIndex().outerSize() ; ++i ) { typename RhsSegmenter::ConstReturnType rhs_seg( rhsSegmenter[ i ] ) ; typename ResSegmenter::ReturnType res_seg(resSegmenter[ i ] ) ; for( typename MajorIndexType::InnerIterator it( matrix.majorIndex(), i ) ; it ; ++ it ) { const typename Derived::BlockType &b = matrix.block( it.ptr() ) ; mv_add< false >( b, rhsSegmenter[ it.inner() ], res_seg, alpha ) ; if( it.inner() != i ) { typename ResSegmenter::ReturnType inner_res_seg(resSegmenter[ it.inner() ] ) ; mv_add< true >( b, rhs_seg, inner_res_seg, alpha ) ; } } } { Lock::Guard<> guard( lock ) ; res += locRes ; } } }
UnicodeString PluralRules::getRuleFromResource(const Locale& locale, UPluralType type, UErrorCode& errCode) { UnicodeString emptyStr; if (U_FAILURE(errCode)) { return emptyStr; } LocalUResourceBundlePointer rb(ures_openDirect(NULL, "plurals", &errCode)); if(U_FAILURE(errCode)) { return emptyStr; } const char *typeKey; switch (type) { case UPLURAL_TYPE_CARDINAL: typeKey = "locales"; break; case UPLURAL_TYPE_ORDINAL: typeKey = "locales_ordinals"; break; default: // Must not occur: The caller should have checked for valid types. errCode = U_ILLEGAL_ARGUMENT_ERROR; return emptyStr; } LocalUResourceBundlePointer locRes(ures_getByKey(rb.getAlias(), typeKey, NULL, &errCode)); if(U_FAILURE(errCode)) { return emptyStr; } int32_t resLen=0; const char *curLocaleName=locale.getName(); const UChar* s = ures_getStringByKey(locRes.getAlias(), curLocaleName, &resLen, &errCode); if (s == NULL) { // Check parent locales. UErrorCode status = U_ZERO_ERROR; char parentLocaleName[ULOC_FULLNAME_CAPACITY]; const char *curLocaleName=locale.getName(); uprv_strcpy(parentLocaleName, curLocaleName); while (uloc_getParent(parentLocaleName, parentLocaleName, ULOC_FULLNAME_CAPACITY, &status) > 0) { resLen=0; s = ures_getStringByKey(locRes.getAlias(), parentLocaleName, &resLen, &status); if (s != NULL) { errCode = U_ZERO_ERROR; break; } status = U_ZERO_ERROR; } } if (s==NULL) { return emptyStr; } char setKey[256]; UChar result[256]; u_UCharsToChars(s, setKey, resLen + 1); // printf("\n PluralRule: %s\n", setKey); LocalUResourceBundlePointer ruleRes(ures_getByKey(rb.getAlias(), "rules", NULL, &errCode)); if(U_FAILURE(errCode)) { return emptyStr; } resLen=0; LocalUResourceBundlePointer setRes(ures_getByKey(ruleRes.getAlias(), setKey, NULL, &errCode)); if (U_FAILURE(errCode)) { return emptyStr; } int32_t numberKeys = ures_getSize(setRes.getAlias()); char *key=NULL; int32_t len=0; for(int32_t i=0; i<numberKeys; ++i) { int32_t keyLen; resLen=0; s=ures_getNextString(setRes.getAlias(), &resLen, (const char**)&key, &errCode); keyLen = (int32_t)uprv_strlen(key); u_charsToUChars(key, result+len, keyLen); len += keyLen; result[len++]=COLON; uprv_memcpy(result+len, s, resLen*sizeof(UChar)); len += resLen; result[len++]=SEMI_COLON; } result[len++]=0; u_UCharsToChars(result, setKey, len); // printf(" Rule: %s\n", setKey); return UnicodeString(result); }