packedsfen 0.3.1

packedsfen is a library for processing Huffman-encoded supervised phases for Shogi AI.
Documentation
use usiagent::shogi::*;
use usiagent::event::GameEndState;

use super::super::error::*;
use super::super::traits;
use super::reader::BestMove;

#[derive(Debug, PartialEq, Eq, Clone)]
pub struct HuffmanCode {
    pub value: u8,
    pub bit_length: u8,
}

impl HuffmanCode {
    pub const BLANK: HuffmanCode = HuffmanCode{ value: 0b0, bit_length: 1 };
    pub const FU: HuffmanCode = HuffmanCode{ value: 0b1, bit_length: 2 };
    pub const KYOU: HuffmanCode = HuffmanCode{ value: 0b11, bit_length: 4 };
    pub const KEI: HuffmanCode = HuffmanCode{ value: 0b1011, bit_length: 4 };
    pub const GIN: HuffmanCode = HuffmanCode{ value: 0b111, bit_length: 4 };
    pub const KAKU: HuffmanCode = HuffmanCode{ value: 0b1_1111, bit_length: 6 };
    pub const HISHA: HuffmanCode = HuffmanCode{ value: 0b11_1111, bit_length: 6 };
    pub const KIN: HuffmanCode = HuffmanCode{ value: 0b1111, bit_length: 5 };
    const MAX_BIT_LENGTH_ON_BANMEN: u8 = 6;

    pub const M_FU: HuffmanCode = HuffmanCode{ value: 0b0, bit_length: 1 };
    pub const M_KYOU: HuffmanCode = HuffmanCode{ value: 0b1, bit_length: 3 };
    pub const M_KEI: HuffmanCode = HuffmanCode{ value: 0b101, bit_length: 3 };
    pub const M_GIN: HuffmanCode = HuffmanCode{ value: 0b11, bit_length: 3 };
    pub const M_KAKU: HuffmanCode = HuffmanCode{ value: 0b1_111, bit_length: 5 };
    pub const M_HISHA: HuffmanCode = HuffmanCode{ value: 0b11_111, bit_length: 5 };
    pub const M_KIN: HuffmanCode = HuffmanCode{ value: 0b111, bit_length: 4 };
    const MAX_BIT_LENGTH_IN_MOCHIGOMA: u8 = 5;

    pub fn defined(&self) -> Result<bool,ReadError> {
        match *self {
            HuffmanCode::BLANK | HuffmanCode::FU | HuffmanCode::KYOU |
            HuffmanCode::KEI | HuffmanCode::GIN | HuffmanCode::KAKU |
            HuffmanCode::HISHA | HuffmanCode::KIN => {
                Ok(true)
            },
            HuffmanCode {
                bit_length: HuffmanCode::MAX_BIT_LENGTH_ON_BANMEN..=std::u8::MAX,
                ..
            } => Err(ReadError::OverMaxBitLength),
            _ => Ok(false)
        }
    }

    pub fn defined_mochigoma(&self) -> Result<bool,ReadError> {
        match *self {
            HuffmanCode::M_FU | HuffmanCode::M_KYOU |
            HuffmanCode::M_KEI | HuffmanCode::M_GIN | HuffmanCode::M_KAKU |
            HuffmanCode::M_HISHA | HuffmanCode::M_KIN => {
                Ok(true)
            },
            HuffmanCode {
                bit_length: HuffmanCode::MAX_BIT_LENGTH_IN_MOCHIGOMA..=std::u8::MAX,
                ..
            } => Err(ReadError::OverMaxBitLength),
            _ => Ok(false)
        }
    }
}
type TebanAndKomaKindAndNariFlag<'a> = (Teban, bool, &'a HuffmanCode);
impl<'a> traits::TryFrom<&'a TebanAndKomaKindAndNariFlag<'a>> for KomaKind {
    type Error = ReadError;
    fn try_from(src:&'a TebanAndKomaKindAndNariFlag) -> Result<KomaKind, Self::Error> {
        match *src {
            (Teban::Sente,false,&HuffmanCode::FU) => Ok(KomaKind::SFu),
            (Teban::Sente,false,&HuffmanCode::KYOU) => Ok(KomaKind::SKyou),
            (Teban::Sente,false,&HuffmanCode::KEI) => Ok(KomaKind::SKei),
            (Teban::Sente,false,&HuffmanCode::GIN) => Ok(KomaKind::SGin),
            (Teban::Sente,false,&HuffmanCode::KIN) => Ok(KomaKind::SKin),
            (Teban::Sente,false,&HuffmanCode::KAKU) => Ok(KomaKind::SKaku),
            (Teban::Sente,false,&HuffmanCode::HISHA) => Ok(KomaKind::SHisha),
            (Teban::Sente,true,&HuffmanCode::FU) => Ok(KomaKind::SFuN),
            (Teban::Sente,true,&HuffmanCode::KYOU) => Ok(KomaKind::SKyouN),
            (Teban::Sente,true,&HuffmanCode::KEI) => Ok(KomaKind::SKeiN),
            (Teban::Sente,true,&HuffmanCode::GIN) => Ok(KomaKind::SGinN),
            (Teban::Sente,true,&HuffmanCode::KAKU) => Ok(KomaKind::SKakuN),
            (Teban::Sente,true,&HuffmanCode::HISHA) => Ok(KomaKind::SHishaN),
            (Teban::Gote,false,&HuffmanCode::FU) => Ok(KomaKind::GFu),
            (Teban::Gote,false,&HuffmanCode::KYOU) => Ok(KomaKind::GKyou),
            (Teban::Gote,false,&HuffmanCode::KEI) => Ok(KomaKind::GKei),
            (Teban::Gote,false,&HuffmanCode::GIN) => Ok(KomaKind::GGin),
            (Teban::Gote,false,&HuffmanCode::KIN) => Ok(KomaKind::GKin),
            (Teban::Gote,false,&HuffmanCode::KAKU) => Ok(KomaKind::GKaku),
            (Teban::Gote,false,&HuffmanCode::HISHA) => Ok(KomaKind::GHisha),
            (Teban::Gote,true,&HuffmanCode::FU) => Ok(KomaKind::GFuN),
            (Teban::Gote,true,&HuffmanCode::KYOU) => Ok(KomaKind::GKyouN),
            (Teban::Gote,true,&HuffmanCode::KEI) => Ok(KomaKind::GKeiN),
            (Teban::Gote,true,&HuffmanCode::GIN) => Ok(KomaKind::GGinN),
            (Teban::Gote,true,&HuffmanCode::KAKU) => Ok(KomaKind::GKakuN),
            (Teban::Gote,true,&HuffmanCode::HISHA) => Ok(KomaKind::GHishaN),
            (_,_,&HuffmanCode::BLANK) => Ok(KomaKind::Blank),
            _ => Err(ReadError::Undefined)
        }
    }
}
impl traits::TryFrom<&HuffmanCode> for MochigomaKind {
    type Error = ReadError;
    fn try_from(hc:&HuffmanCode) -> Result<MochigomaKind, Self::Error> {
        match *hc {
            HuffmanCode::M_FU => Ok(MochigomaKind::Fu),
            HuffmanCode::M_KYOU => Ok(MochigomaKind::Kyou),
            HuffmanCode::M_KEI => Ok(MochigomaKind::Kei),
            HuffmanCode::M_GIN => Ok(MochigomaKind::Gin),
            HuffmanCode::M_KAKU => Ok(MochigomaKind::Kaku),
            HuffmanCode::M_HISHA => Ok(MochigomaKind::Hisha),
            HuffmanCode::M_KIN => Ok(MochigomaKind::Kin),
            _ => Err(ReadError::Undefined)
        }
    }
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct PackedSfen {
    pub buf: [u8; 32]
}
#[derive(Debug, PartialEq, Eq, Clone)]
#[repr(C)]
pub struct PackedSfenWithExtended {
    pub packed: PackedSfen,
    pub value: i16,
    pub best_move16: u16,
    pub end_ply: u16,
    pub game_result: i8,
    pub padding: u8,
}
#[derive(Debug, PartialEq, Eq, Clone)]
#[repr(C)]
pub struct ExtendFields {
    pub value: i16,
    pub best_move: BestMove,
    pub end_ply: u16,
    pub game_result: GameEndState,
}