451 lines
16 KiB
Python
451 lines
16 KiB
Python
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_node(node 必须是 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_node(node 必须是 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 的子链表中摘除 node(O(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) 追加仅需 head(append)。
|
||
# ============================================================
|
||
@t.NoVTable
|
||
class SListNode:
|
||
Next: "SListNode" | t.CPtr # 下一个节点
|
||
|
||
def append(self, node: "SListNode" | t.CPtr) -> "SListNode" | t.CPtr:
|
||
"""将 node 追加到链表末尾(O(n)),返回 self(head)。
|
||
|
||
若 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:
|
||
"""从链表中移除 node(O(n)),返回新的 head(self)。
|
||
|
||
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|CPtr),GSListNode[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,则获得自己的 vtable(offset 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
|