summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Sepez <tsepez@chromium.org>2017-04-18 16:36:11 -0700
committerChromium commit bot <commit-bot@chromium.org>2017-04-18 23:53:20 +0000
commit5af27b63bf94e7f60212f6759c8342ce02da5ad2 (patch)
treead5c42c2632b521b98cc7058cd00d345fb2a5756
parent3420ba852babe24c7b03fede1b3b7c474c148c0d (diff)
downloadpdfium-5af27b63bf94e7f60212f6759c8342ce02da5ad2.tar.xz
Remove hand-written bsearch from XFA_GetAttributeEnumByName()
Change-Id: Ic4bf34dfbdd06971d8935d031bdb7996c78d262f Reviewed-on: https://pdfium-review.googlesource.com/4315 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
-rw-r--r--xfa/fxfa/parser/xfa_utils.cpp19
-rw-r--r--xfa/fxfa/parser/xfa_utils_unittest.cpp13
2 files changed, 18 insertions, 14 deletions
diff --git a/xfa/fxfa/parser/xfa_utils.cpp b/xfa/fxfa/parser/xfa_utils.cpp
index 75d017b070..2ffba9b2e6 100644
--- a/xfa/fxfa/parser/xfa_utils.cpp
+++ b/xfa/fxfa/parser/xfa_utils.cpp
@@ -455,19 +455,12 @@ const XFA_ATTRIBUTEENUMINFO* XFA_GetAttributeEnumByName(
if (wsName.IsEmpty())
return nullptr;
- uint32_t uHash = FX_HashCode_GetW(wsName, false);
- int32_t iStart = 0;
- int32_t iEnd = g_iXFAEnumCount - 1;
- do {
- int32_t iMid = (iStart + iEnd) / 2;
- const XFA_ATTRIBUTEENUMINFO* pInfo = g_XFAEnumData + iMid;
- if (uHash == pInfo->uHash)
- return pInfo;
- if (uHash < pInfo->uHash)
- iEnd = iMid - 1;
- else
- iStart = iMid + 1;
- } while (iStart <= iEnd);
+ auto* it = std::lower_bound(g_XFAEnumData, g_XFAEnumData + g_iXFAEnumCount,
+ FX_HashCode_GetW(wsName, false),
+ [](const XFA_ATTRIBUTEENUMINFO& arg,
+ uint32_t hash) { return arg.uHash < hash; });
+ if (it != g_XFAEnumData + g_iXFAEnumCount && wsName == it->pName)
+ return it;
return nullptr;
}
diff --git a/xfa/fxfa/parser/xfa_utils_unittest.cpp b/xfa/fxfa/parser/xfa_utils_unittest.cpp
index 1898a797ec..6a1de85624 100644
--- a/xfa/fxfa/parser/xfa_utils_unittest.cpp
+++ b/xfa/fxfa/parser/xfa_utils_unittest.cpp
@@ -276,9 +276,20 @@ TEST_F(XFANodeIteratorTest, ChildAsRootNext) {
TEST(XFAUtilsTest, GetAttributeByName) {
EXPECT_EQ(nullptr, XFA_GetAttributeByName(L""));
- EXPECT_EQ(nullptr, XFA_GetAttributeByName(L"clams"));
+ EXPECT_EQ(nullptr, XFA_GetAttributeByName(L"nonesuch"));
EXPECT_EQ(XFA_ATTRIBUTE_H, XFA_GetAttributeByName(L"h")->eName);
EXPECT_EQ(XFA_ATTRIBUTE_Short, XFA_GetAttributeByName(L"short")->eName);
EXPECT_EQ(XFA_ATTRIBUTE_DecipherOnly,
XFA_GetAttributeByName(L"decipherOnly")->eName);
}
+
+TEST(XFAUtilsTest, GetAttributeEnumByName) {
+ EXPECT_EQ(nullptr, XFA_GetAttributeEnumByName(L""));
+ EXPECT_EQ(nullptr, XFA_GetAttributeEnumByName(L"nonesuch"));
+ EXPECT_EQ(XFA_ATTRIBUTEENUM_Asterisk,
+ XFA_GetAttributeEnumByName(L"*")->eName);
+ EXPECT_EQ(XFA_ATTRIBUTEENUM_Visible,
+ XFA_GetAttributeEnumByName(L"visible")->eName);
+ EXPECT_EQ(XFA_ATTRIBUTEENUM_Lowered,
+ XFA_GetAttributeEnumByName(L"lowered")->eName);
+}