kekkai 0.1.0

A crate for custom-width signed and unsigned integers.
Documentation
#![doc = include_str!("../README.md")]
#![warn(
    missing_docs,
    rustdoc::missing_crate_level_docs,
    unused_results,
    clippy::complexity,
    clippy::perf,
    clippy::style
)]

use thiserror::Error;
pub mod primes;

/// 100 以下の素数の数
pub const COUNT_UNDER_100: usize = 25;
/// 1K 以下の素数の数
pub const COUNT_UNDER_1K: usize = 168;
/// 10K 以下の素数の数
pub const COUNT_UNDER_10K: usize = 1229;
/// 100K 以下の素数の数
pub const COUNT_UNDER_100K: usize = 9592;

/// 素数のエラー
#[derive(Error, Debug)]
pub enum PrimeError {
    /// 指定された数が範囲外の場合
    #[error("指定された数が範囲外です")]
    OutOfRange,
}

/// u8 における素数の配列を取得する関数
#[cfg(feature = "prime_u8")]
pub const fn primes_u8<const N: usize>() -> Result<[u8; N], PrimeError> {
    if N < 1 || N > primes::PRIME_U8.len() {
        return Err(PrimeError::OutOfRange);
    }

    let mut primes = [0u8; N];
    let mut i = 0;
    while i < N {
        primes[i] = primes::PRIME_U8[i];
        i += 1;
    }
    Ok(primes)
}

/// u16 における素数の配列を取得する関数
#[cfg(feature = "prime_u16")]
pub const fn primes_u16<const N: usize>() -> Result<[u16; N], PrimeError> {
    if N < 1 || N > primes::PRIME_U16.len() {
        return Err(PrimeError::OutOfRange);
    }

    let mut primes = [0u16; N];
    let mut i = 0;
    while i < primes::PRIME_U8.len() {
        primes[i] = primes::PRIME_U8[i] as u16;
        i += 1;
    }
    let mut j = 0;
    while i < N {
        primes[i] = primes::PRIME_U16[j];
        i += 1;
        j += 1;
    }
    Ok(primes)
}