iterator: use iota for izip

Using `indices` introduced problematic dangling references. We should
almost always want integral indices anyway, so we drop the fancy
iterator. A user can always call zip with an indices object anyway.
This commit is contained in:
Danny Robson 2019-03-18 13:52:21 +11:00
parent 4d91db760c
commit 1f1f6ddbaf

View File

@ -515,7 +515,7 @@ namespace cruft {
///
/// eg, cruft::zip ({1,2,3}, {4,5,6}) ~= {{1,4},{2,5},{3,6}}
template <typename ...ContainerT>
auto
decltype(auto)
zip (ContainerT&&... data)
{
CHECK (((std::size (data) == std::size (variadic::get<0> (data...))) && ...));
@ -531,15 +531,21 @@ namespace cruft {
/// object where the first of the iterator's value_types is the index of
/// that iterator. ie, It combines container offsets with value_types.
///
/// The supplied containers _must_ not change size while the izip object
/// is live. The size of the containers may be cached for efficiency.
///
/// eg, cruft::izip ("abc") ~= {{0,'a'},{1,'b'},{2,'c'}}
template <typename ...ContainerT>
auto
decltype(auto)
izip (ContainerT&&... data)
{
indices idx (::cruft::variadic::get<0> (data...));
// Assume that all containers are the same size and create a range
// that will supply integral indices over the first container.
//
// The call to `zip` will peform more rigorous tests on the sizes
// of the container collection.
return zip (
std::move (idx),
iota (::cruft::variadic::get<0> (data...).size ()),
std::forward<ContainerT> (data)...
);
}