【unitrix】 4.4 类型级整数比较系统(cmp.rs)

一、源码

这段代码实现了一个类型级别的整数比较系统,允许在编译时进行整数比较操作。它定义了一套类型来表示比较结果,并为不同类型的整数实现了比较逻辑。

use core::cmp::Ordering;
use core::default::Default;
use crate::sealed::Sealed;
use crate::number::{Z0, P1, N1, B0, B1, NonZero};
///类型级比较,仅考虑类型级整数比较//-------------基本定义-------------------------------------------------
// 比较结果类型别名
pub type Equal = Z0;   // 相等
pub type Less = N1;    // 小于
pub type Greater = P1; // 大于/// 标记特征(trait),用于比较结果类型:`Greater`、`Equal` 和 `Less`
pub trait Ord: Sealed {/// 将类型转换为运行时的 `Ordering` 值fn to_ordering() -> Ordering;
}impl Ord for Greater {#[inline]fn to_ordering() -> Ordering {Ordering::Greater  // 返回"大于"的比较结果}
}impl Ord for Less {#[inline]fn to_ordering() -> Ordering {Ordering::Less  // 返回"小于"的比较结果}
}impl Ord for Equal {#[inline]fn to_ordering() -> Ordering {Ordering::Equal  // 返回"等于"的比较结果}
}/// 类型比较运算符,用于比较 `Self` 和 `Rhs` 类型。
/// 类似于 [`core::cmp::Ord::cmp`] 但用于类型比较。
///
/// # 示例
/// ```rust
/// use unitrix::number::{Cmp, Ord, N1, Z0, P1};
/// use std::cmp::Ordering;
///
/// assert_eq!(<Z0 as Cmp<N1>>::Output::to_ordering(), Ordering::Greater);
/// assert_eq!(<Z0 as Cmp<Z0>>::Output::to_ordering(), Ordering::Equal);
/// assert_eq!(<Z0 as Cmp<P1>>::Output::to_ordering(), Ordering::Less);
/// ```
pub trait Cmp<Rhs = Self> {/// 比较结果的类型(只能是 `Greater`、`Less` 或 `Equal` 之一)type Output;#[doc(hidden)]  // 隐藏内部实现fn compare(self, rhs: Rhs) -> Self::Output;
}//---------------------bit 相对独立,集中保存bit.rs文件---------------------------------//---------------------Special 未来改为错误处理,不实现比较---------------------------------//---------------------Z0比较All---------------------------------
/// 0 == 0
impl Cmp<Z0> for Z0 {type Output = Equal;#[inline]fn compare(self, _: Z0) -> Self::Output {Equal::new()}
}/// 0 < 1
impl Cmp<P1> for Z0 {type Output = Less;#[inline]fn compare(self, _: P1) -> Self::Output {Less::new()}
}/// 0 > -1
impl Cmp<N1> for Z0 {type Output = Greater;#[inline]fn compare(self, _: N1) -> Self::Output {Greater::new()}
}/// 0 <==> B0<H>
impl<H: NonZero + Default> Cmp<B0<H>> for Z0
whereZ0: Cmp<H>,
{type Output = <Z0 as Cmp<H>>::Output;#[inline]fn compare(self, _: B0<H>) -> Self::Output {let _h = H::default();<Z0 as Cmp<H>>::compare(self, _h)}
}/// 0 <==> B1<H>
impl<H: NonZero + Default> Cmp<B1<H>> for Z0
whereZ0: Cmp<H>,
{type Output = <Z0 as Cmp<H>>::Output;#[inline]fn compare(self, _: B1<H>) -> Self::Output {let _h = H::default();<Z0 as Cmp<H>>::compare(self, _h)}
}//---------------------P1比较All---------------------------------
//---------------------P1比较All---------------------------------
/// 1 > 0
impl Cmp<Z0> for P1 {type Output = Greater;#[inline]fn compare(self, _: Z0) -> Self::Output {Greater::new()}
}/// 1 == 1
impl Cmp<P1> for P1 {type Output = Equal;#[inline]fn compare(self, _: P1) -> Self::Output {Equal::new()}
}/// 1 > -1
impl Cmp<N1> for P1 {type Output = Greater;#[inline]fn compare(self, _: N1) -> Self::Output {Greater::new()}
}/// P1 <==> B0<H>
impl<H: NonZero + Default> Cmp<B0<H>> for P1
whereZ0: Cmp<H>,
{type Output = <Z0 as Cmp<H>>::Output;#[inline]fn compare(self, _: B0<H>) -> Self::Output {let _h = H::default();<Z0 as Cmp<H>>::compare(Z0::new(), _h)}
}/// P1 <==> B1<H>
impl<H: NonZero + Default> Cmp<B1<H>> for P1
whereZ0: Cmp<H>,
{type Output = <Z0 as Cmp<H>>::Output;#[inline]fn compare(self, _: B1<H>) -> Self::Output {let _h = H::default();<Z0 as Cmp<H>>::compare(Z0::new(), _h)}
}//---------------------N1比较All---------------------------------
/// -1 < 0
impl Cmp<Z0> for N1 {type Output = Less;#[inline]fn compare(self, _: Z0) -> Self::Output {Less::new()}
}/// -1 < 1
impl Cmp<P1> for N1 {type Output = Less;#[inline]fn compare(self, _: P1) -> Self::Output {Less::new()}
}/// -1 == -1
impl Cmp<N1> for N1 {type Output = Equal;#[inline]fn compare(self, _: N1) -> Self::Output {Equal::new()}
}/// N1 <==> B0<H>
impl<H: NonZero + Default> Cmp<B0<H>> for N1
whereZ0: Cmp<H>,
{type Output = <Z0 as Cmp<H>>::Output;#[inline]fn compare(self, _: B0<H>) -> Self::Output {let _h = H::default();<Z0 as Cmp<H>>::compare(Z0::new(), _h)}
}/// N1 <==> B1<H>
impl<H: NonZero + Default> Cmp<B1<H>> for N1
whereZ0: Cmp<H>,
{type Output = <Z0 as Cmp<H>>::Output;#[inline]fn compare(self, _: B1<H>) -> Self::Output {let _h = H::default();<Z0 as Cmp<H>>::compare(Z0::new(), _h)}
}//---------------------B0<H>比较All---------------------------------/// B0<H> vs Z0: 比较H与Z0
impl<H: NonZero + Default> Cmp<Z0> for B0<H>
whereH: Cmp<Z0>,
{type Output = <H as Cmp<Z0>>::Output;#[inline]fn compare(self, _: Z0) -> Self::Output {let _h = H::default();<H as Cmp<Z0>>::compare(_h, Z0::new())}
}/// B0<H> vs P1: 比较H与Z0
impl<H: NonZero + Default> Cmp<P1> for B0<H>
whereH: Cmp<Z0>,
{type Output = <H as Cmp<Z0>>::Output;#[inline]fn compare(self, _: P1) -> Self::Output {let _h = H::default();<H as Cmp<Z0>>::compare(_h, Z0)}
}/// B0<H> vs N1: 比较H与Z0 
impl<H: NonZero + Default> Cmp<N1> for B0<H>
whereH: Cmp<Z0>,
{type Output = <H as Cmp<Z0>>::Output;#[inline]fn compare(self, _: N1) -> Self::Output {let _h = H::default();<H as Cmp<Z0>>::compare(_h, Z0)}
}/// B0<H1> vs B0<H2>: 比较H1与H2
impl<H1: NonZero + Default, H2: NonZero + Default> Cmp<B0<H2>> for B0<H1>
whereH1: Cmp<H2>,
{type Output = <H1 as Cmp<H2>>::Output;#[inline]fn compare(self, _: B0<H2>) -> Self::Output {let _h1 = H1::default();let _h2 = H2::default();<H1 as Cmp<H2>>::compare(_h1, _h2)}
}/// B0<H1> vs B1<H2>: 先比较H1与H2,如果相等则B1>B0
impl<H1: NonZero + Default, H2: NonZero + Default> Cmp<B1<H2>> for B0<H1>
whereH1: Cmp<H2>,<H1 as Cmp<H2>>::Output: IfLess,<<H1 as Cmp<H2>>::Output as IfLess>::Output:Default,
{type Output = <<H1 as Cmp<H2>>::Output as IfLess>::Output;#[inline]fn compare(self, _: B1<H2>) -> Self::Output {Self::Output::default()}
}// 辅助类型用于处理比较结果
pub trait IfLess {type Output;fn less() -> Self::Output;
}impl IfLess for Equal {type Output = Less;fn less() -> Self::Output{Less::new()}
}impl IfLess for Less {type Output = Less;fn less() -> Self::Output{Less::new()}
}impl IfLess for Greater {type Output = Greater;fn less() -> Self::Output{Greater::new()}
}//---------------------B1<H>比较All---------------------------------/// B1<H> vs Z0: 比较H与Z0
impl<H: NonZero + Default> Cmp<Z0> for B1<H>
whereH: Cmp<Z0>,
{type Output = <H as Cmp<Z0>>::Output;#[inline]fn compare(self, _: Z0) -> Self::Output {let _h = H::default();<H as Cmp<Z0>>::compare(_h, Z0)}
}/// B1<H> vs P1: 比较H与Z0
impl<H: NonZero + Default> Cmp<P1> for B1<H>
whereH: Cmp<Z0>,
{type Output = <H as Cmp<Z0>>::Output;#[inline]fn compare(self, _: P1) -> Self::Output {let _h = H::default();<H as Cmp<Z0>>::compare(_h, Z0)}
}/// B1<H> vs N1: 比较H与Z0
impl<H: NonZero + Default> Cmp<N1> for B1<H>
whereH: Cmp<Z0>,
{type Output = <H as Cmp<Z0>>::Output;#[inline]fn compare(self, _: N1) -> Self::Output {let _h = H::default();<H as Cmp<Z0>>::compare(_h, Z0)}
}/// B1<H1> vs B0<H2>: 先比较H1与H2,如果相等则B1>B0
impl<H1: NonZero + Default, H2: NonZero + Default> Cmp<B0<H2>> for B1<H1>
whereH1: Cmp<H2>,<H1 as Cmp<H2>>::Output: IfGreater,<<H1 as Cmp<H2>>::Output as IfGreater>::Output: Default,
{type Output = <<H1 as Cmp<H2>>::Output as IfGreater>::Output;#[inline]fn compare(self, _: B0<H2>) -> Self::Output {Self::Output::default()}
}/// B1<H1> vs B1<H2>: 比较H1与H2
impl<H1: NonZero + Default, H2: NonZero + Default> Cmp<B1<H2>> for B1<H1>
whereH1: Cmp<H2>,
{type Output = <H1 as Cmp<H2>>::Output;#[inline]fn compare(self, _: B1<H2>) -> Self::Output {let _h1 = H1::default();let _h2 = H2::default();<H1 as Cmp<H2>>::compare(_h1, _h2)}
}// 新增辅助trait用于处理B1>B0的情况
pub trait IfGreater {type Output;fn greater() -> Self::Output;
}impl IfGreater for Equal {type Output = Greater;fn greater() -> Self::Output {Greater::new()}
}impl IfGreater for Less {type Output = Less;fn greater() -> Self::Output {Less::new()}
}impl IfGreater for Greater {type Output = Greater;fn greater() -> Self::Output {Greater::new()}
}

二、核心组件

  1. 比较结果类型

    • Equal (Z0): 表示相等

    • Less (N1): 表示小于

    • Greater (P1): 表示大于

  2. 主要特征(trait)

    • Ord: 标记特征,用于比较结果类型,可以将类型转换为运行时的 Ordering 值

    • Cmp: 类型比较运算符,类似于 core::cmp::Ord::cmp 但用于类型比较

三、实现细节

基本类型比较

代码为基本类型实现了相互比较:

  • Z0 (零)

  • P1 (正一)

  • N1 (负一)

例如:


// 0 == 0
impl Cmp<Z0> for Z0 {type Output = Equal;// ...
}// 0 < 1
impl Cmp<P1> for Z0 {type Output = Less;// ...
}
二进制数比较

代码还处理了二进制数类型 B0 和 B1 的比较,其中 H 是高位部分:

  • B0 表示二进制数以0结尾的数

  • B1 表示二进制数以1结尾的数

比较规则:

  1. 当比较 B0 和 B1 时,先比较高位数 H,如果相等则 B1 大于 B0

  2. 其他情况直接比较高位数

辅助特征
  • IfLess: 处理 B0

    与 B1

    比较时的逻辑

  • IfGreater: 处理 B1

    与 B0

    比较时的逻辑

四、使用示例

···rust

use unitrix::number::{Cmp, Ord, N1, Z0, P1};
use std::cmp::Ordering;

assert_eq!(<Z0 as Cmp>::Output::to_ordering(), Ordering::Greater);
assert_eq!(<Z0 as Cmp>::Output::to_ordering(), Ordering::Equal);
assert_eq!(<Z0 as Cmp>::Output::to_ordering(), Ordering::Less);


### 五、总结这段代码实现了一个编译时的类型级整数比较系统,通过Rust的类型系统在编译期完成整数比较操作,避免了运行时开销。它支持基本整数和二进制表示的数字之间的比较,并提供了将比较结果转换为运行时 Ordering 值的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/911914.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/911914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年渗透测试面试题总结-2025年HW(护网面试) 14(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 1. SQL注入原理 &#x1f4a5; 2. XXE攻击&#xff08;XML外部实体注入&#xff09; &#x1f9e9; 3. SQ…

Android开发根据滑动距离标题栏进行渐变

Android开发根据滑动距离标题栏进行渐变 假设滑动控件是NestedScrollView。 先监听NestedScrollView的滑动距离&#xff1a; nslv_preview_me.setOnScrollChangeListener(object :NestedScrollView.OnScrollChangeListener{override fun onScrollChange(v: NestedScrollView…

高中成绩可视化平台开发笔记

高中成绩可视化平台&#xff08;1&#xff09; 一、项目概述 本系统是一个基于 PyQt5 和 Matplotlib 的高中成绩数据可视化分析平台&#xff0c;旨在帮助教师快速了解学生成绩分布、班级对比、学科表现等关键指标。平台支持文科与理科的数据切换&#xff0c;并提供多个维度的图…

自动化按需导入组件库的工具rust版本完成开源了

背景 当我为每个Vue项目使用ui组件库的时候&#xff0c;都会使用按需导入的方式来使用ui组件库。但是每次按需导入&#xff0c;不可避免的就需要做以下三步。我们以element plus ui组件库为例。 1. 安装依赖 第一步&#xff0c;当然是需要安装依赖。命令如下: pnpm add unp…

Linux内核中TCP分段的核心机制:tcp_fragment函数解析

引言:TCP分段的必要性 在TCP/IP协议栈中,MSS(最大分段大小) 限制了单次传输的数据量。当应用层发送的数据超过当前路径的MSS时,内核必须执行分段操作。tcp_fragment函数正是Linux内核中处理TCP分段的核心机制,它巧妙地在协议合规性、内存安全和性能效率之间取得平衡。 一…

【赵渝强老师】OceanBase OBServer节点的SQL层

OceanBase OBServer节点的SQL层将用户的SQL请求转化成对一个或多个Tablet的数据访问。SQL层会按照以下顺序经过一系列组件来处理一个SQL&#xff1a; Parser -->Resolver-->Transformer-->Optimizer-->CodeGenerator-->Executor。视频讲解如下 【赵渝强老师】O…

从“高配”到“普惠”,黑芝麻智能携手Nullmax打造辅助驾驶主流量产方案

近日&#xff0c;黑芝麻智能携手Nullmax打造的辅助驾驶主流量产方案正式发布。该方案面向8-15万元级别主流车型&#xff0c;基于单颗黑芝麻智能武当C1236跨域计算芯片&#xff0c;集成Nullmax全栈自研的软件技术架构&#xff0c;结合领先的视觉感知算法&#xff0c;打造高性能辅…

信息安全认证体系全解析:从资质证明到行业准入的实践指南

Hello&#xff01;大家好&#xff0c;小编是一名专注IT领域的资深探索家&#xff0c;大家发现了吗&#xff1f;现在刷招聘软件&#xff0c;国企安全岗必标 "CISP 优先"&#xff0c;外企招聘悄悄写着 "CISSP 加分"—— 这些带字母的证书到底是啥&#xff1f…

优雅地创建实体类——Builder 链式调用

我们来看以下的代码。改造前构造实体类用重载构造器或用 setter 对变量进行赋值&#xff0c;一旦变量变多则需要对每个变量进行 set 赋值&#xff0c;并且有可能会赋值错对象。 private static void test() {//1.构造器赋值Task task1 new Task("2023000000009439"…

如何轻松将照片从 iPhone 传输到 Android?

从 iPhone 换到 Android 手机后&#xff0c;你肯定不想丢掉珍贵的照片回忆吧&#xff1f;好在&#xff0c;本文分享了 6 种有效的解决方案&#xff0c;教你如何轻松地将照片从 iPhone 传输到 Android。 第 1 部分&#xff1a;如何通过 iReaShare Phone Transfer 将照片从 iPhon…

AI编程:[体验]存量微服务架构下植入WebSocket的“踩坑”与“填坑”

一、核心需求 功能需求&#xff1a;用户可以通过语音与AI对话&#xff0c;并实现类似ChatGPT的实时交互&#xff08;流式响应&#xff0c;打字机效果&#xff09;技术需求&#xff1a;在现有微服务架构中进行扩展&#xff08;SpringCloud&#xff09; 二、技术盲点 陌生领域 …

uniapp事件onLoad区分大小写

区分大小写。不然会不起作用。onLoad方法中的功能均不会被执行。 除了功能逻辑要检查外。大小写是要认真检查的一部分

《打破微前端困局:样式冲突与资源隔离破局指南》

微前端架构凭借其独特优势&#xff0c;正逐渐成为众多大型项目的首选架构模式。它将一个庞大的前端应用拆解为多个相对独立的子应用&#xff0c;每个子应用可以独立开发、部署和维护&#xff0c;极大地提升了开发效率与团队协作的灵活性。然而&#xff0c;随着微前端架构的广泛…

OpenCV——边缘检测

边缘检测 一、边缘检测二、边缘检测算子2.1、Sobel算子2.2、Scharr算子2.3、Laplacian算子 三、Canny边缘检测3.1、Canny边缘检测的步骤3.2、Canny算法的实现 一、边缘检测 边缘是指图像中像素的灰度值发生剧烈变化的区域&#xff1a; 图像中的边缘主要有以下几种成因&#x…

2506认证资讯|工信部出手整治多品牌充电宝,WMC上海稍逊往年,RED修订Common Charger,WiFi7 FCC测试

01 — 中国 工信部拟制定移动电源强制性国家标准 该标准将从以下方面全面提升移动电源安全性&#xff1a; 1. 拟在GB 31241、GB 4943.1基础上&#xff0c;新增或加严过充电、针刺等试验要求。 2. 拟提出影响电池安全的正负极材料、隔膜等关键材料要求。 3. 拟规范锂离子电池…

Linux Regulator 子系统核心逻辑与关键问题全解析

Linux Regulator 子系统核心逻辑与关键问题全解析 一、什么是 regulator 子系统&#xff1f;核心作用&#xff1f; regulator 子系统是 Linux 内核为板级/SoC 多路可控电源设计的统一电源管理框架。它的主要作用是&#xff1a; 为每一路可控电源&#xff08;Buck、LDO、DCDC …

制造业官网3D应用,让产品会“说话”

在当今数字化时代&#xff0c;装备制造业正经历着前所未有的变革。随着消费升级和国内经济的蓬勃发展&#xff0c;中国社会的经济格局从传统的“工业经济”向多元化的“服务经济”转型。装备制造业作为制造业与服务业融合的核心领域&#xff0c;积极探索全新的“服务化”发展模…

SCAU15--气球狂欢节

15 气球狂欢节 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC 描述&#xff1a; 一个充满魔法的国度中&#xff0c;存在一场年度的节日&#xff0c;名为“气球狂欢节”。在这个节日中&#xff0c;有一个传统的比赛&#xff0c;那就是“气球挑战赛”…

python打卡day56@浙大疏锦行

知识点回顾&#xff1a; 假设检验基础知识 原假设与备择假设P值、统计量、显著水平、置信区间 白噪声 白噪声的定义自相关性检验&#xff1a;ACF检验和Ljung-Box 检验偏自相关性检验&#xff1a;PACF检验 平稳性 平稳性的定义单位根ADF检验: 越小越平稳 季节性检验 ACF检验序列…

采集文章+原创AI处理+发布网站详细教程

简数采集器是新一代的网站文章采集和发布平台&#xff0c;完全在线配置和使用云采集&#xff0c;功能强大&#xff0c;操作简单&#xff0c;配置快捷高效。 简数不仅提供网页文章采集、数据批量处理、定时采集、定时定量自动发布等基本功能&#xff0c;还集成强大的SEO工具与接…