Remove use of std::unary_function and std::binary_function

These types were deprecated in C++11 and removed in C++17. Upstream
libc++ now removes the declarations for new-enough C++ modes.

Bug: http://b/175635923
Test: treehugger
Change-Id: Ib863ef20c69ed9da115c0427dc38a61ecdec2606
diff --git a/include/llvm/ADT/STLExtras.h b/include/llvm/ADT/STLExtras.h
index abd39da..a032efa 100644
--- a/include/llvm/ADT/STLExtras.h
+++ b/include/llvm/ADT/STLExtras.h
@@ -36,7 +36,11 @@
 //===----------------------------------------------------------------------===//
 
 template<class Ty>
-struct identity : public std::unary_function<Ty, Ty> {
+struct identity {
+  // Android: In upstream LLVM, identity used to inherit from
+  // std::unary_function<Ty, Ty>, so use Ty here instead of Ty&.
+  using argument_type = Ty;
+  using result_type = Ty;
   Ty &operator()(Ty &self) const {
     return self;
   }
@@ -46,14 +50,24 @@
 };
 
 template<class Ty>
-struct less_ptr : public std::binary_function<Ty, Ty, bool> {
+struct less_ptr {
+  // Android: In upstream LLVM, less_ptr used to inherit from
+  // std::binary_function<Ty, Ty, bool>, so use Ty here instead of const Ty*.
+  using first_argument_type = Ty;
+  using second_argument_type = Ty;
+  using result_type = bool;
   bool operator()(const Ty* left, const Ty* right) const {
     return *left < *right;
   }
 };
 
 template<class Ty>
-struct greater_ptr : public std::binary_function<Ty, Ty, bool> {
+struct greater_ptr {
+  // Android: In upstream LLVM, greater_ptr used to inherit from
+  // std::binary_function<Ty, Ty, bool>, so use Ty here instead of const Ty*.
+  using first_argument_type = Ty;
+  using second_argument_type = Ty;
+  using result_type = bool;
   bool operator()(const Ty* left, const Ty* right) const {
     return *right < *left;
   }