Rustライブラリのコピペ作業やライブラリ管理を補助する競プロ用ツールです。
$ cargo install --git https://github.com/shino16/cargo-auto-bundle$ cargo auto-bundle [--crate <crate [default: .]>] [--entry-point <entry-point [default: src/main.rs]>] [--list-deps]lib(クレート名)は任意のクレート名で置き換えてください。
use lib::ds::fenwick::*;
use proconio::*;
#[fastout]
fn main() {
input! {
n: usize, q: usize,
a: [u32; n],
txy: [(u32, usize, usize); q],
}
let mut fwk = FenwickTree::new(a, GroupImpl(|| 0, |a, b| a ^ b, |a| a));
for (t, x, y) in txy {
match t {
1 => fwk.add(x - 1, y as u32),
_ => println!("{}", fwk.ask(x - 1, y)),
}
}
}このコードを lib クレート中の src/main.rs に置き、次を実行します:
$ cargo auto-bundle > tmp.rsこれを提出⇒AC
このコードが依存する lib::ds::fenwick モジュールと、lib::ds::fenwick が依存する lib::alg、lib::bits の中身がモジュール構造を保って展開されています。
また、これは online-judge-tools/verification-helper と組合せて使うことができます。
例:.github/workflows/ci.yml / .verify-helper/config.toml
なお、online-judge-tools/verification-helper には Rustサポートが追加された ので、少し 書きかえ が必要です。
<crate>/Cargo.tomlをパースし、クレート名を取得します。<entry-point>ファイルを起点に、対象クレート内のモジュールや構造体・トレイト等に対するuse宣言を辿り、依存するファイルを列挙します。--list-depsが渡されたとき、これらのファイルへのパスを一行ずつ出力します。- そうでない場合は、これらのファイルを
<entry-point>ファイルとまとめて出力します。このとき、<entry-point>ファイルの中身が先に出力されます。- ファイル構造は
(公開性) mod (モジュール名) { ... }という形で反映されます。 <entry-point>ファイル中のuse (クレート名)::...と<crate>内のファイルのuse crate::...は、ともにuse crate::(クレート名)::...で置き換えられます。(マクロの中身を除く)#[macro_export]属性が付された単一のマクロに対するuse宣言に対しては、特別な処理を行います。use宣言のパスがcrate::から始まる場合は何の処理も行わず、(クレート名)::から始まる場合は宣言ごと削除します。- 例えばモジュール
a内でマクロxを#[macro_export]付きで定義した場合、モジュールa内にpub use crate::x;と書いて、これを使うときはuse (クレート名)::a::*;とするよいと思います。 - より簡単なのは、クレートのトップレベル(
<crate>/lib.rs)でマクロを定義することです。これを直接use (クレート名)::x;とすればうまくいきます。
<crate>中の(pub) mod (モジュール名);は削除されます。
- 相対パスによる
use宣言への対応が不完全です。使うときはファイル内のトップレベルに置いてください。 use宣言されていないモジュールは、使われていたとしても走査対象になりません。例えばlet inv = my_library::math::modpow(n, MOD - 2, MOD);のような記述があっても、use my_library::math;のような記述がなければmathモジュールは出力に反映されません。use宣言以外の場所でcrate::...と書かれていても、crate::(クレート名)には置き換えられません。(use宣言はrust-analyzerが勝手に入れてくれるので、さぼっています)<crate>がバイナリクレートであった場合の動作は未確認です。useされていないモジュールのimplやマクロ定義は補足できません。- マクロ定義・呼び出しの中身に含まれる
use宣言は無視されます。 (公開性) mod XXX;に付された属性は無視され、出力に含まれません。- 手続きマクロの展開は一切行いません。
- 自分のライブラリ でそれっぽく動くことしか確認していません。本プログラムの動作に関連して発生したいかなる結果(CE、WA、TLE、…)について責任を負いません。