Support building Fruit with MSVC.
Current limitations:
* Tests must be run from the command-line, using the "Native Tools Command Prompt" that comes with MSVC. Running tests from within MSVC doesn't work.
* Tests must be run serially (-j 1), otherwise there might be test failures with errors like "fatal error C1033: cannot open program database 'C:\Some\Path\vc140.pdb'"
* Building Fruit as a shared library (.dll) is not yet supported, Fruit can only be built as a static library (.lib).
diff --git a/include/fruit/impl/meta/vector.h b/include/fruit/impl/meta/vector.h
index 1bbf034..84bd602 100644
--- a/include/fruit/impl/meta/vector.h
+++ b/include/fruit/impl/meta/vector.h
@@ -116,9 +116,9 @@
template <typename... Ts, typename V2>
struct apply<Vector<Ts...>, V2> {
- using type = Bool<std::is_same<BoolVector<AlwaysTrueBool<Ts>::value...>,
- BoolVector<IsInVector::template apply<Ts, V2>::type::value...>
- >::value>;
+ using type = Bool<std::is_same<BoolVector<AlwaysTrueBool<Ts>::value...>,
+ BoolVector<Id<typename IsInVector::template apply<Ts, V2>::type>::value...>
+ >::value>;
};
};
@@ -211,11 +211,11 @@
struct VectorRemoveFirstN {
template <typename V, typename N, typename Indexes = Eval<GenerateIntSequence(N)>>
struct apply;
-
- template <typename... Types, typename N, int... indexes>
- struct apply<Vector<Types...>, N, Vector<Int<indexes>...>> {
+
+ template <typename... Types, typename N, typename... Indexes>
+ struct apply<Vector<Types...>, N, Vector<Indexes...>> {
template <typename... RemainingTypes>
- static Vector<RemainingTypes...> f(AlwaysVoidPtr<Int<indexes>>..., RemainingTypes*...);
+ static Vector<RemainingTypes...> f(AlwaysVoidPtr<Indexes>..., RemainingTypes*...);
using type = decltype(f((Types*)nullptr...));
};
@@ -224,7 +224,8 @@
struct VectorEndsWith {
template <typename V, typename T>
struct apply {
- using type = IsSame(VectorRemoveFirstN(V, Int<Eval<VectorSize(V)>::value - 1>),
+ using N = Int<Eval<VectorSize(V)>::value - 1>;
+ using type = IsSame(VectorRemoveFirstN(V, N),
Vector<T>);
};