diff options
author | Dan Albert <danalbert@google.com> | 2014-10-01 20:34:15 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-10-01 20:34:15 +0000 |
commit | fe50cfd53309af4dd49e572bd4a3120ea1494029 (patch) | |
tree | ba7193825608719276334b9de8bc3a6e5755c2d2 /tools | |
parent | ee7684cad00a13fc82519599ad8fab3cfbd6fe8b (diff) | |
parent | c46dbe8ac4748a0084b026524ad9e5ac44fb9fde (diff) | |
download | frameworks_base-fe50cfd53309af4dd49e572bd4a3120ea1494029.zip frameworks_base-fe50cfd53309af4dd49e572bd4a3120ea1494029.tar.gz frameworks_base-fe50cfd53309af4dd49e572bd4a3120ea1494029.tar.bz2 |
am c46dbe8a: Merge "Use std::sort instead of qsort_r wrapper."
* commit 'c46dbe8ac4748a0084b026524ad9e5ac44fb9fde':
Use std::sort instead of qsort_r wrapper.
Diffstat (limited to 'tools')
-rw-r--r-- | tools/aapt/Android.mk | 1 | ||||
-rw-r--r-- | tools/aapt/StringPool.cpp | 25 | ||||
-rw-r--r-- | tools/aapt/StringPool.h | 9 | ||||
-rw-r--r-- | tools/aapt/qsort_r_compat.c | 90 | ||||
-rw-r--r-- | tools/aapt/qsort_r_compat.h | 39 |
5 files changed, 22 insertions, 142 deletions
diff --git a/tools/aapt/Android.mk b/tools/aapt/Android.mk index 162edc4..f43060d 100644 --- a/tools/aapt/Android.mk +++ b/tools/aapt/Android.mk @@ -27,7 +27,6 @@ aapt_src_files := \ WorkQueue.cpp \ ZipEntry.cpp \ ZipFile.cpp \ - qsort_r_compat.c LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) diff --git a/tools/aapt/StringPool.cpp b/tools/aapt/StringPool.cpp index c7fd040..5edc144 100644 --- a/tools/aapt/StringPool.cpp +++ b/tools/aapt/StringPool.cpp @@ -5,11 +5,13 @@ // #include "StringPool.h" -#include "ResourceTable.h" #include <utils/ByteOrder.h> #include <utils/SortedVector.h> -#include "qsort_r_compat.h" + +#include <algorithm> + +#include "ResourceTable.h" #if HAVE_PRINTF_ZD # define ZD "%zd" @@ -214,12 +216,15 @@ status_t StringPool::addStyleSpan(size_t idx, const entry_style_span& span) return NO_ERROR; } -int StringPool::config_sort(void* state, const void* lhs, const void* rhs) +StringPool::ConfigSorter::ConfigSorter(const StringPool& pool) : pool(pool) +{ +} + +bool StringPool::ConfigSorter::operator()(size_t l, size_t r) { - StringPool* pool = (StringPool*)state; - const entry& lhe = pool->mEntries[pool->mEntryArray[*static_cast<const size_t*>(lhs)]]; - const entry& rhe = pool->mEntries[pool->mEntryArray[*static_cast<const size_t*>(rhs)]]; - return lhe.compare(rhe); + const StringPool::entry& lhe = pool.mEntries[pool.mEntryArray[l]]; + const StringPool::entry& rhe = pool.mEntries[pool.mEntryArray[r]]; + return lhe.compare(rhe) < 0; } void StringPool::sortByConfig() @@ -240,10 +245,8 @@ void StringPool::sortByConfig() // Sort the array. NOISY(printf("SORTING STRINGS BY CONFIGURATION...\n")); - // Vector::sort uses insertion sort, which is very slow for this data set. - // Use quicksort instead because we don't need a stable sort here. - qsort_r_compat(newPosToOriginalPos.editArray(), N, sizeof(size_t), this, config_sort); - //newPosToOriginalPos.sort(config_sort, this); + ConfigSorter sorter(*this); + std::sort(newPosToOriginalPos.begin(), newPosToOriginalPos.end(), sorter); NOISY(printf("DONE SORTING STRINGS BY CONFIGURATION.\n")); // Create the reverse mapping from the original position in the array diff --git a/tools/aapt/StringPool.h b/tools/aapt/StringPool.h index 1b5a7ba..0b26538 100644 --- a/tools/aapt/StringPool.h +++ b/tools/aapt/StringPool.h @@ -138,7 +138,14 @@ public: const Vector<size_t>* offsetsForString(const String16& val) const; private: - static int config_sort(void* state, const void* lhs, const void* rhs); + class ConfigSorter + { + public: + explicit ConfigSorter(const StringPool&); + bool operator()(size_t l, size_t r); + private: + const StringPool& pool; + }; const bool mUTF8; diff --git a/tools/aapt/qsort_r_compat.c b/tools/aapt/qsort_r_compat.c deleted file mode 100644 index 2a8dbe8..0000000 --- a/tools/aapt/qsort_r_compat.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2012 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. - */ - -#include <stdlib.h> -#include "qsort_r_compat.h" - -/* - * Note: This code is only used on the host, and is primarily here for - * Mac OS compatibility. Apparently, glibc and Apple's libc disagree on - * the parameter order for qsort_r. - */ - -#if HAVE_BSD_QSORT_R - -/* - * BSD qsort_r parameter order is as we have defined here. - */ - -void qsort_r_compat(void* base, size_t nel, size_t width, void* thunk, - int (*compar)(void*, const void* , const void*)) { - qsort_r(base, nel, width, thunk, compar); -} - -#elif HAVE_GNU_QSORT_R - -/* - * GNU qsort_r parameter order places the thunk parameter last. - */ - -struct compar_data { - void* thunk; - int (*compar)(void*, const void* , const void*); -}; - -static int compar_wrapper(const void* a, const void* b, void* data) { - struct compar_data* compar_data = (struct compar_data*)data; - return compar_data->compar(compar_data->thunk, a, b); -} - -void qsort_r_compat(void* base, size_t nel, size_t width, void* thunk, - int (*compar)(void*, const void* , const void*)) { - struct compar_data compar_data; - compar_data.thunk = thunk; - compar_data.compar = compar; - qsort_r(base, nel, width, compar_wrapper, &compar_data); -} - -#else - -/* - * Emulate qsort_r using thread local storage to access the thunk data. - */ - -#include <cutils/threads.h> - -static thread_store_t compar_data_key = THREAD_STORE_INITIALIZER; - -struct compar_data { - void* thunk; - int (*compar)(void*, const void* , const void*); -}; - -static int compar_wrapper(const void* a, const void* b) { - struct compar_data* compar_data = (struct compar_data*)thread_store_get(&compar_data_key); - return compar_data->compar(compar_data->thunk, a, b); -} - -void qsort_r_compat(void* base, size_t nel, size_t width, void* thunk, - int (*compar)(void*, const void* , const void*)) { - struct compar_data compar_data; - compar_data.thunk = thunk; - compar_data.compar = compar; - thread_store_set(&compar_data_key, &compar_data, NULL); - qsort(base, nel, width, compar_wrapper); -} - -#endif diff --git a/tools/aapt/qsort_r_compat.h b/tools/aapt/qsort_r_compat.h deleted file mode 100644 index e14f999..0000000 --- a/tools/aapt/qsort_r_compat.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2012 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. - */ - -/* - * Provides a portable version of qsort_r, called qsort_r_compat, which is a - * reentrant variant of qsort that passes a user data pointer to its comparator. - * This implementation follows the BSD parameter convention. - */ - -#ifndef ___QSORT_R_COMPAT_H -#define ___QSORT_R_COMPAT_H - -#include <stdlib.h> - -#ifdef __cplusplus -extern "C" { -#endif - -void qsort_r_compat(void* base, size_t nel, size_t width, void* thunk, - int (*compar)(void*, const void* , const void* )); - -#ifdef __cplusplus -} -#endif - -#endif // ___QSORT_R_COMPAT_H |