diff options
| author | Vijay Venkatraman <vijaykv@google.com> | 2017-01-26 02:03:45 +0000 |
|---|---|---|
| committer | android-build-merger <android-build-merger@google.com> | 2017-01-26 02:03:45 +0000 |
| commit | a040114bcba4b202a289a6e8fafd808f779f865c (patch) | |
| tree | dadf435a27ba8b3ac32996e39af86a6353c67396 /libutils/include/utils/FastStrcmp.h | |
| parent | a867efaed83fb3dab038e3fbe0cf608407678cb0 (diff) | |
| parent | 5a8f555e493803f4bff4a402d36d11b5cd81498f (diff) | |
| download | system_core-a040114bcba4b202a289a6e8fafd808f779f865c.tar.gz system_core-a040114bcba4b202a289a6e8fafd808f779f865c.tar.bz2 system_core-a040114bcba4b202a289a6e8fafd808f779f865c.zip | |
Merge "Exporting C++ headers from system/core" am: 812b7d5d52 am: f484dd3401 am: a252f11da3
am: 5a8f555e49
Change-Id: Id449aadc3b9e6e263d351ce031b1f7f7bb4672b8
Diffstat (limited to 'libutils/include/utils/FastStrcmp.h')
| -rw-r--r-- | libutils/include/utils/FastStrcmp.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/libutils/include/utils/FastStrcmp.h b/libutils/include/utils/FastStrcmp.h new file mode 100644 index 000000000..3844e7d96 --- /dev/null +++ b/libutils/include/utils/FastStrcmp.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2014-2016 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 _ANDROID_UTILS_FASTSTRCMP_H__ +#define _ANDROID_UTILS_FASTSTRCMP_H__ + +#ifdef __cplusplus + +// Optimized for instruction cache locality +// +// Template class fastcmp used to create more time-efficient str*cmp +// functions by pre-checking the first character before resorting +// to calling the underlying string function. Profiled with a +// measurable speedup when used in hot code. Usage is of the form: +// +// fastcmp<strncmp>(str1, str2, len) +// +// NB: Does not work for the case insensitive str*cmp functions. +// NB: Returns boolean, do not use if expecting to check negative value. +// Thus not semantically identical to the expected function behavior. + +template <int (*cmp)(const char *l, const char *r, const size_t s)> +static inline int fastcmp(const char *l, const char *r, const size_t s) { + return (*l != *r) || cmp(l + 1, r + 1, s - 1); +} + +template <int (*cmp)(const void *l, const void *r, const size_t s)> +static inline int fastcmp(const void *lv, const void *rv, const size_t s) { + const char *l = static_cast<const char *>(lv); + const char *r = static_cast<const char *>(rv); + return (*l != *r) || cmp(l + 1, r + 1, s - 1); +} + +template <int (*cmp)(const char *l, const char *r)> +static inline int fastcmp(const char *l, const char *r) { + return (*l != *r) || cmp(l + 1, r + 1); +} + +#endif + +#endif // _ANDROID_UTILS_FASTSTRCMP_H__ |
