diff --git a/.github/run-cargo-simple-bundler.py b/.github/run-cargo-simple-bundler.py new file mode 100755 index 0000000..45d82af --- /dev/null +++ b/.github/run-cargo-simple-bundler.py @@ -0,0 +1,57 @@ +#!/usr/bin/python3 + +from tempfile import TemporaryDirectory +from pathlib import Path +import subprocess +from subprocess import PIPE +from argparse import ArgumentParser +import platform + +MODULES = [ + 'convolution', + 'dsu', + 'fenwicktree', + 'lazysegtree', + 'math', + 'maxflow', + 'mincostflow', + 'modint', + 'scc', + 'segtree', + 'string', + 'twosat', +] + + +def main() -> None: + ArgumentParser().parse_args() + + manifest_path = Path(__file__).absolute().parent.parent \ + .joinpath('Cargo.toml') + + with TemporaryDirectory(prefix='ac-library-rs-run-cargo-simple-bundler-', + ) as tempdir: + tempdir = Path(tempdir) + + for module in MODULES: + rs = tempdir.joinpath(f'with-{module}.rs') + + with open(rs, 'a') as file: + file.write(f'use ac_library_rs::{module} as _; fn main() {{}}') + file.flush() + + output = subprocess.run( + ['cargo', 'simple-bundler', '--manifest-path', + manifest_path, '-e', rs], check=True, stdout=PIPE, + ).stdout.decode() + file.write(output) + + output = tempdir.joinpath('a') + if platform.system() == 'Windows': + output = output.with_suffix('.exe') + subprocess.run(['rustc', '--edition', '2018', '-o', output, rs], + check=True) + + +if __name__ == '__main__': + main() diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9658366..dd2f2f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -96,18 +96,17 @@ jobs: env: RUST_BACKTRACE: full - expander_test: + expand-py: strategy: fail-fast: false matrix: toolchain: - 1.42.0-x86_64-unknown-linux-gnu - - stable-x86_64-unknown-linux-gnu python-version: - '3.6' # https://packages.ubuntu.com/bionic/python3 - '3.8' # https://packages.ubuntu.com/focal/python3 - name: Expand_test (${{ matrix.toolchain }}, ${{ matrix.python-version }}) + name: expand.py (Python ${{ matrix.python-version }}) runs-on: ubuntu-18.04 steps: @@ -129,3 +128,42 @@ jobs: - name: expand.py tests run: bash ./.github/workflows/test-expand.sh + + cargo-simple-bundler: + strategy: + fail-fast: false + + name: cargo-simple-bundler + runs-on: ubuntu-18.04 + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: 'Setup `1.42.0-x86_64-unknown-linux-gnu`' + uses: actions-rs/toolchain@v1 + with: + toolchain: 1.42.0-x86_64-unknown-linux-gnu + profile: minimal + + - name: 'Setup `stable-x86_64-unknown-linux-gnu`' + uses: actions-rs/toolchain@v1 + with: + toolchain: stable-x86_64-unknown-linux-gnu + override: true + profile: minimal + + - name: Setup Python 3.8 + uses: actions/setup-python@v2 + with: + python-version: 3.8 + + - name: Install cargo-simple-bundler + uses: actions-rs/cargo@v1 + with: + command: install + args: --git https://github.com/kuretchi/cargo-simple-bundler --branch main + toolchain: stable + + - name: run-cargo-simple-bundler.py + run: python ./.github/run-cargo-simple-bundler.py diff --git a/src/convolution.rs b/src/convolution.rs index 9576e3e..d084e3a 100644 --- a/src/convolution.rs +++ b/src/convolution.rs @@ -8,9 +8,9 @@ macro_rules! modulus { const VALUE: u32 = $name as _; const HINT_VALUE_IS_PRIME: bool = true; - fn butterfly_cache() -> &'static ::std::thread::LocalKey<::std::cell::RefCell<::std::option::Option>>> { + fn butterfly_cache() -> &'static ::std::thread::LocalKey<::std::cell::RefCell<::std::option::Option>>> { thread_local! { - static BUTTERFLY_CACHE: ::std::cell::RefCell<::std::option::Option>> = ::std::default::Default::default(); + static BUTTERFLY_CACHE: ::std::cell::RefCell<::std::option::Option>> = ::std::default::Default::default(); } &BUTTERFLY_CACHE } @@ -19,9 +19,9 @@ macro_rules! modulus { }; } -use crate::{ +use super::{ internal_bit, internal_math, - modint::{ButterflyCache, Modulus, RemEuclidU32, StaticModInt}, + modint::{self, ButterflyCache, Modulus, RemEuclidU32, StaticModInt}, }; use std::{ cmp, @@ -232,10 +232,7 @@ fn prepare() -> ButterflyCache { #[cfg(test)] mod tests { - use crate::{ - modint::{Mod998244353, Modulus, StaticModInt}, - RemEuclidU32, - }; + use super::super::modint::{self, Mod998244353, Modulus, RemEuclidU32, StaticModInt}; use rand::{rngs::ThreadRng, Rng as _}; use std::{ convert::{TryFrom, TryInto as _}, diff --git a/src/internal_math.rs b/src/internal_math.rs index 515191c..ce1aaa8 100644 --- a/src/internal_math.rs +++ b/src/internal_math.rs @@ -239,7 +239,7 @@ pub(crate) fn primitive_root(m: i32) -> i32 { mod tests { #![allow(clippy::unreadable_literal)] #![allow(clippy::cognitive_complexity)] - use crate::internal_math::{inv_gcd, is_prime, pow_mod, primitive_root, safe_mod, Barrett}; + use super::{inv_gcd, is_prime, pow_mod, primitive_root, safe_mod, Barrett}; use std::collections::HashSet; #[test] diff --git a/src/internal_queue.rs b/src/internal_queue.rs index 5e51e9a..5266591 100644 --- a/src/internal_queue.rs +++ b/src/internal_queue.rs @@ -51,7 +51,7 @@ impl SimpleQueue { #[cfg(test)] mod test { - use crate::internal_queue::SimpleQueue; + use super::SimpleQueue; #[allow(clippy::cognitive_complexity)] #[test] diff --git a/src/lazysegtree.rs b/src/lazysegtree.rs index 47020a8..959fabf 100644 --- a/src/lazysegtree.rs +++ b/src/lazysegtree.rs @@ -1,5 +1,5 @@ -use crate::internal_bit::ceil_pow2; -use crate::Monoid; +use super::internal_bit::ceil_pow2; +use super::segtree::Monoid; pub trait MapMonoid { type M: Monoid; @@ -314,7 +314,8 @@ where #[cfg(test)] mod tests { - use crate::{LazySegtree, MapMonoid, Max}; + use super::super::segtree::Max; + use super::{LazySegtree, MapMonoid}; struct MaxAdd; impl MapMonoid for MaxAdd { diff --git a/src/math.rs b/src/math.rs index 61f15d5..f29a819 100644 --- a/src/math.rs +++ b/src/math.rs @@ -1,6 +1,6 @@ //! Number-theoretic algorithms. -use crate::internal_math; +use super::internal_math; use std::mem::swap; diff --git a/src/maxflow.rs b/src/maxflow.rs index 93b337c..6f884c4 100644 --- a/src/maxflow.rs +++ b/src/maxflow.rs @@ -1,6 +1,6 @@ #![allow(dead_code)] -use crate::internal_queue::SimpleQueue; -use crate::internal_type_traits::Integral; +use super::internal_queue::SimpleQueue; +use super::internal_type_traits::Integral; use std::cmp::min; use std::iter; @@ -224,7 +224,7 @@ struct _Edge { #[cfg(test)] mod test { - use crate::{Edge, MfGraph}; + use super::{Edge, MfGraph}; #[test] fn test_max_flow_wikipedia() { diff --git a/src/mincostflow.rs b/src/mincostflow.rs index 158a9e8..aafc45e 100644 --- a/src/mincostflow.rs +++ b/src/mincostflow.rs @@ -1,4 +1,4 @@ -use crate::internal_type_traits::Integral; +use super::internal_type_traits::Integral; pub struct MinCostFlowEdge { pub from: usize, diff --git a/src/modint.rs b/src/modint.rs index 8aa5220..1347c21 100644 --- a/src/modint.rs +++ b/src/modint.rs @@ -48,7 +48,7 @@ //! [`ModInt998244353`]: ./type.ModInt998244353.html //! [`ModInt`]: ./type.ModInt.html -use crate::internal_math; +use super::internal_math; use std::{ cell::RefCell, convert::{Infallible, TryInto as _}, @@ -1050,7 +1050,7 @@ impl_folding! { #[cfg(test)] mod tests { - use crate::modint::ModInt1000000007; + use super::ModInt1000000007; #[test] fn static_modint_new() { diff --git a/src/scc.rs b/src/scc.rs index 2eff835..d33c15b 100644 --- a/src/scc.rs +++ b/src/scc.rs @@ -1,4 +1,4 @@ -use crate::internal_scc; +use super::internal_scc; pub struct SccGraph { internal: internal_scc::SccGraph, diff --git a/src/segtree.rs b/src/segtree.rs index b543aa3..9d6b820 100644 --- a/src/segtree.rs +++ b/src/segtree.rs @@ -1,5 +1,5 @@ -use crate::internal_bit::ceil_pow2; -use crate::internal_type_traits::{BoundedAbove, BoundedBelow, One, Zero}; +use super::internal_bit::ceil_pow2; +use super::internal_type_traits::{BoundedAbove, BoundedBelow, One, Zero}; use std::cmp::{max, min}; use std::convert::Infallible; use std::marker::PhantomData; @@ -238,8 +238,8 @@ where #[cfg(test)] mod tests { - use crate::segtree::Max; - use crate::Segtree; + use super::super::Segtree; + use super::Max; #[test] fn test_max_segtree() { diff --git a/src/twosat.rs b/src/twosat.rs index ac5f8b6..213d486 100644 --- a/src/twosat.rs +++ b/src/twosat.rs @@ -1,4 +1,4 @@ -use crate::internal_scc; +use super::internal_scc; pub struct TwoSat { n: usize,