競技プãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ç”¨ã«Rustコードを一ã¤ã®.rs
ファイルã«ãƒãƒ³ãƒ‰ãƒ«ã™ã‚‹Cargoサブコマンドã§ã™ã€‚
Point Add Range Sum - Library-Cheker
lib
å´
toml
[package.metadata.cargo-equip-lib.mod-dependencies]
"algebraic" = []
"fenwick" = ["algebraic"]
"input" = []
"output" = []
bin
å´
toml
[dependencies]
__complib = { package = "complib", path = "/path/to/complib" }
cargo_equip_marker = "0.1.1"
```rust
use ::__lib::{fenwick::AdditiveFenwickTree, input, output};
use std::io::Write as _;
fn main() { input! { n: usize, q: usize, r#as: [i64; n], }
let mut fenwick = AdditiveFenwickTree::new(n);
for (i, a) in r#as.into_iter().enumerate() {
fenwick.plus(i, &a);
}
output::buf_print(|out| {
macro_rules! println(($($tt:tt)*) => (writeln!(out, $($tt)*).unwrap()));
for _ in 0..q {
input!(kind: u32);
match kind {
0 => {
input!(p: usize, x: i64);
fenwick.plus(p, &x);
}
1 => {
input!(l: usize, r: usize);
println!("{}", fenwick.query(l..r));
}
_ => unreachable!(),
}
}
});
} ```
↓
console
$ cargo equip --oneline mods --rustfmt --check > ./bundled.rs
Bundling code
Checking cargo-equip-check-output-mlswfwkzaxwf3681 v0.1.0 (/tmp/cargo-equip-check-output-mlswfwkzaxwf3681)
Finished dev [unoptimized + debuginfo] target(s) in 0.20s
https://judge.yosupo.jp/submission/20911
console
$ cargo install cargo-equip
master
console
$ cargo install --git https://github.com/qryxip/cargo-equip
ãƒã‚¤ãƒŠãƒªã§ã®æ供もã—ã¦ã„ã¾ã™ã€‚
ã¾ãšãƒ©ã‚¤ãƒ–ラリをã“ã®ã‚ˆã†ã«æ¨ªã«åºƒã作ã£ã¦ãã ã•ã„。
æ·±ã•2以上ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯inline module (mod { .. }
)ã¨ã—ã¦æ›¸ã„ã¦ãã ã•ã„。
src
├── a.rs
├── b.rs
├── c.rs
└── lib.rs
rust
// src/lib.rs
pub mod a;
pub mod b;
pub mod c;
次ã«ãƒ©ã‚¤ãƒ–ラリã®Cargo.toml
ã®package.metadata
ã«ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®ä¾å˜é–¢ä¿‚を手ã§æ›¸ã„ã¦ãã ã•ã„。
æ¬ ã‘ã¦ã„ã‚‹å ´åˆã¯warningã¨å…±ã«ã™ã¹ã¦ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’展開ã—ã¾ã™ã€‚
使ã†å´ã§æŒ‡å®šã§ãるよã†ã«ã™ã‚‹ã“ã¨ã‚‚考ãˆã¦ã„ã¾ã™ã€‚
toml
[package.metadata.cargo-equip-lib.mod-dependencies]
"a" = []
"b" = ["a"]
"c" = ["a"]
bin
å´ã®æº–å‚™ã¨ã—ã¦ã¯ã€æ¬¡ã®2ã¤ã‚’dependencies
ã«åŠ ãˆã¦ãã ã•ã„。
cargo_equip_marker
toml
[dependencies]
__my_lib = { package = "my_lib", path = "/path/to/my_lib" }
cargo_equip_marker = "0.1.1"
ライブラリã¯èª¤ã£ã¦ç›´æŽ¥ä½¿ã‚ãªã„よã†ã«ãƒªãƒãƒ¼ãƒ ã—ã¦ãŠãã“ã¨ã‚’å¼·ã推奨ã—ã¾ã™ã€‚
cargo_equip_marker
ã¯ä½•ã‚‚ã—ãªã„attribute macroã§ã‚ã‚‹#[equip]
ã‚’æä¾›ã—ã¾ã™ã€‚
cargo-snippet
ã®ã‚„ã‚Šã‹ãŸã‚’真似ãŸã‚‚ã®ã§ã™ãŒã€æœ¬ãƒ„ールã§ã¯åˆ¥ã®ãƒ‘ッケージã«åˆ†ã‘ã¦ã„ã¾ã™ã€‚
cargo-equip
ã¨é–“é•ãˆãªã„よã†ã«ã—ã¦ãã ã•ã„。
cargo_equip_marker
ã‹ã‚‰#[::cargo_equip::equip]
ã¨ã—ã¦å‘¼ã³ã¾ã™ã€‚
準備ãŒã§ããŸã‚‰ã“ã®ã‚ˆã†ã«ãƒ©ã‚¤ãƒ–ラリをuse
ã—ã¾ã™ã€‚
```rust
use ::_mylib::{b::B, c::C}; ```
use
ã®ãƒ‘スã«ã¯leading colon (::
)を付ã‘ã¦ãã ã•ã„。
```
use ::_mylib::{b::B, c::C}; ^^ ```
パスã®1ã¤ç›®ã®segmentã‹ã‚‰å±•é–‹ã™ã‚‹ã¹ãライブラリを決定ã—ã¾ã™ã€‚ leading colonã‚’å¿…é ˆã¨ã—ã¦ã„ã‚‹ã®ã¯ã“ã®ãŸã‚ã§ã™ã€‚
```
use ::_mylib::{b::B, c::C}; ^^^^^^^^ ```
パスã®2ã¤ç›®ã®segmentã‹ã‚‰ä½¿ç”¨ã—ã¦ã„るモジュールを判定ã—ã¾ã™ã€‚
ã“れらã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¨ã€å…ˆç¨‹æ›¸ã„ãŸmod-dependencies
ã§ç¹‹ãŒã£ã¦ã„るモジュールãŒå±•é–‹ã•ã‚Œã¾ã™ã€‚
```
use ::_mylib::{b::B, c::C}; ^ ^ ```
パスã®3ã¤ç›®ä»¥é™ã®segmentã¯use self::$name::{ .. }
ã¨ã—ã¦å±•é–‹ã•ã‚Œã¾ã™ã€‚
```
use ::_mylib::{b::B, c::C}; ^ ^ ```
コードãŒæ›¸ã‘ãŸã‚‰cargo equip
ã§å±•é–‹ã—ã¾ã™ã€‚
--bin {binã®åå‰}
ã‹--src {binã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ス}
ã§bin
を指定ã—ã¦ãã ã•ã„。
パッケージ内ã®bin
ãŒä¸€ã¤ã®å ´åˆã¯çœç•¥ã§ãã¾ã™ã€‚
ãŸã ã—default-run
ã«ã¯æœªå¯¾å¿œã§ã™ã€‚
console
$ cargo equip --bin "$name"
コードã¯ã“ã®ã‚ˆã†ã«å±•é–‹ã•ã‚Œã¾ã™ã€‚
``rust
//! # Bundled libraries
//!
//! ## [
mylib]({ a link to Crates.io or the repository })
//!
//! -
mylib::a→
$crate::a
//! -
mylib::b→
$crate::b
//! -
mylib::c→
$crate::c`
/#[cargo_equip::equip] use ::__my_lib::{b::B, c::C};/
fn main() { todo!(); }
// The following code was expanded by cargo-equip
.
use self::b::B; use self::c::C;
// b
ã¨c
ã§ä½¿ã‚ã‚Œã¦ã„ã‚‹ã¨mod-dependencies
ã«è¨˜è¿°ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€å±•é–‹ã•ã‚Œã‚‹
mod a {
// ..
}
mod b { // .. }
mod c { // .. } ```
モジュールã®éšŽå±¤ãŒå¤‰ã‚らãªã„ãŸã‚ã€å„ファイルã®ä¸èº«ã‚’æ‰‹ã‚’åŠ ãˆãšã«ãã®ã¾ã¾å±•é–‹ã—ã¾ã™ã€‚ ãã®ãŸã‚壊れã«ãããªã£ã¦ã„ã‚‹ã¯ãšã§ã™ã€‚ 多分。
ã¾ãŸãƒ©ã‚¤ãƒ–ラリ内ã®#[macro_export]
ã—ã¦ã„るマクãƒã§ã™ãŒã€ãƒžã‚¯ãƒåã¨åŒåã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã«å…¥ã‚Œã¦ãŠãã¨è‡ªç„¶ãªå½¢ã§ä½¿ãˆã‚‹ã¨æ€ã„ã¾ã™ã€‚
```rust // input.rs
macrorules! input { ($($tt:tt)*) => { compileerror!("TODO") }; } ```
```rust
use ::_mylib::input; ```
--oneline
--oneline mods
ã§å±•é–‹å¾Œã®å„モジュールをãã‚Œãžã‚Œä¸€è¡Œã«æŠ˜ã‚Šç•³ã¿ã¾ã™ã€‚
--oneline all
ã§ã‚³ãƒ¼ãƒ‰å…¨ä½“を一行ã«æŠ˜ã‚Šç•³ã¿ã¾ã™ã€‚
トークン列を" "
区切りã§å‡ºåŠ›ã—ã¦ã„ã‚‹ã ã‘ãªã®ã§ã€minificationã§ã¯ã‚ã‚Šã¾ã›ã‚“。
--rustfmt
出力をRustfmtã§ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã—ã¾ã™ã€‚
--check
ãƒãƒ³ãƒ‰ãƒ«ã—ãŸã‚³ãƒ¼ãƒ‰ã‚’出力ã™ã‚‹å‰ã«target directoryを共有ã—ãŸä¸€æ™‚パッケージを作りã€ãã‚Œã®ä¸Šã§cargo check
ã—ã¾ã™ã€‚
console
$ cargo equip --check > /dev/null
Bundling code
Checking cargo-equip-check-output-6oxyyu9lsf9s0f6g v0.1.0 (/tmp/cargo-equip-check-output-6oxyyu9lsf9s0f6g)
Finished dev [unoptimized + debuginfo] target(s) in 0.18s
MIT or Apache-2.0ã®ãƒ‡ãƒ¥ã‚¢ãƒ«ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã™ã€‚