Skip to content

Commit

Permalink
split_parts
Browse files Browse the repository at this point in the history
  • Loading branch information
2A5F committed Feb 7, 2023
1 parent de21d3a commit 023eab1
Show file tree
Hide file tree
Showing 7 changed files with 1,516 additions and 33 deletions.
68 changes: 68 additions & 0 deletions code_gen/src/code_gen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ pub fn code_gen(out_dir: &Path) {
gen_tuple_iter(&ctx, &out_dir);
gen_tuple_map(&ctx, &out_dir);
gen_combin(&ctx, &out_dir);
gen_split_parts(&ctx, &out_dir);
gen_split_by(&ctx, &out_dir);
gen_split_to_tuple_by(&ctx, &out_dir);
gen_split_at(&ctx, &out_dir);
Expand Down Expand Up @@ -624,6 +625,73 @@ fn gen_combin_concat_size(ctx: &Ctx, sizea: usize, sizeb: usize, self_impl: &[To
tks
}

fn gen_split_parts(ctx: &Ctx, out_dir: &Path) {
let items = (2..16usize).map(|i| gen_split_parts_n(ctx, i));
let tks = quote! {
#(#items)*
};
let mut code = tks.to_string();
code.insert_str(0, "// This file is by code gen, do not modify\n\n");
let dest_path = Path::new(out_dir).join("split_parts.rs");
fs::write(&dest_path, code).unwrap();
}

fn gen_split_parts_n(ctx: &Ctx, n: usize) -> TokenStream {
let trait_name = format_ident!("TupleSplit{}Parts", n);
let fn_name = format_ident!("split_{}_parts", n);
let trait_doc = format!("Split into {} parts", n);

let impls = (n * 2..33usize).map(|i| gen_split_parts_n_impl_size(ctx, &trait_name, &fn_name, n, i));

let tks = quote! {
#[doc = #trait_doc]
pub trait #trait_name {
type OutTuple;

#[doc = #trait_doc]
fn #fn_name(self) -> Self::OutTuple;
}

#(#impls)*
};
tks
}

fn gen_split_parts_n_impl_size(ctx: &Ctx, trait_name: &Ident, fn_name: &Ident, n: usize, size: usize) -> TokenStream {
let nts = &ctx.nts[0..size];
let size_lits = &ctx.size_lits[0..size];

let d = size / n;
let m = size % n;

let out_type = (0..n)
.map(|i| {
let r = i * d + std::cmp::min(i, m)..(i + 1) * d + std::cmp::min(i + 1, m);
let nts = &nts[r];
quote! { (#(#nts),*) }
})
.collect::<Vec<_>>();

let out_lit = (0..n)
.map(|i| {
let r = i * d + std::cmp::min(i, m)..(i + 1) * d + std::cmp::min(i + 1, m);
let size_lits = &size_lits[r];
quote! { (#(self.#size_lits),*) }
})
.collect::<Vec<_>>();

let tks = quote! {
impl<#(#nts),*> #trait_name for (#(#nts),*) {
type OutTuple = (#(#out_type),*);

fn #fn_name(self) -> Self::OutTuple {
(#(#out_lit),*)
}
}
};
tks
}

fn gen_split_by(ctx: &Ctx, out_dir: &Path) {
let items = (2..32usize).map(|i| gen_split_by_n(ctx, i));
let tks = quote! {
Expand Down
18 changes: 3 additions & 15 deletions gen_code.ps1
Original file line number Diff line number Diff line change
@@ -1,20 +1,8 @@
#!/usr/bin/pwsh

Set-Location .\code_gen\
cargo build --release
Set-Location ..
.\target\release\code_gen.exe

rustfmt .\tuples\src\gen\cloned.rs
rustfmt .\tuples\src\gen\combin.rs
rustfmt .\tuples\src\gen\split_by.rs
rustfmt .\tuples\src\gen\split_to_tuple_by.rs
rustfmt .\tuples\src\gen\split_at.rs
rustfmt .\tuples\src\gen\split_to_tuple_at.rs
rustfmt .\tuples\src\gen\flatten.rs
rustfmt .\tuples\src\gen\transpose.rs
rustfmt .\tuples\src\gen\tuple_alias.rs
rustfmt .\tuples\src\gen\tuple_as.rs
rustfmt .\tuples\src\gen\tuple_call.rs
rustfmt .\tuples\src\gen\tuple_impl.rs
rustfmt .\tuples\src\gen\tuple_iter.rs
rustfmt .\tuples\src\gen\tuple_map.rs
rustfmt .\tuples\src\gen\tuple_n.rs
Get-ChildItem .\tuples\src\gen -Filter *.rs | Foreach-Object { rustfmt $_.FullName }
18 changes: 3 additions & 15 deletions gen_code.sh
Original file line number Diff line number Diff line change
@@ -1,20 +1,8 @@
#!/bin/bash

cd ./code_gen/
cargo build --release
cd ..
./target/release/code_gen

rustfmt ./tuples/src/gen/cloned.rs
rustfmt ./tuples/src/gen/combin.rs
rustfmt ./tuples/src/gen/split_by.rs
rustfmt ./tuples/src/gen/split_to_tuple_by.rs
rustfmt ./tuples/src/gen/split_at.rs
rustfmt ./tuples/src/gen/split_to_tuple_at.rs
rustfmt ./tuples/src/gen/flatten.rs
rustfmt ./tuples/src/gen/transpose.rs
rustfmt ./tuples/src/gen/tuple_alias.rs
rustfmt ./tuples/src/gen/tuple_as.rs
rustfmt ./tuples/src/gen/tuple_call.rs
rustfmt ./tuples/src/gen/tuple_impl.rs
rustfmt ./tuples/src/gen/tuple_iter.rs
rustfmt ./tuples/src/gen/tuple_map.rs
rustfmt ./tuples/src/gen/tuple_n.rs
for rs in ./tuples/src/gen/*.rs; do rustfmt "${rs}"; done
7 changes: 4 additions & 3 deletions tuples/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,12 @@ default = [
flatten = []
re-exports = []
shorthand = []
split = ["split_by", "split_to_tuple_by", "split_at", "split_to_tuple_at"]
split_by = []
split_to_tuple_by = []
split = ["split_parts", "split_by", "split_to_tuple_by", "split_at", "split_to_tuple_at"]
split_at = []
split_by = []
split_parts = []
split_to_tuple_at = []
split_to_tuple_by = []
transpose = []
tuple_as = []
tuple_call = []
Expand Down
Loading

0 comments on commit 023eab1

Please sign in to comment.