summaryrefslogtreecommitdiffstats
path: root/icu/src/main/native/ScopedJavaUnicodeString.h
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2010-01-28 12:18:39 -0800
committerElliott Hughes <enh@google.com>2010-01-28 12:18:39 -0800
commitd5344fec27edfcf7acf9f703c9d7dff14a832943 (patch)
tree4230a4bb322859e5c55eab2bec42cfa4934d9e8b /icu/src/main/native/ScopedJavaUnicodeString.h
parenta747155a09a9ade533379872e292a74329581292 (diff)
downloadlibcore-d5344fec27edfcf7acf9f703c9d7dff14a832943.zip
libcore-d5344fec27edfcf7acf9f703c9d7dff14a832943.tar.gz
libcore-d5344fec27edfcf7acf9f703c9d7dff14a832943.tar.bz2
Double the speed of DecimalFormat creation.
Our calls to unum_setSymbol were making us O(n^2); switching to the C++ API and doing a bulk update is a huge win. (ICU is really a C++ library with a C wrapper. It's always going to be slightly wasteful to go via C, but here it's especially harmful.) The new ScopedJavaUnicodeString provides a best-of-breed bridge between Java strings on the Java heap and the UnicodeString type that ICU wants. I'll come back and switch more of our ICU JNI over in a later patch.
Diffstat (limited to 'icu/src/main/native/ScopedJavaUnicodeString.h')
-rw-r--r--icu/src/main/native/ScopedJavaUnicodeString.h50
1 files changed, 50 insertions, 0 deletions
diff --git a/icu/src/main/native/ScopedJavaUnicodeString.h b/icu/src/main/native/ScopedJavaUnicodeString.h
new file mode 100644
index 0000000..3486aac
--- /dev/null
+++ b/icu/src/main/native/ScopedJavaUnicodeString.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SCOPED_JAVA_UNICODE_STRING_H_included
+#define SCOPED_JAVA_UNICODE_STRING_H_included
+
+#include "JNIHelp.h"
+
+// A smart pointer that provides access to an ICU UnicodeString given a JNI
+// jstring. We give ICU a direct pointer to the characters on the Java heap.
+// It's clever enough to copy-on-write if necessary, but we only provide
+// const UnicodeString access anyway because attempted write access seems
+// likely to be an error.
+class ScopedJavaUnicodeString {
+public:
+ ScopedJavaUnicodeString(JNIEnv* env, jstring s) : mEnv(env), mString(s) {
+ mChars = env->GetStringChars(mString, NULL);
+ const int32_t charCount = env->GetStringLength(mString);
+ mUnicodeString.setTo(false, mChars, charCount);
+ }
+
+ ~ScopedJavaUnicodeString() {
+ mEnv->ReleaseStringChars(mString, mChars);
+ }
+
+ const UnicodeString& unicodeString() {
+ return mUnicodeString;
+ }
+
+private:
+ JNIEnv* mEnv;
+ jstring mString;
+ const UChar* mChars;
+ UnicodeString mUnicodeString;
+};
+
+#endif // SCOPED_JAVA_UNICODE_STRING_H_included