Reactor: Replace ArgI for std::tuple_element

C++ now provides this template magic so you don't have to.

Also remove Arg(Function<Return(Arguments...)> &) function that wasn't referenced and wouldn't compile if it were.

Bug: b/126126820
Bug: b/129403963
Change-Id: I939e4f7cb95c32b8e663df7da6211460c5de605f
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/25749
Presubmit-Ready: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Ben Clayton <headlessclayton@gmail.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Reactor/Reactor.hpp b/src/Reactor/Reactor.hpp
index 7cf4103..9aea089 100644
--- a/src/Reactor/Reactor.hpp
+++ b/src/Reactor/Reactor.hpp
@@ -23,6 +23,7 @@
 #include <cstdio>
 
 #include <string>
+#include <tuple>
 
 #undef Bool // b/127920555
 
@@ -2274,21 +2275,6 @@
 	template<class T>
 	void Return(RValue<Pointer<T>> ret);
 
-	template<unsigned int index, typename... Arguments>
-	struct ArgI;
-
-	template<typename Arg0, typename... Arguments>
-	struct ArgI<0, Arg0, Arguments...>
-	{
-		typedef Arg0 Type;
-	};
-
-	template<unsigned int index, typename Arg0, typename... Arguments>
-	struct ArgI<index, Arg0, Arguments...>
-	{
-		typedef typename ArgI<index - 1, Arguments...>::Type Type;
-	};
-
 	// Generic template, leave undefined!
 	template<typename FunctionType>
 	class Function;
@@ -2303,10 +2289,10 @@
 		virtual ~Function();
 
 		template<int index>
-		Argument<typename ArgI<index, Arguments...>::Type> Arg() const
+		Argument<typename std::tuple_element<index, std::tuple<Arguments...>>::type> Arg() const
 		{
 			Value *arg = Nucleus::getArgument(index);
-			return Argument<typename ArgI<index, Arguments...>::Type>(arg);
+			return Argument<typename std::tuple_element<index, std::tuple<Arguments...>>::type>(arg);
 		}
 
 		Routine *operator()(const char *name, ...);
@@ -2321,12 +2307,6 @@
 	{
 	};
 
-	template<int index, typename Return, typename... Arguments>
-	Argument<typename ArgI<index, Arguments...>::Type> Arg(Function<Return(Arguments...)> &function)
-	{
-		return Argument<typename ArgI<index, Arguments...>::Type>(function.arg(index));
-	}
-
 	RValue<Long> Ticks();
 }