[libvamke] add discard_n()

This commit is contained in:
方而静 2023-07-23 15:50:52 +08:00
parent 0306a11812
commit 2ac908690f
2 changed files with 26 additions and 11 deletions

View File

@ -0,0 +1,6 @@
#include "../vmake.hpp"
using namespace std;
int main() {
vmake::outputln(cout, " ", vmake::discard_n(vmake::range(1, 10), 2));
}

View File

@ -31,8 +31,11 @@ using std::apply;
using nonstd::optional; using nonstd::optional;
template<typename T> struct add_const_t { using type = const T; }; template<typename T>
template<typename T> constexpr typename add_const_t<T>::type& as_const(T& t) noexcept { return t; } constexpr typename std::add_const<T>::type& as_const(T& t) noexcept {
return t;
}
template<typename T> void as_const(const T&&) = delete; template<typename T> void as_const(const T&&) = delete;
namespace details { namespace details {
@ -42,7 +45,7 @@ decltype(auto) apply_helper(Func &&f, Tuple &&t, std::index_sequence<index...>)
return f(std::get<index>(std::forward<Tuple>(t))...); return f(std::get<index>(std::forward<Tuple>(t))...);
} }
} } // namespace details
template<typename Func, typename Tuple> template<typename Func, typename Tuple>
decltype(auto) apply(Func &&f, Tuple &&t) { decltype(auto) apply(Func &&f, Tuple &&t) {
@ -61,7 +64,7 @@ template<typename T>
auto is_sequence_helper(char) -> decltype( auto is_sequence_helper(char) -> decltype(
std::declval<T>()() std::declval<T>()()
, typename std::enable_if<std::is_same<decltype( , typename std::enable_if<std::is_same<decltype(
std::declval<typename polyfill::add_const_t<T>::type>().is_terminated()) std::declval<typename std::add_const<T>::type>().is_terminated())
, bool>::value, int>::type{0} , bool>::value, int>::type{0}
, typename std::enable_if<std::is_same<decltype(std::declval<T>()()) , typename std::enable_if<std::is_same<decltype(std::declval<T>()())
, typename T::result>::value, int>::type{0} , typename T::result>::value, int>::type{0}
@ -331,7 +334,7 @@ inline auto repeat(Tval &&x) {
} }
template<typename Tval> template<typename Tval>
inline auto repeat_n(Tval &&x, size_t n) { inline decltype(auto) repeat_n(Tval &&x, size_t n) {
return take(repeat(std::forward<Tval>(x)), n); return take(repeat(std::forward<Tval>(x)), n);
} }
@ -482,11 +485,11 @@ namespace details {
//template<typename ...Ts> //template<typename ...Ts>
//using tuple_cat_t = decltype(std::tuple_cat(std::declval<Ts>()...)); //using tuple_cat_t = decltype(std::tuple_cat(std::declval<Ts>()...));
template<typename Tp, int n, size_t ...index> template<typename Tp, size_t n, size_t ...index>
auto repeat_tuple_builder(std::index_sequence<index...> seq) auto repeat_tuple_builder(std::index_sequence<index...> seq)
-> std::tuple<typename std::enable_if<(void(index), true), Tp>::type...>; -> std::tuple<typename std::enable_if<(void(index), true), Tp>::type...>;
template<typename Tp, int n> template<typename Tp, size_t n>
struct repeat_tuple_t { struct repeat_tuple_t {
using type = decltype(repeat_tuple_builder<Tp, n>(std::make_index_sequence<n>())); using type = decltype(repeat_tuple_builder<Tp, n>(std::make_index_sequence<n>()));
}; };
@ -496,10 +499,10 @@ inline auto group_builder(Gen &g, std::index_sequence<index...> seq) {
auto val = std::array<typename Gen::result, seq.size()>{ auto val = std::array<typename Gen::result, seq.size()>{
(void(index), g())... (void(index), g())...
}; };
return std::make_tuple(std::move(val[index])...); return std::make_tuple(std::move(std::get<index>(val))...);
} }
template<typename Gen, int n> template<typename Gen, size_t n>
struct grouper { struct grouper {
static_assert(n > 0, ""); static_assert(n > 0, "");
using result = typename repeat_tuple_t<typename Gen::result, n>::type; using result = typename repeat_tuple_t<typename Gen::result, n>::type;
@ -522,11 +525,17 @@ struct grouper {
} }
template<int n, typename Gen> template<size_t n, typename Gen>
inline auto group(Gen &&g) { inline auto group(Gen &&g) {
return details::grouper<typename std::decay<Gen>::type, n>(std::forward<Gen>(g)); return details::grouper<typename std::decay<Gen>::type, n>(std::forward<Gen>(g));
} }
template<typename Gen>
inline decltype(auto) discard_n(Gen &&g, size_t n) {
for (size_t i = 0; i < n; ++i) g();
return std::forward<Gen>(g);
}
namespace rng { namespace rng {
inline auto make_seed() { inline auto make_seed() {
@ -599,7 +608,7 @@ struct unique_ints_sequence {
std::uniform_int_distribution<Tval> dis; std::uniform_int_distribution<Tval> dis;
bool halfed; bool halfed;
std::unordered_set<Tval> used; std::unordered_set<Tval> used;
std::vector<int> rest; std::vector<Tval> rest;
unique_ints_sequence(Engine &&e, Tval &&l, Tval &&r) : l(std::forward<Tval>(l)) unique_ints_sequence(Engine &&e, Tval &&l, Tval &&r) : l(std::forward<Tval>(l))
, r(std::forward<Tval>(r)), rng(std::forward<Engine>(e)) , r(std::forward<Tval>(r)), rng(std::forward<Engine>(e))