snapshot before regression test

This commit is contained in:
t
2026-07-18 19:25:40 +08:00
commit 796222a300
2295 changed files with 206453 additions and 0 deletions

450
includes/linkedlist.py Normal file
View File

@@ -0,0 +1,450 @@
import t, c
from stdint import *
# ============================================================
# LinkedNode: 非多态继承基类(@t.NoVTable
#
# 子类继承此类即"启用"标准链表/树形结构能力:
# - 双向兄弟链表next/prev→ O(1) 删除
# - 父子树结构child/last_child/parent→ O(1) 追加子节点
# - 子节点计数child_count
#
# 字段展平嵌入子类,无 vtable 开销(对应 C++ 非多态继承)。
# OOP 方法通过 _generate_inherited_method_wrappers 自动生成子类包装
# self bitcast 为父类指针后调用),子类可直接调用继承的方法。
#
# 用法:
# class MyNode(LinkedNode):
# value: t.CInt
# root: MyNode = MyNode()
# child: MyNode = MyNode()
# root.append(child) # OOP 调用self = root
# child.detach() # 从兄弟链摘除(分离自己)
# ============================================================
@t.NoVTable
class LinkedNode:
next: "LinkedNode" | t.CPtr # 下一个兄弟节点
prev: "LinkedNode" | t.CPtr # 上一个兄弟节点双向链表O(1) 删除)
child: "LinkedNode" | t.CPtr # 第一个子节点
last_child: "LinkedNode" | t.CPtr # 最后一个子节点O(1) 追加)
parent: "LinkedNode" | t.CPtr # 父节点
child_count: t.CSizeT # 子节点数
def append(self, node: "LinkedNode" | t.CPtr):
"""将 node 追加为 self 的最后一个子节点O(1))。
若 node 已在某链表中,调用方应先 node.detach() 再 append。
"""
if self is None or node is None: return
node.parent = self
node.next = None
node.prev = self.last_child
if self.child is None:
self.child = node
else:
self.last_child.next = node
self.last_child = node
self.child_count += 1
def prepend(self, node: "LinkedNode" | t.CPtr):
"""将 node 插入为 self 的第一个子节点O(1)"""
if self is None or node is None: return
node.parent = self
node.prev = None
node.next = self.child
if self.child is not None:
self.child.prev = node
else:
self.last_child = node
self.child = node
self.child_count += 1
def insert_before(self, node: "LinkedNode" | t.CPtr,
new_node: "LinkedNode" | t.CPtr):
"""在 node 之前插入 new_nodenode 必须是 self 的子节点O(1)"""
if self is None or node is None or new_node is None: return
new_node.parent = self
new_node.prev = node.prev
new_node.next = node
if node.prev is not None:
node.prev.next = new_node
else:
self.child = new_node
node.prev = new_node
self.child_count += 1
def insert_after(self, node: "LinkedNode" | t.CPtr,
new_node: "LinkedNode" | t.CPtr):
"""在 node 之后插入 new_nodenode 必须是 self 的子节点O(1)"""
if self is None or node is None or new_node is None: return
new_node.parent = self
new_node.prev = node
new_node.next = node.next
if node.next is not None:
node.next.prev = new_node
else:
self.last_child = new_node
node.next = new_node
self.child_count += 1
def remove_child(self, node: "LinkedNode" | t.CPtr):
"""从 self 的子链表中摘除 nodeO(1)。node 必须是 self 的直接子节点。"""
if self is None or node is None: return
# 修复 prev.next
if node.prev is not None:
node.prev.next = node.next
else:
self.child = node.next
# 修复 next.prev
if node.next is not None:
node.next.prev = node.prev
else:
self.last_child = node.prev
# 清除 node 的兄弟/父链接
node.next = None
node.prev = None
node.parent = None
if self.child_count > 0:
self.child_count -= 1
def detach(self):
"""将 self 从其所在兄弟链表中摘除O(1))。
调用后 self 的 next/prev/parent 被清空child 链不受影响。
"""
if self is None: return
# 修复 prev.next
if self.prev is not None:
self.prev.next = self.next
elif self.parent is not None:
self.parent.child = self.next
# 修复 next.prev
if self.next is not None:
self.next.prev = self.prev
elif self.parent is not None:
self.parent.last_child = self.prev
# 递减父节点计数
if self.parent is not None:
if self.parent.child_count > 0:
self.parent.child_count -= 1
# 清除 self 链接
self.next = None
self.prev = None
self.parent = None
def unlink(self):
"""断开 self 的所有连接(兄弟 + 父子),不递归处理子节点。
调用后 self 成为孤立节点,但其 child 链仍指向原子节点
(子节点的 parent 仍指向 self。若需完全隔离调用方应
先逐个 self.remove_child 子节点。
"""
if self is None: return
# 先从兄弟链摘除
self.detach()
# 再断开父子链接
self.child = None
self.last_child = None
self.child_count = 0
def has_children(self) -> t.CInt:
"""返回 1 若有子节点,否则 0"""
if self is None: return 0
if self.child is not None: return 1
return 0
def child_at(self, index: t.CSizeT) -> "LinkedNode" | t.CPtr:
"""返回第 index 个子节点O(n),从 0 开始),越界返回 None"""
if self is None: return None
cur: "LinkedNode" | t.CPtr = self.child
i: t.CSizeT = 0
while cur is not None:
if i == index: return cur
i += 1
cur = cur.next
return None
def count_children(self) -> t.CSizeT:
"""遍历计算子节点数O(n)),用于校验 child_count"""
if self is None: return 0
n: t.CSizeT = 0
cur: "LinkedNode" | t.CPtr = self.child
while cur is not None:
n += 1
cur = cur.next
return n
def first_sibling(self) -> "LinkedNode" | t.CPtr:
"""返回兄弟链表的头节点(沿 prev 回溯)"""
if self is None: return None
cur: "LinkedNode" | t.CPtr = self
while cur.prev is not None:
cur = cur.prev
return cur
def last_sibling(self) -> "LinkedNode" | t.CPtr:
"""返回兄弟链表的尾节点(沿 next 前进)"""
if self is None: return None
cur: "LinkedNode" | t.CPtr = self
while cur.next is not None:
cur = cur.next
return cur
# ============================================================
# SListNode: 单向链表节点(@t.NoVTable
#
# 轻量级单向链表,仅 Next 指针,无 prev/parent/child。
# 适用于队列/栈/简单链场景(如 llvmlite 的 Param/BasicBlock/Function/Line/Value
# O(1) 追加需调用方维护 tail 指针append_after
# O(n) 追加仅需 headappend
# ============================================================
@t.NoVTable
class SListNode:
Next: "SListNode" | t.CPtr # 下一个节点
def append(self, node: "SListNode" | t.CPtr) -> "SListNode" | t.CPtr:
"""将 node 追加到链表末尾O(n)),返回 selfhead
若 self 为 None应直接使用 node 作为 head调用方需自行处理
"""
if self is None: return node
if node is None: return self
node.Next = None
cur: "SListNode" | t.CPtr = self
while cur.Next is not None:
cur = cur.Next
cur.Next = node
return self
def append_after(self, node: "SListNode" | t.CPtr) -> "SListNode" | t.CPtr:
"""将 node 追加到 self 之后O(1)),返回新的 tail即 node
调用方需自行维护 head 指针。若 self 为 None返回 node 作为首节点。
"""
if node is None: return self
node.Next = None
if self is not None:
self.Next = node
return node
def count(self) -> t.CSizeT:
"""遍历计算链表长度O(n)"""
if self is None: return 0
n: t.CSizeT = 0
cur: "SListNode" | t.CPtr = self
while cur is not None:
n += 1
cur = cur.Next
return n
def at(self, index: t.CSizeT) -> "SListNode" | t.CPtr:
"""返回第 index 个节点O(n),从 0 开始),越界返回 None"""
if self is None: return None
cur: "SListNode" | t.CPtr = self
i: t.CSizeT = 0
while cur is not None:
if i == index: return cur
i += 1
cur = cur.Next
return None
def remove(self, node: "SListNode" | t.CPtr) -> "SListNode" | t.CPtr:
"""从链表中移除 nodeO(n)),返回新的 headself
node 的 Next 被清空。若 node 是 head返回 head.Next。
"""
if self is None or node is None: return self
if self is node:
new_head: "SListNode" | t.CPtr = self.Next
self.Next = None
return new_head
cur: "SListNode" | t.CPtr = self
while cur.Next is not None:
if cur.Next is node:
cur.Next = node.Next
node.Next = None
break
cur = cur.Next
return self
# ============================================================
# GSListNode[T]: 泛型单向链表节点(@t.NoVTable + PEP 695 泛型)
#
# 相比 SListNode非泛型Next: SListNode|CPtrGSListNode[T] 的 Next
# 字段类型为 T|CPtr特化后直接是具体节点类型无需向下转型。
#
# 递归泛型用法(子类继承自身特化版本):
# class GNode(GSListNode[GNode]):
# value: t.CInt
# # 此时 GNode.Next: GNode|CPtr强类型无转型
#
# 技术验证点:
# 1. 递归泛型 class GNode(GSListNode[GNode])
# 2. @t.NoVTable + 泛型组合
# 3. 泛型类作字段类型 list: GSList[GNode]
# 4. 泛型方法继承GSList[T].append 在特化后可用)
# ============================================================
@t.NoVTable
class GSListNode[T]:
Next: T | t.CPtr
# ============================================================
# GSList[T]: 泛型单向链表容器(@t.NoVTable + PEP 695 泛型)
#
# 持有 Head/Tail/Count提供 O(1) append 和 O(n) at。
# 节点类型 T 必须继承 GSListNode[T](以获得 Next 字段)。
#
# 用法:
# list: GSList[GNode] | t.CPtr = GSList[GNode]()
# list.append(node) # 方法调用,非全局函数
# ============================================================
@t.NoVTable
class GSList[T]:
Head: T | t.CPtr
Tail: T | t.CPtr
Count: t.CSizeT
def __init__(self):
self.Head = None
self.Tail = None
self.Count = 0
def append(self, node: T):
"""将 node 追加到链表末尾O(1)"""
if node is None: return
node.Next = None
if self.Head is None:
self.Head = node
else:
self.Tail.Next = node
self.Tail = node
self.Count += 1
def count(self) -> t.CSizeT:
"""返回节点数O(1)"""
return self.Count
def at(self, index: t.CSizeT) -> T | t.CPtr:
"""返回第 index 个节点O(n),从 0 开始),越界返回 None"""
if self.Head is None: return None
cur: T | t.CPtr = self.Head
i: t.CSizeT = 0
while cur is not None:
if i == index: return cur
i += 1
cur = cur.Next
return None
# ============================================================
# GTreeNode[T]: 泛型树节点(@t.NoVTable + PEP 695 泛型)
#
# 强类型版本的 LinkedNode所有指针字段类型为 T|t.CPtr。
# 提供:
# - 双向兄弟链表Next/Prev→ O(1) 删除
# - 父子树结构Child/LastChild/Parent→ O(1) 追加子节点
# - 子节点计数Count
#
# 递归泛型用法(子类继承自身特化版本):
# @t.CVTable
# class AST(GTreeNode[AST]):
# def kind(self) -> t.CInt:
# return 0
# # 此时 AST.Next/Prev/Child/LastChild/Parent 均为 AST|t.CPtr强类型
#
# 字段展平嵌入子类,无 vtable 开销(对应 C++ 非多态继承)。
# 子类若为 @t.CVTable则获得自己的 vtableoffset 0
# GTreeNode 字段展平在 vtable 之后。
#
# OOP 方法通过 _generate_inherited_method_wrappers 自动生成子类包装
# self bitcast 为父类指针后调用),子类可直接调用继承的方法。
# ============================================================
@t.NoVTable
class GTreeNode[T]:
Next: T | t.CPtr # 下一个兄弟节点
Prev: T | t.CPtr # 上一个兄弟节点双向链表O(1) 删除)
Child: T | t.CPtr # 第一个子节点
LastChild: T | t.CPtr # 最后一个子节点O(1) 追加)
Parent: T | t.CPtr # 父节点
Count: t.CSizeT # 子节点数
def append(self, node: T | t.CPtr):
"""将 node 追加为 self 的最后一个子节点O(1))。
若 node 已在某链表中,调用方应先 node.detach() 再 append。
"""
if self is None or node is None: return
node.Parent = self
node.Next = None
node.Prev = self.LastChild
if self.Child is None:
self.Child = node
else:
self.LastChild.Next = node
self.LastChild = node
self.Count += 1
def prepend(self, node: T | t.CPtr):
"""将 node 插入为 self 的第一个子节点O(1)"""
if self is None or node is None: return
node.Parent = self
node.Prev = None
node.Next = self.Child
if self.Child is not None:
self.Child.Prev = node
else:
self.LastChild = node
self.Child = node
self.Count += 1
def detach(self):
"""将 self 从其所在兄弟链表中摘除O(1))。
调用后 self 的 Next/Prev/Parent 被清空Child 链不受影响。
"""
if self is None: return
if self.Prev is not None:
self.Prev.Next = self.Next
elif self.Parent is not None:
self.Parent.Child = self.Next
if self.Next is not None:
self.Next.Prev = self.Prev
elif self.Parent is not None:
self.Parent.LastChild = self.Prev
if self.Parent is not None:
if self.Parent.Count > 0:
self.Parent.Count -= 1
self.Next = None
self.Prev = None
self.Parent = None
def has_children(self) -> t.CInt:
"""返回 1 若有子节点,否则 0"""
if self is None: return 0
if self.Child is not None: return 1
return 0
def child_at(self, index: t.CSizeT) -> T | t.CPtr:
"""返回第 index 个子节点O(n),从 0 开始),越界返回 None"""
if self is None: return None
cur: T | t.CPtr = self.Child
i: t.CSizeT = 0
while cur is not None:
if i == index: return cur
i += 1
cur = cur.Next
return None
def count_children(self) -> t.CSizeT:
"""遍历计算子节点数O(n)),用于校验 Count"""
if self is None: return 0
n: t.CSizeT = 0
cur: T | t.CPtr = self.Child
while cur is not None:
n += 1
cur = cur.Next
return n