一、源码

这段代码实现了一个类型级别的长度计算系统,用于在编译时计算数组长度和二进制数的位数。

  1. 定义(type_operators.rs)
/// A **type operator** that gives the length of an `Array` or the number of bits in a `UInt`.
#[allow(clippy::len_without_is_empty)]
pub trait Len {/// The length as a type-level unsigned integer.type Output: crate::Unsigned;/// This function isn't used in this crate, but may be useful for others.fn len(&self) -> Self::Output;
}
  1. 别名(operator_aliases.rs)
/// Alias for the associated type of `Len`: `Length<A> = <A as Len>::Output`
pub type Length<T> = <T as Len>::Output;
  1. 无符号整数实现(uint.rs)
// ---------------------------------------------------------------------------------------
// Getting length of unsigned integers, which is defined as the number of bits before `UTerm`/// Length of `UTerm` by itself is 0
impl Len for UTerm {type Output = U0;#[inline]fn len(&self) -> Self::Output {UTerm}
}/// Length of a bit is 1
impl<U: Unsigned, B: Bit> Len for UInt<U, B>
whereU: Len,Length<U>: Add<B1>,Add1<Length<U>>: Unsigned,
{type Output = Add1<Length<U>>;#[inline]fn len(&self) -> Self::Output {self.msb.len() + B1}
}
  1. 数组实现(array.rs)
// Length/// Length of `ATerm` by itself is 0
impl Len for ATerm {type Output = U0;#[inline]fn len(&self) -> Self::Output {UTerm}
}/// Size of a `TypeArray`
impl<V, A> Len for TArr<V, A>
whereA: Len,Length<A>: Add<B1>,Sum<Length<A>, B1>: Unsigned,
{type Output = Add1<Length<A>>;#[inline]fn len(&self) -> Self::Output {self.rest.len() + B1}
}

二、Len Trait 定义


pub trait Len {type Output: crate::Unsigned;  // 输出类型必须是Unsignedfn len(&self) -> Self::Output; // 运行时获取长度的方法
}
  • 类型级操作符: 在编译时计算长度

  • Output: 关联类型,表示长度的类型(必须是Unsigned类型)

  • len(): 运行时方法,实际返回类型级别的长度值

三、类型别名


pub type Length<T> = <T as Len>::Output;
  • 简化访问: 提供更简洁的方式来获取类型的长度类型

  • 用法: Length 等价于 ::Output

四、无符号整数实现(计算二进制位数)

  1. UTerm(终止符)的实现

impl Len for UTerm {type Output = U0;  // 长度为0fn len(&self) -> Self::Output {UTerm  // 返回UTerm(即U0)}
}
  • 基准情况: 终止符的长度为0

  • UTerm 表示二进制数的结束,没有位数

  1. UInt(二进制位)的实现

impl<U: Unsigned, B: Bit> Len for UInt<U, B>
whereU: Len,                    // 剩余部分必须有长度Length<U>: Add<B1>,        // 剩余长度+1必须可计算Add1<Length<U>>: Unsigned, // 结果必须是Unsigned类型
{type Output = Add1<Length<U>>; // 长度 = 剩余长度 + 1fn len(&self) -> Self::Output {self.msb.len() + B1  // 递归计算}
}
  • 递归计算: 当前UInt的长度 = 剩余部分长度 + 1

  • self.msb: 剩余的高位部分

  • B1: 类型级别的数字1

  • Add1<Length>: 类型级别的加法 Length + 1

示例: 计算 UInt<UInt<UTerm, B1>, B0> (二进制10,即数字2) 的长度:

  • 第一层:UInt<UInt<UTerm, B1>, B0> → Length<UInt<UTerm, B1>> + 1

  • 第二层:UInt<UTerm, B1> → Length + 1 = 0 + 1 = 1

  • 结果:1 + 1 = 2 位

五、数组实现(计算元素个数)

  1. ATerm(数组终止符)的实现

impl Len for ATerm {type Output = U0;  // 长度为0fn len(&self) -> Self::Output {UTerm}
}
  • 基准情况: 空数组的长度为0

  • ATerm 表示数组的结束

  1. TArr(类型数组)的实现

impl<V, A> Len for TArr<V, A>
whereA: Len,                    // 剩余数组必须有长度Length<A>: Add<B1>,        // 剩余长度+1必须可计算Sum<Length<A>, B1>: Unsigned, // 结果必须是Unsigned类型
{type Output = Add1<Length<A>>; // 长度 = 剩余数组长度 + 1fn len(&self) -> Self::Output {self.rest.len() + B1  // 递归计算}
}
  • 递归计算: 当前数组长度 = 剩余数组长度 + 1

  • self.rest: 数组中剩余的元素

  • 示例: 数组 [i32, f64, bool] 的长度计算:

    • 第一层:TArr<i32, TArr<f64, TArr<bool, ATerm>>> → Length<TArr<f64, TArr<bool, ATerm>>> + 1

    • 第二层:TArr<f64, TArr<bool, ATerm>> → Length<TArr<bool, ATerm>> + 1

    • 第三层:TArr<bool, ATerm> → Length + 1 = 0 + 1 = 1

    • 结果:1 + 1 + 1 = 3 个元素

六、设计特点

  • 类型安全: 所有计算在编译时完成,保证类型正确性

  • 递归模式: 使用递归遍历数据结构

  • 统一接口: 数组和二进制数使用相同的Len trait

  • 零成本抽象: 运行时没有额外开销,所有信息在编译时已知

这种模式常用于需要编译时计算的场景,如静态数组边界检查、类型级别的数学运算等。

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

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

相关文章

【Docker项目实战】使用Docker部署Hibiscus.txt简单日记工具

【Docker项目实战】使用Docker部署Hibiscus.txt简单日记工具一、Hibiscus介绍1.1 Hibiscus简介1.2 主要特点二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、拉取镜像五、部署Hibis…

openharmony之启动恢复子系统详解

OpenHarmony的启动恢复子系统负责整个系统的启动流程&#xff0c;其中init进程是整个系统启动的第一个用户态进程&#xff08;PID1&#xff09;&#xff0c;承担着系统初始化的核心职责 &#x1f3af; 目录结构 &#x1f4cb; 理论基础&#x1f50d; 源码结构分析⚙️ 配置体系…

Jenkins + SonarQube 从原理到实战四:Jenkins 与 Gerrit 集成并实现自动任务

前言 前面我们已经部署了 SonarQube&#xff0c;并加入了 sonar-cxx 插件&#xff0c;实现了 C/C 代码扫描&#xff0c;同时打通了 Windows AD 域&#xff0c;实现了 AD 用户登录与权限管控。 原计划本篇&#xff08;第四篇&#xff09;完成 Jenkins Gerrit Sonar 的 CI 部分…

基于Spring Boot与Redis的电商场景面试问答解析

基于Spring Boot与Redis的电商场景面试问答解析 第一轮&#xff1a;基础问题 面试官&#xff1a; 你好小C&#xff0c;今天我们以电商场景为背景进行技术面试。第一个问题&#xff0c;解释一下Spring Boot的核心优势是什么&#xff1f; 小C&#xff1a; Spring Boot就是开箱即用…

CUDA安装,pytorch库安装

一、CUDA安装 1.查看自己电脑适配的CUDA的最高版本 在命令提示符里输入nvidia-smi表格右上角显示的CUDA版本是该电脑适配的最高版本一般下载比该版本低一点的版本&#xff0c;因为会更稳定 由于本机没有GPU所以会出现这个报错&#xff0c;如果有GPU会出现如下报告&#xff1a…

力扣 第 463 场周赛

1. 按策略买卖股票的最佳时机 给你两个整数数组 prices 和 strategy&#xff0c;其中&#xff1a; prices[i] 表示第 i 天某股票的价格。 strategy[i] 表示第 i 天的交易策略&#xff0c;其中&#xff1a; -1 表示买入一单位股票。 0 表示持有股票。 1 表示卖出一单位股票。 同…

Matplotlib 可视化大师系列(六):plt.imshow() - 绘制矩阵与图像的强大工具

目录Matplotlib 可视化大师系列博客总览Matplotlib 可视化大师系列&#xff08;六&#xff09;&#xff1a;plt.imshow() - 绘制矩阵与图像的强大工具一、 plt.imshow() 是什么&#xff1f;何时使用&#xff1f;二、 函数原型与核心参数三、 从入门到精通&#xff1a;代码示例示…

小游戏AssetBundle加密方案解析

据游戏工委数据统计&#xff0c;2025年1-6月&#xff0c;国内小程序游戏市场实际销售收入232.76亿元&#xff0c;同比增长40.2%。其中内购产生收入153.03亿元&#xff0c;占比65.7%&#xff0c;呈逐年提升趋势。爆款频出的小游戏&#xff0c;已经成为当下游戏行业的重要增长点。…

linux编程----网络通信(TCP)

1.TCP特点1.面向数据流&#xff1b;2.有连接通信&#xff1b;3.安全可靠的通信方式&#xff1b;4.机制复杂&#xff0c;网络资源开销大&#xff1b;5.本质只能实现一对一的通信&#xff08;可使用TCP的并发方式实现一对多通信&#xff09;&#xff1b;2.TCP的三次握手与四次挥手…

HTTP请求的执行流程

HTTP请求的执行流程是一个系统化的过程&#xff0c;涉及多个网络协议和交互步骤。以下是完整的流程分解&#xff0c;结合关键技术和逻辑顺序&#xff1a;&#x1f310; 一、连接准备阶段​​URL解析与初始化​​客户端&#xff08;浏览器/应用&#xff09;解析目标URL&#xff…

联想win11笔记本音频失效,显示差号(x)

该博客可以解答 常见问题详情 Win10系统安装更新后右下角声音出现红叉&#xff0c;电脑也没有声音&#xff0c; 通过设备管理器查看“系统设备”发现“音频部分“出现黄色感叹号&#xff0c; 更新驱动、卸载驱动与第三方工具检测安装后重启都不行。 故障原因 应该是用户曾经…

elasticsearch 7.x elasticsearch 使用scroll滚动查询中超时问题案例

一 问题 1.1 问题描述 2025-08-21 16:57:53.646 | WARN ||||||||||||| scheduling-1 | ElasticsearchRestTemplate | Could not clear scroll: Unable to parse response body; nested exception is ElasticsearchStatusException [Unable to parse response body]; nested: …

高并发内存池(1)-定长内存池

高并发内存池&#xff08;1&#xff09;-定长内存池 可以采用两种方式&#xff1a; 方式1&#xff1a; template <size_t N>方式2&#xff1a; template <class T>获取到T对象大小的内存池&#xff0c;更推荐使用方式二&#xff0c;因为可以动态灵活调整类型 需要的…

第三阶段sql server数据-4:数据库脚本生成,备份与还原,分离与附加操作的图文步骤

1_生成数据库脚本&#xff08;1&#xff09;在数据库上右键选择任务&#xff08;2&#xff09;选择生成脚本&#xff08;3&#xff09;选择下一步&#xff0c;如果下次不想显示此页面&#xff0c;可勾选不再显示此页&#xff08;4&#xff09;如果导出全部数据&#xff0c;选择…

【C++闯关笔记】STL:string的学习和使用(万字精讲)

​系列文章目录 第零篇&#xff1a;从C到C入门&#xff1a;C有而C语言没有的基础知识总结-CSDN博客 第一篇&#xff1a;【C闯关笔记】封装①&#xff1a;类与对象-CSDN博客 第二篇&#xff1a;【C闯关笔记】封装②&#xff1a;友元与模板-CSDN博客 第三篇&#xff1a;【C闯…

06 - spring security角色和权限设置

spring security角色和权限设置 文档 00 - spring security框架使用01 - spring security自定义登录页面02 - spring security基于配置文件及内存的账号密码03 - spring security自定义登出页面04 - spring security关闭csrf攻击防御05 - spring security权限控制 角色和权限…

如何实现文档处理全流程自动化?

在处理文本文档、电子邮件、视频音频、社媒帖子等非结构化数据时&#xff0c;我们经常发现这些数据难以用传统的数据库表格进行存储和管理&#xff0c;因为其没有明确的结构和标准化的格式&#xff0c;因此&#xff0c;这类数据处理难度较大&#xff0c;当传统“人眼Excel”模式…

Java Main无法初始化主类的原因与解决方法(VsCode工具)

个人操作 由于上传git将target目录也上传了所以在本地删除target之后再重新同步更新动作然后直接在vscode工具上run本地项目运行报错&#xff0c;报错信息如下 报错信息分析原因1. 工具配置 用 VS Code 的“Run”运行按钮时&#xff0c;是否会自动编译&#xff0c;取决于你的 V…

Azure Kubernetes Service (AKS)

Overview AKS&#xff08;Azure Kubernetes Service&#xff09; 是 Microsoft Azure 提供的一种托管Kubernetes 服务&#xff0c;旨在简化 Kubernetes 集群的部署、管理和操作。轻松运行和扩展基于容器的应用程序&#xff0c;而无需管理 Kubernetes 本身的基础设施。 AKS与 …

基于SpringBoot的校园信息共享系统【2026最新】

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…