skips
parent
5f61e2be4c
commit
2b375fc8f3
|
@ -1,6 +1,6 @@
|
||||||
cmake_minimum_required(VERSION 3.20)
|
cmake_minimum_required(VERSION 3.20)
|
||||||
include(cmake/color.cmake)
|
include(cmake/color.cmake)
|
||||||
set(BLT_VERSION 1.0.4)
|
set(BLT_VERSION 1.0.5)
|
||||||
|
|
||||||
set(BLT_TARGET BLT)
|
set(BLT_TARGET BLT)
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ namespace blt
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto base()
|
auto raw_tuple()
|
||||||
{
|
{
|
||||||
return iter;
|
return iter;
|
||||||
}
|
}
|
||||||
|
@ -205,10 +205,12 @@ namespace blt
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
BLT_META_MAKE_FUNCTION_CHECK(base);
|
||||||
|
|
||||||
template<typename Iter>
|
template<typename Iter>
|
||||||
auto get_base(Iter iter)
|
auto get_base(Iter iter)
|
||||||
{
|
{
|
||||||
if constexpr (meta::is_reverse_iterator_v<Iter>)
|
if constexpr (has_func_base_v<Iter>)
|
||||||
{
|
{
|
||||||
return std::move(iter).base();
|
return std::move(iter).base();
|
||||||
} else
|
} else
|
||||||
|
@ -252,7 +254,7 @@ namespace blt
|
||||||
if constexpr (check)
|
if constexpr (check)
|
||||||
{
|
{
|
||||||
return Derived{get_base(begin),
|
return Derived{get_base(begin),
|
||||||
get_base(begin + std::min(n, static_cast<blt::size_t>(std::distance(begin, end))))};
|
get_base(begin + std::min(static_cast<blt::size_t>(n), std::distance(begin, end)))};
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
return Derived{get_base(begin), get_base(begin + n)};
|
return Derived{get_base(begin), get_base(begin + n)};
|
||||||
|
@ -267,6 +269,48 @@ namespace blt
|
||||||
auto take_or(blt::size_t n)
|
auto take_or(blt::size_t n)
|
||||||
{ return take_base<true>(n); }
|
{ return take_base<true>(n); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename Derived>
|
||||||
|
class skip_impl
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
template<bool check>
|
||||||
|
auto skip_base(blt::size_t n)
|
||||||
|
{
|
||||||
|
auto* d = static_cast<Derived*>(this);
|
||||||
|
auto begin = d->begin();
|
||||||
|
auto end = d->end();
|
||||||
|
|
||||||
|
if constexpr (std::is_same_v<typename Derived::iterator_category, std::random_access_iterator_tag>)
|
||||||
|
{
|
||||||
|
if constexpr (check)
|
||||||
|
{
|
||||||
|
return Derived{begin + std::min(static_cast<blt::size_t>(n), std::distance(begin, end))};
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
return Derived{begin + n, end};
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
for (blt::size_t i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
if constexpr (check){
|
||||||
|
if (begin == end)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++begin;
|
||||||
|
}
|
||||||
|
return Derived{begin, end};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
void skip(blt::size_t n)
|
||||||
|
{ return skip_base<false>(n); }
|
||||||
|
|
||||||
|
void skip_or(blt::size_t n)
|
||||||
|
{ return skip_base<true>(n); }
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Iter>
|
template<typename Iter>
|
||||||
|
|
Loading…
Reference in New Issue