Document FXSYS_SafeLT compare order
FXSYS_SafeLT gives NaNs an order but it isn't clear without very close
reading what that order is. This adds a comment and a test to clarify.
Bug: 852273
Change-Id: I8456eec0f489f8e9b680cdcb5298f8e9f6314fc8
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/69390
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_pageobjectholder_unittest.cpp b/core/fpdfapi/page/cpdf_pageobjectholder_unittest.cpp
index 7760256..43f3811 100644
--- a/core/fpdfapi/page/cpdf_pageobjectholder_unittest.cpp
+++ b/core/fpdfapi/page/cpdf_pageobjectholder_unittest.cpp
@@ -4,10 +4,17 @@
#include "core/fpdfapi/page/cpdf_pageobjectholder.h"
+#include <algorithm>
#include <limits>
+#include <vector>
+#include "core/fxcrt/fx_extension.h"
#include "testing/gtest/include/gtest/gtest.h"
+bool SafeCompare(const float& x, const float& y) {
+ return FXSYS_SafeLT(x, y);
+}
+
// See https://crbug.com/852273
TEST(CPDFPageObjectHolder, GraphicsDataAsKey) {
const float fMin = std::numeric_limits<float>::min();
@@ -23,6 +30,14 @@
}
}
+ // Validate the documented sort order.
+ std::vector<float> data = {fMax, fInf, fNan, fMin};
+ std::sort(data.begin(), data.end(), SafeCompare);
+ EXPECT_EQ(data[0], fMin);
+ EXPECT_EQ(data[1], fMax);
+ EXPECT_EQ(data[2], fInf);
+ EXPECT_EQ(std::isnan(data[3]), std::isnan(fNan));
+
std::map<GraphicsData, int> graphics_map;
// Insert in reverse index permuted order.
diff --git a/core/fxcrt/fx_extension.h b/core/fxcrt/fx_extension.h
index 00b5ab7..f747ee4 100644
--- a/core/fxcrt/fx_extension.h
+++ b/core/fxcrt/fx_extension.h
@@ -118,6 +118,7 @@
size_t FXSYS_ToUTF16BE(uint32_t unicode, char* buf);
// Strict order over floating types where NaNs may be present.
+// All NaNs are treated as equal to each other and greater than infinity.
template <typename T>
bool FXSYS_SafeEQ(const T& lhs, const T& rhs) {
return (std::isnan(lhs) && std::isnan(rhs)) ||