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、…)について責任を負いません。