Commit 7fd6146d authored by neverlord's avatar neverlord

forced_tuple_cast

parent 8b5d6409
...@@ -98,6 +98,27 @@ struct tuple_cast_impl ...@@ -98,6 +98,27 @@ struct tuple_cast_impl
} }
return {}; return {};
} }
template<class Tuple>
static inline Result force(Tuple const& tup, pattern<T...> const& p)
{
mapping_vector mv;
if (WP == wildcard_position::in_between)
{
// first range
mv.resize(size);
auto begin = mv.begin();
std::iota(begin, begin + first_wc, 0);
// second range
begin = mv.begin() + first_wc;
std::iota(begin, mv.end(), tup.size() - (size - first_wc));
return {Result::from(tup.vals(), mv)};
}
else
{
match(tup, p, mv);
return {Result::from(tup.vals(), mv)};
}
}
}; };
template<class Result, typename... T> template<class Result, typename... T>
...@@ -125,6 +146,11 @@ struct tuple_cast_impl<wildcard_position::nil, Result, T...> ...@@ -125,6 +146,11 @@ struct tuple_cast_impl<wildcard_position::nil, Result, T...>
} }
return {}; return {};
} }
template<class Tuple>
static inline Result force(Tuple const& tup, pattern<T...> const&)
{
return {Result::from(tup.vals())};
}
}; };
template<class Result, typename... T> template<class Result, typename... T>
...@@ -141,6 +167,11 @@ struct tuple_cast_impl<wildcard_position::trailing, Result, T...> ...@@ -141,6 +167,11 @@ struct tuple_cast_impl<wildcard_position::trailing, Result, T...>
} }
return {}; return {};
} }
template<class Tuple>
static inline Result force(Tuple const& tup, pattern<T...> const&)
{
return {Result::from(tup.vals())};
}
}; };
template<class Result, typename... T> template<class Result, typename... T>
...@@ -171,6 +202,12 @@ struct tuple_cast_impl<wildcard_position::leading, Result, T...> ...@@ -171,6 +202,12 @@ struct tuple_cast_impl<wildcard_position::leading, Result, T...>
} }
return {}; return {};
} }
template<class Tuple>
static inline Result force(Tuple const& tup, pattern<T...> const&)
{
size_t o = tup.size() - (sizeof...(T) - 1);
return Result::offset_subtuple(tup.vals(), o);
}
}; };
} } } }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment