Ver código fonte

Move grafi-tt's C++14 compat utilities to seperate header

Ole 10 anos atrás
pai
commit
d4eb9fffae
2 arquivos alterados com 41 adições e 22 exclusões
  1. 34 0
      lib/luwra/compat.hpp
  2. 7 22
      lib/luwra/types.hpp

+ 34 - 0
lib/luwra/compat.hpp

@@ -0,0 +1,34 @@
+/* Luwra
+ * Minimal-overhead Lua wrapper for C++
+ *
+ * Copyright (C) 2015, Ole Krüger <ole@vprsm.de>
+ */
+
+#ifndef LUWRA_COMPAT_H_
+#define LUWRA_COMPAT_H_
+
+#include "common.hpp"
+
+LUWRA_NS_BEGIN
+
+namespace internal {
+	template <size_t... Is>
+	struct IndexSequence {};
+
+	template <size_t I, size_t... Is>
+	struct MakeIndexSequenceImpl {
+		using type = typename MakeIndexSequenceImpl<I - 1, I - 1, Is...>::type;
+	};
+
+	template <size_t... Is>
+	struct MakeIndexSequenceImpl<0, Is...> {
+		using type = IndexSequence<Is...>;
+	};
+
+	template <size_t I>
+	using MakeIndexSequence = typename MakeIndexSequenceImpl<I>::type;
+}
+
+LUWRA_NS_END
+
+#endif

+ 7 - 22
lib/luwra/types.hpp

@@ -8,6 +8,7 @@
 #define LUWRA_TYPES_H_
 
 #include "common.hpp"
+#include "compat.hpp"
 
 #include <utility>
 #include <tuple>
@@ -337,28 +338,11 @@ struct Value<Arbitrary> {
 };
 
 namespace internal {
-	// C++11 implementation of C++14's `index_sequence` and `make_index_sequence`.
-	template<size_t... Is>
-	struct index_sequence {};
-
-	template<size_t I, size_t... Is>
-	struct make_index_sequence_impl {
-		typedef typename make_index_sequence_impl<I - 1, I - 1, Is...>::type type;
-	};
-
-	template<size_t... Is>
-	struct make_index_sequence_impl<0, Is...> {
-		typedef index_sequence<Is...> type;
-	};
-
-	template<size_t I>
-	using make_index_sequence = typename make_index_sequence_impl<I>::type;
-
 	template <typename>
 	struct StackPusher;
 
 	template <size_t I>
-	struct StackPusher<index_sequence<I>> {
+	struct StackPusher<IndexSequence<I>> {
 		template <typename... T> static inline
 		size_t push(State* state, const std::tuple<T...>& package) {
 			using R = typename std::tuple_element<I, std::tuple<T...>>::type;
@@ -367,12 +351,12 @@ namespace internal {
 	};
 
 	template <size_t I, size_t... Is>
-	struct StackPusher<index_sequence<I, Is...>> {
+	struct StackPusher<IndexSequence<I, Is...>> {
 		template <typename... T> static inline
 		size_t push(State* state, const std::tuple<T...>& package) {
 			return
-				StackPusher<index_sequence<I>>::push(state, package)
-				+ StackPusher<index_sequence<Is...>>::push(state, package);
+				StackPusher<IndexSequence<I>>::push(state, package)
+				+ StackPusher<IndexSequence<Is...>>::push(state, package);
 		}
 	};
 }
@@ -384,7 +368,8 @@ template <typename... A>
 struct Value<std::tuple<A...>> {
 	static inline
 	size_t push(State* state, const std::tuple<A...>& value) {
-		return internal::StackPusher<internal::make_index_sequence<sizeof...(A)>>::push(state, value);
+		using Seq = internal::MakeIndexSequence<sizeof...(A)>;
+		return internal::StackPusher<Seq>::push(state, value);
 	}
 };