【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.pswp.cn/news/905858.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905858.shtml
英文地址,請注明出處:http://en.pswp.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;任務對象通過 …