]> granicus.if.org Git - icu/commitdiff
ICU-8656 Implement NumberingSystem::getAvailableNames()
authorJohn Emmons <emmo@us.ibm.com>
Mon, 8 Aug 2011 16:03:37 +0000 (16:03 +0000)
committerJohn Emmons <emmo@us.ibm.com>
Mon, 8 Aug 2011 16:03:37 +0000 (16:03 +0000)
X-SVN-Rev: 30476

.gitattributes
icu4c/source/i18n/i18n.vcxproj
icu4c/source/i18n/i18n.vcxproj.filters
icu4c/source/i18n/numsys.cpp
icu4c/source/i18n/numsys_impl.h [new file with mode: 0644]
icu4c/source/test/intltest/numfmtst.cpp
icu4c/source/test/intltest/numfmtst.h

index 13712c60533bd4ac02f8fc76e98d616ec067a02c..d811ae40d97e3d282b910692a5a60f31d68a27bb 100644 (file)
@@ -88,6 +88,7 @@ icu4c/source/extra/uconv/uconv.vcxproj -text
 icu4c/source/extra/uconv/uconv.vcxproj.filters -text
 icu4c/source/i18n/i18n.vcxproj -text
 icu4c/source/i18n/i18n.vcxproj.filters -text
+icu4c/source/i18n/numsys_impl.h -text
 icu4c/source/io/io.vcxproj -text
 icu4c/source/io/io.vcxproj.filters -text
 icu4c/source/layout/layout.vcxproj -text
index 22ab4e9b9d5ec644362436249574b1afc13e0f99..13bdedc1348dcda78490579cd160a717938cbade 100644 (file)
 </Command>\r
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>\r
     </CustomBuild>\r
+    <ClInclude Include="numsys_impl.h" />\r
     <ClInclude Include="tzfmt.h" />\r
     <ClInclude Include="tzgnames.h" />\r
     <ClInclude Include="tznames.h" />\r
index bece7119d2195a1f4645913bc09195a842604cb2..c43409152cb86199e775bb3b091e6dd875abe539 100644 (file)
@@ -30,9 +30,6 @@
     <ClCompile Include="bmsearch.cpp">\r
       <Filter>collation</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="bocsu.c">\r
-      <Filter>collation</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="coleitr.cpp">\r
       <Filter>collation</Filter>\r
     </ClCompile>\r
     <ClCompile Include="tznames_impl.cpp">\r
       <Filter>formatting</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="bocsu.cpp" />\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="bocsu.h">\r
     <ClInclude Include="tznames_impl.h">\r
       <Filter>formatting</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="numsys_impl.h">\r
+      <Filter>formatting</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ResourceCompile Include="i18n.rc">\r
index e01f09820395e83bb70a521ecca2a3817e0bd1ff..6da31f421ecb9781a079c92649e4f836028eb0f7 100644 (file)
@@ -24,6 +24,7 @@
 #include "unicode/numsys.h"
 #include "cstring.h"
 #include "uresimp.h"
+#include "numsys_impl.h"
 
 #if !UCONFIG_NO_FORMATTING
 
@@ -42,6 +43,7 @@ static const char gLatn[] = "latn";
 
 
 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(NumberingSystem)
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(NumsysNameEnumeration)
 
     /**
      * Default Constructor.
@@ -217,6 +219,44 @@ UBool NumberingSystem::isAlgorithmic() const {
     return ( algorithmic );
 }
 
+StringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) {
+
+    static StringEnumeration* availableNames = NULL;
+
+    if (U_FAILURE(status)) {
+        return NULL;
+    }
+
+    if ( availableNames == NULL ) {
+        UVector *fNumsysNames = new UVector(status);
+        if (U_FAILURE(status)) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            return NULL;
+        }
+        
+        UErrorCode rbstatus = U_ZERO_ERROR;
+        UResourceBundle *numberingSystemsInfo = ures_openDirect(NULL, "numberingSystems", &rbstatus);
+        numberingSystemsInfo = ures_getByKey(numberingSystemsInfo,"numberingSystems",numberingSystemsInfo,&rbstatus);
+        if(U_FAILURE(rbstatus)) {
+            status = U_MISSING_RESOURCE_ERROR;
+            ures_close(numberingSystemsInfo);
+            return NULL;
+        }
+
+        while ( ures_hasNext(numberingSystemsInfo) ) {
+            UResourceBundle *nsCurrent = ures_getNextResource(numberingSystemsInfo,NULL,&rbstatus);
+            const char *nsName = ures_getKey(nsCurrent);
+            fNumsysNames->addElement(new UnicodeString(nsName),status);
+            ures_close(nsCurrent);
+        }
+
+        ures_close(numberingSystemsInfo);
+        availableNames = new NumsysNameEnumeration(fNumsysNames,status);
+
+    }
+
+    return availableNames;
+}
 
 UBool NumberingSystem::isValidDigitString(const UnicodeString& str) {
 
@@ -235,6 +275,33 @@ UBool NumberingSystem::isValidDigitString(const UnicodeString& str) {
     }
     return TRUE;   
 }
+
+NumsysNameEnumeration::NumsysNameEnumeration(UVector *fNameList, UErrorCode& /*status*/) {
+    pos=0;
+    fNumsysNames = fNameList;
+}
+
+const UnicodeString*
+NumsysNameEnumeration::snext(UErrorCode& status) {
+    if (U_SUCCESS(status) && pos < fNumsysNames->size()) {
+        return (const UnicodeString*)fNumsysNames->elementAt(pos++);
+    }
+    return NULL;
+}
+
+void
+NumsysNameEnumeration::reset(UErrorCode& /*status*/) {
+    pos=0;
+}
+
+int32_t
+NumsysNameEnumeration::count(UErrorCode& /*status*/) const {
+    return (fNumsysNames==NULL) ? 0 : fNumsysNames->size();
+}
+
+NumsysNameEnumeration::~NumsysNameEnumeration() {
+    delete fNumsysNames;
+}
 U_NAMESPACE_END
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/icu4c/source/i18n/numsys_impl.h b/icu4c/source/i18n/numsys_impl.h
new file mode 100644 (file)
index 0000000..fdaf569
--- /dev/null
@@ -0,0 +1,43 @@
+/*\r
+*******************************************************************************\r
+* Copyright (C) 2011, International Business Machines Corporation and\r
+* others. All Rights Reserved.                                                *\r
+*******************************************************************************\r
+*\r
+* File NUMSYS_IMPL.H\r
+*\r
+*******************************************************************************\r
+*/\r
+\r
+#ifndef __NUMSYS_IMPL_H__\r
+#define __NUMSYS_IMPL_H__\r
+\r
+#include "unicode/utypes.h"\r
+\r
+#if !UCONFIG_NO_FORMATTING\r
+    \r
+#include "unicode/numsys.h"\r
+#include "uvector.h"\r
+#include "unicode/strenum.h"\r
+\r
+U_NAMESPACE_BEGIN\r
+\r
+class NumsysNameEnumeration : public StringEnumeration {\r
+public:\r
+    NumsysNameEnumeration(UVector *fNumsysNames, UErrorCode& status);\r
+    virtual ~NumsysNameEnumeration();\r
+    static UClassID U_EXPORT2 getStaticClassID(void);\r
+    virtual UClassID getDynamicClassID(void) const;\r
+    virtual const UnicodeString* snext(UErrorCode& status);\r
+    virtual void reset(UErrorCode& status);\r
+    virtual int32_t count(UErrorCode& status) const;\r
+private:\r
+    int32_t pos;\r
+    UVector *fNumsysNames;\r
+};\r
+\r
+U_NAMESPACE_END\r
+\r
+#endif\r
+\r
+#endif\r
index 214b7b7c130ff4367537db64b5f6bcd3a0ef16c3..37d5acec67fa869902a8b777e4ceed48a9bcb270 100644 (file)
@@ -115,6 +115,7 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n
         CASE(49,TestExponentParse); 
         CASE(50,TestExplicitParents); 
         CASE(51,TestLenientParse);
+        CASE(52,TestAvailableNumberingSystems);
         default: name = ""; break;
     }
 }
@@ -6449,4 +6450,31 @@ void NumberFormatTest::TestExplicitParents() {
     }
 
 }
+
+/**
+ * Test available numbering systems API.
+ */
+void NumberFormatTest::TestAvailableNumberingSystems() {
+    UErrorCode status = U_ZERO_ERROR;
+    StringEnumeration *availableNumberingSystems = NumberingSystem::getAvailableNames(status);
+
+    int32_t nsCount = availableNumberingSystems->count(status);
+    if ( nsCount < 36 ) {
+        errln("FAIL: Didn't get as many numbering systems as we had hoped for. Need at least 36, got %d",nsCount);
+    }
+
+    /* A relatively simple test of the API.  We call getAvailableNames() and cycle through */
+    /* each name returned, attempting to create a numbering system based on that name and  */
+    /* verifying that the name returned from the resulting numbering system is the same    */
+    /* one that we initially thought.                                                      */
+
+    int32_t len;
+    for ( int32_t i = 0 ; i < nsCount ; i++ ) {
+        const char *nsname = availableNumberingSystems->next(&len,status);
+        NumberingSystem* ns = NumberingSystem::createInstanceByName(nsname,status);
+        if ( uprv_strcmp(nsname,ns->getName()) ) {
+            errln("FAIL: Numbering system name didn't match for name = %s\n",nsname);
+        }
+    }
+}
 #endif /* #if !UCONFIG_NO_FORMATTING */
index f4d55253191361799ac45e1f61c8ac24f205b6ce..fff298bb6dc4ff881f7c8b9898cb38fd586497e3 100644 (file)
@@ -152,6 +152,8 @@ class NumberFormatTest: public CalendarTimeZoneTest {
 
     void TestExponentParse();
     void TestExplicitParents();
+    void TestAvailableNumberingSystems();
+
 
  private: