【PhysUnits】4.1 类型级比特位实现解释(boolean.rs)

一、源码

该代码实现了一个类型级(type-level)的布尔系统,允许在编译时进行布尔运算。

//! 类型级比特位实现
//!
//! 这些是基础的比特位类型,作为本库中其他数值类型的构建基础
//!
//! 已实现的**类型运算符**:
//!
//! - 来自 `core::ops` 的:`BitAnd`(与), `BitOr`(或), `BitXor`(异或) 和 `Not`(非)
//! - 比较操作:`PartialEq`, `Eq`
//! - 转换操作:`From<bool>`, `Into<bool>`
//!
//! 别名定义:
//! - `B1` = `True` (逻辑真/正一)
//! - `B0` = `False` (逻辑假/零)
//!
//! 示例:
//! ```
//! use your_crate::{B1, B0, Boolean};
//!
//! let t = B1::new();
//! let f = B0::new();
//!
//! assert_eq!(t & t, B1);
//! assert_eq!(t | f, B1);
//! assert_eq!(t ^ t, B0);
//! assert_eq!(!t, B0);
//! ```use core::ops::{BitAnd, BitOr, BitXor, Not};
use crate::sealed::Sealed;/// 编译时比特位的标记特征
///
/// 这个 trait 定义了类型级布尔值的基本操作和行为,
/// 包括构造、转换和常量值访问。
pub trait Boolean: Sealed + Copy + Default + 'static {/// 布尔值的编译时常量表示const BOOL: bool;/// 创建一个该类型的新实例fn new() -> Self;/// 将类型级布尔值转换为运行时布尔值fn to_bool() -> bool {Self::BOOL}/// 获取当前实例对应的运行时布尔值fn as_bool(&self) -> bool {Self::BOOL}
}/// 类型级比特位0(逻辑假)
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct False;// 类型级比特位0的别名(零) zero.rs文件实现
//pub type B0 = False;impl False {/// 创建一个新的 `False` 实例#[inline(always)]pub const fn new() -> Self {False}
}/// 类型级比特位1(逻辑真)
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct True;/// 类型级比特位1的别名(正一)
pub type B1 = True;impl True {/// 创建一个新的 `True` 实例#[inline(always)]pub const fn new() -> Self {True}
}// 为布尔类型实现密封标记
impl Sealed for False {}
impl Sealed for True {}impl Boolean for False {const BOOL: bool = false;#[inline(always)] fn new() -> Self { Self }
}impl Boolean for True {const BOOL: bool = true;#[inline(always)] fn new() -> Self { Self }
}// 实现所有逻辑运算/// 实现逻辑非运算
impl Not for False {type Output = True;#[inline(always)]fn not(self) -> Self::Output {True}
}impl Not for True {type Output = False;#[inline(always)]fn not(self) -> Self::Output {False}
}/// 实现逻辑与运算
impl<Rhs: Boolean> BitAnd<Rhs> for False {type Output = Self;#[inline(always)]fn bitand(self, _: Rhs) -> Self::Output {Self}
}impl BitAnd<False> for True {type Output = False;#[inline(always)]fn bitand(self, _: False) -> Self::Output {False}
}impl BitAnd<True> for True {type Output = True;#[inline(always)]fn bitand(self, _: True) -> Self::Output {True}
}/// 实现逻辑或运算
impl BitOr<False> for False {type Output = False;#[inline(always)]fn bitor(self, _: False) -> Self::Output {False}
}impl BitOr<True> for False {type Output = True;#[inline(always)]fn bitor(self, _: True) -> Self::Output {True}
}impl<Rhs: Boolean> BitOr<Rhs> for True {type Output = True;#[inline(always)]fn bitor(self, _: Rhs) -> Self::Output {True}
}/// 实现逻辑异或运算
impl BitXor<False> for False {type Output = False;#[inline(always)]fn bitxor(self, _: False) -> Self::Output {False}
}impl BitXor<False> for True {type Output = True;#[inline(always)]fn bitxor(self, _: False) -> Self::Output {True}
}impl BitXor<True> for False {type Output = True;#[inline(always)]fn bitxor(self, _: True) -> Self::Output {True}
}impl BitXor<True> for True {type Output = False;#[inline(always)]fn bitxor(self, _: True) -> Self::Output {False}
}// 实现转换操作impl From<bool> for &'static dyn Boolean {/// 从运行时布尔值创建类型级布尔值的引用fn from(b: bool) -> Self {if b { &True } else { &False }}
}impl From<bool> for True {/// 从 `true` 创建 `True` 实例////// # Panics/// 如果输入为 `false` 会 panicfn from(b: bool) -> Self {assert!(b);True}
}impl From<bool> for False {/// 从 `false` 创建 `False` 实例////// # Panics/// 如果输入为 `true` 会 panicfn from(b: bool) -> Self {assert!(!b);False}
}impl<T: Boolean> From<T> for bool {/// 将类型级布尔值转换为运行时布尔值fn from(b: T) -> Self {b.as_bool()}
}impl std::fmt::Display for dyn Boolean {/// 实现格式化输出,显示布尔值fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {write!(f, "{}", self.as_bool())}
}#[cfg(test)]
mod tests {use super::*;#[test]fn test_aliases() {let p1 = B1::new();let z0 = B0::new();assert_eq!(p1, True);assert_eq!(z0, False);assert!(B1::BOOL);assert!(!B0::BOOL);}#[test]fn test_boolean_ops_with_aliases() {let p1 = B1::new();let z0 = B0::new();assert_eq!(p1 & p1, B1);assert_eq!(p1 | z0, B1);assert_eq!(p1 ^ p1, B0);assert_eq!(!p1, B0);}#[test]fn test_boolean_ops() {let t = True::new();let f = False::new();assert_eq!(t & t, True);assert_eq!(t & f, False);assert_eq!(f & t, False);assert_eq!(f & f, False);assert_eq!(t | t, True);assert_eq!(t | f, True);assert_eq!(f | t, True);assert_eq!(f | f, False);assert_eq!(t ^ t, False);assert_eq!(t ^ f, True);assert_eq!(f ^ t, True);assert_eq!(f ^ f, False);assert_eq!(!t, False);assert_eq!(!f, True);}#[test]fn test_conversions() {let t: &dyn Boolean = true.into();assert!(t.as_bool());let f: &dyn Boolean = false.into();assert!(!f.as_bool());assert!(bool::from(True::new()));assert!(!bool::from(False::new()));}
}

二、主要组件

  1. Boolean trait
  • 定义了类型级布尔值的基本行为和操作

  • 包含编译时常量BOOL表示布尔值

  • 提供构造方法new()和转换方法to_bool()/as_bool()

  • 标记为Sealed防止外部实现

  1. 布尔类型
  • False: 表示逻辑假/0

  • True: 表示逻辑真/1

类型别名:

B0 = False (零)

B1 = True (正一)

  1. 实现的操作
  • 逻辑运算:

    • Not(非): !

    • BitAnd(与): &

    • BitOr(或): |

    • BitXor(异或): ^

  • 比较: PartialEq, Eq

  • 转换: From, Into

三、关键实现细节

  1. 常量值:
  • False::BOOL = false

  • True::BOOL = true

  1. 逻辑运算实现:
  • 每种运算都为所有可能的组合提供了具体实现

  • 例如True & False返回False

  1. 转换操作:
  • 可以从运行时bool转换为类型级布尔值

  • 也可以从类型级布尔值转换回运行时bool

  1. 性能优化:
  • 使用#[inline(always)]确保零运行时开销

  • 所有操作都在编译时完成

四、使用示例

use your_crate::{B1, B0};let t = B1::new();  // True
let f = B0::new();  // Falseassert_eq!(t & t, B1);  // True AND True = True
assert_eq!(t | f, B1);  // True OR False = True
assert_eq!(t ^ t, B0);  // True XOR True = False
assert_eq!(!t, B0);     // NOT True = False

五、测试用例

  1. 代码包含了全面的测试:

  2. 测试类型别名是否正确

  3. 测试所有逻辑运算

  4. 测试与运行时布尔值的转换

这种类型级编程技术在需要编译时计算和验证的场景中非常有用,如类型状态机、维度检查等。

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

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

相关文章

【docker】--数据卷挂载

文章目录 存储卷管理创建存储卷查看存储卷详细信息查看存储卷删除存储卷 存储卷管理 # 目录挂载 docker run -v 本机目录&#xff1a;容器目录#1&#xff09; # 将容器内部的 “/usr/share/nginx/html” 进行持久化挂载 会在宿主机生成一个随机的存储卷 docker run -v /usr/sh…

双重差分模型学习笔记2(理论)

【DID最全总结】90分钟带你速通双重差分&#xff01;_哔哩哔哩_bilibili 目录 一、staggered DID 交错双重差分 二、动态双重差分 动态双重差分法公式解释 符号解释 公式逻辑与案例 与标准DID的区别 总结 “双减” 政策动态差分模型 &#xff08;一&#xff09;设定处…

预测模型开发与评估:基于机器学习的数据分析实践

在当今数据驱动的时代&#xff0c;预测模型已成为各行各业决策制定的核心工具。本文将分享我在COMP5310课程项目中开发预测模型的经验&#xff0c;探讨从数据清洗到模型优化的完整过程&#xff0c;并提供详细的技术实现代码。 ## 研究问题与数据集 ### 研究问题 我们的研究聚焦…

Java 并发编程归纳总结(可重入锁 | JMM | synchronized 实现原理)

1、锁的可重入 一个不可重入的锁&#xff0c;抢占该锁的方法递归调用自己&#xff0c;或者两个持有该锁的方法之间发生调用&#xff0c;都会发生死锁。以之前实现的显式独占锁为例&#xff0c;在递归调用时会发生死锁&#xff1a; public class MyLock implements Lock {/* 仅…

数据治理域——数据同步设计

摘要 本文主要介绍了数据同步的多种方式&#xff0c;包括直连同步、数据文件同步和数据库日志解析同步。每种方式都有其适用场景、技术特点、优缺点以及适用的数据类型和实时性要求。文章还详细探讨了数据直连同步的特点、工作原理、优点、缺点、适用场景等&#xff0c;并对数…

AI人工智能在教育领域的应用

AI人工智能在教育领域的应用 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;逐渐成为推动教育变革的重要力量。AI在教育领域的应用不仅改变了传统的教学模式&#xff0c;还为个性化学习、教育资源优化和教育管理带来了前所未有的机遇。本文将从多个方面探…

ohttps开启群晖ssl证书自动更新

开启群晖ssl证书自动更新OHTTPS ohttps是一个免费自动签发ssl证书、管理、部署的项目。 https://ohttps.com 本文举例以ohttps项目自动部署、更新群晖的ssl证书。 部署 签发证书 打开ohttps-证书管理-创建证书-按你实际情况创建证书。创建部署节点 打开Ohttps-部署节点-添加…

ElasticSearch聚合操作案例

1、根据color分组统计销售数量 只执行聚合分组&#xff0c;不做复杂的聚合统计。在ES中最基础的聚合为terms&#xff0c;相当于 SQL中的count。 在ES中默认为分组数据做排序&#xff0c;使用的是doc_count数据执行降序排列。可以使用 _key元数据&#xff0c;根据分组后的字段数…

SQLite 数据库常见问题及解决方法

一、数据库文件锁定问题 1. 问题表现 在多线程或多进程环境下访问 SQLite 数据库时&#xff0c;常常会出现数据库文件被锁定的情况。当一个进程对数据库执行写操作时&#xff0c;其他进程的读写操作都会被阻塞&#xff0c;导致应用程序出现卡顿甚至无响应。比如在移动应用开发…

DeepSeek基础:PPO、DPO、GRPO概念详解

DeepSeek-R1 的强化学习方案中&#xff0c;其亮点之一在于通过 GRPO 算法取代RLHF 常用的 PPO&#xff0c;通过尽可能减少人类标注数据&#xff0c;设计纯 RL 的环境&#xff0c;用精心设计的奖励机制来训练模型自己学会推理。那么什么是PPO、GRPO&#xff0c;其产生的背景、核…

一分钟了解机器学习

一分钟了解机器学习 A Minute to Know About Machine Learning By JacksonML 1. 什么是机器学习&#xff1f; 机器学习&#xff08;Machine Learning,ML&#xff09; 是人工智能的分支&#xff0c;通过从数据中自动学习规律&#xff0c;使计算机无需显式编程即可完成任务。…

mvc-service引入

什么是业务层 1&#xff09;Model1&#xff08;JSP&#xff09;和Model2&#xff08;模糊的mvc&#xff09;: MVC&#xff1a;Model(模型)&#xff0c;View(视图)&#xff0c;Controller&#xff08;控制器&#xff09; 视图层&#xff1a;用于数据展示以及用户交互的界…

第一次做逆向

题目来源&#xff1a;ctf.show 1、下载附件&#xff0c;发现一个exe和一个txt文件 看看病毒加没加壳&#xff0c;发现没加那就直接放IDA 放到IDA找到main主函数&#xff0c;按F5反编译工具就把他还原成类似C语言的代码 然后我们看逻辑&#xff0c;将flag.txt文件的内容进行加…

docker(四)使用篇二:docker 镜像

在上一章中&#xff0c;我们介绍了 docker 镜像仓库&#xff0c;本文就来介绍 docker 镜像。 一、什么是镜像 docker 镜像本质上是一个 read-only 只读文件&#xff0c; 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。 我们可以把…

k8s 1.10.26 一次containerd失败引发kubectl不可用问题

k8s 1.10.26 一次containerd失败引发kubectl不可用问题 开机k8s 1.10.26时&#xff0c;报以下错误 [rootmaster ~]# kubectl get no E0515 08:03:00.914894 7993 memcache.go:265] couldnt get current server API group list: Get "https://192.168.80.50:6443/api?…

今日积累:若依框架配置QQ邮箱,来发邮件,注册账号使用

QQ邮箱SMTP服务器设置 首先&#xff0c;我们需要了解QQ邮箱的SMTP服务器地址。对于QQ邮箱&#xff0c;SMTP服务器地址通常是smtp.qq.com。这个地址适用于所有使用QQ邮箱发送邮件的客户端。 QQ邮箱SMTP端口设置 QQ邮箱提供了两种加密方式&#xff1a;SSL和STARTTLS。根据您选…

无缝部署您的应用程序:将 Jenkins Pipelines 与 ArgoCD 集成

在 DevOps 领域&#xff0c;自动化是主要目标之一。这包括自动化软件部署方式。与其依赖某人在部署软件的机器上进行 rsync/FTP/编写软件&#xff0c;不如使用 CI/CD 的概念。 CI&#xff0c;即持续集成&#xff0c;是通过代码提交创建工件的步骤。这可以是 Docker 镜像&#…

4.2.3 Thymeleaf标准表达式 - 5. 片段表达式

在本次实战中&#xff0c;我们通过 Thymeleaf 的片段表达式实现了模板的模块化和复用。首先&#xff0c;我们定义了一个导航栏片段 navbar&#xff0c;并通过参数 activeTab 动态高亮当前激活的标签。然后&#xff0c;我们在多个页面&#xff08;如主页、关于页和联系页&#x…

网安面试经(1)

1.说说IPsec VPN 答&#xff1a;IPsec VPN是利用IPsec协议构建的安全虚拟网络。它通过加密技术&#xff0c;在公共网络中创建加密隧道&#xff0c;确保数据传输的保密性、完整性和真实性。常用于企业分支互联和远程办公&#xff0c;能有效防范数据泄露与篡改&#xff0c;但部署…

【C++/Qt shared_ptr 与 线程池】合作使用案例

以下是一个结合 std::shared_ptr 和 Qt 线程池&#xff08;QThreadPool&#xff09;的完整案例&#xff0c;展示了如何在多线程任务中安全管理资源&#xff0c;避免内存泄漏。 案例场景 任务目标&#xff1a;在后台线程中处理一个耗时的图像检测任务&#xff0c;任务对象通过 …