[res] Simplify XmlPullParser::FindAttribute() and StringPool::Sort

1. FindAttribute used to do lots of work that C++17 does
   automatically

2. Use function_ref for a more efficient callback passing

Test: aapt2_tests
Flag: EXEMPT minor refactor
Change-Id: I4f172cca16c05422992b107e347ed01479fff898
diff --git a/libs/androidfw/StringPool.cpp b/libs/androidfw/StringPool.cpp
index ad445c0..629f146 100644
--- a/libs/androidfw/StringPool.cpp
+++ b/libs/androidfw/StringPool.cpp
@@ -297,24 +297,22 @@
 template <typename E>
 static void SortEntries(
     std::vector<std::unique_ptr<E>>& entries,
-    const std::function<int(const StringPool::Context&, const StringPool::Context&)>& cmp) {
+    base::function_ref<int(const StringPool::Context&, const StringPool::Context&)> cmp) {
   using UEntry = std::unique_ptr<E>;
-
-  if (cmp != nullptr) {
-    std::sort(entries.begin(), entries.end(), [&cmp](const UEntry& a, const UEntry& b) -> bool {
-      int r = cmp(a->context, b->context);
-      if (r == 0) {
-        r = a->value.compare(b->value);
-      }
-      return r < 0;
-    });
-  } else {
-    std::sort(entries.begin(), entries.end(),
-              [](const UEntry& a, const UEntry& b) -> bool { return a->value < b->value; });
-  }
+  std::sort(entries.begin(), entries.end(), [cmp](const UEntry& a, const UEntry& b) -> bool {
+    int r = cmp(a->context, b->context);
+    if (r == 0) {
+      r = a->value.compare(b->value);
+    }
+    return r < 0;
+  });
 }
 
-void StringPool::Sort(const std::function<int(const Context&, const Context&)>& cmp) {
+void StringPool::Sort() {
+  Sort([](auto&&, auto&&) { return 0; });
+}
+
+void StringPool::Sort(base::function_ref<int(const Context&, const Context&)> cmp) {
   SortEntries(styles_, cmp);
   SortEntries(strings_, cmp);
   ReAssignIndices();
diff --git a/libs/androidfw/include/androidfw/StringPool.h b/libs/androidfw/include/androidfw/StringPool.h
index 0190ab5..9b2c72a 100644
--- a/libs/androidfw/include/androidfw/StringPool.h
+++ b/libs/androidfw/include/androidfw/StringPool.h
@@ -17,7 +17,6 @@
 #ifndef _ANDROID_STRING_POOL_H
 #define _ANDROID_STRING_POOL_H
 
-#include <functional>
 #include <memory>
 #include <string>
 #include <unordered_map>
@@ -25,6 +24,7 @@
 
 #include "BigBuffer.h"
 #include "IDiagnostics.h"
+#include "android-base/function_ref.h"
 #include "android-base/macros.h"
 #include "androidfw/ConfigDescription.h"
 #include "androidfw/StringPiece.h"
@@ -205,7 +205,8 @@
   // Sorts the strings according to their Context using some comparison function.
   // Equal Contexts are further sorted by string value, lexicographically.
   // If no comparison function is provided, values are only sorted lexicographically.
-  void Sort(const std::function<int(const Context&, const Context&)>& cmp = nullptr);
+  void Sort();
+  void Sort(base::function_ref<int(const Context&, const Context&)> cmp);
 
   // Removes any strings that have no references.
   void Prune();