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
