Files
TransPyC/includes/_variant.py
2026-07-18 19:25:40 +08:00

65 lines
1.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import t, c
from stdint import *
# Variant 类型标签 (固定枚举 + 自定义 PTR)
VARIANT_NONE: t.CDefine = 0 # 无类型/空值
VARIANT_INT: t.CDefine = 1 # int (i64)
VARIANT_FLOAT: t.CDefine = 2 # float (f32)
VARIANT_DOUBLE: t.CDefine = 3 # double (f64)
VARIANT_STR: t.CDefine = 4 # str (i8*)
VARIANT_DICT: t.CDefine = 5 # dict*
VARIANT_LIST: t.CDefine = 6 # list*
VARIANT_BOOL: t.CDefine = 7 # bool (i1/i32)
VARIANT_PTR: t.CDefine = 8 # 自定义指针类型
class Variant:
"""通用变体类型,存储类型标签 + 无类型指针。
用于 dict/list 的万能对象存储,支持嵌套和 JSON 序列化。
用法:
v: Variant = Variant(VARIANT_INT, t.CNeedPtr(42))
v2: Variant = Variant(VARIANT_STR, t.CNeedPtr("hello"))
# 获取值
ptr: t.CPtr = v.ptr
i: int = c.Deref(ptr)
"""
vtype: t.CInt
ptr: t.CPtr
def __init__(self, vtype: t.CInt, val: t.CNeedPtr):
"""构造 Variant。
val 使用 t.CNeedPtr 自动取地址(非指针值自动 alloca+store
注意: val 的生命周期由调用者管理Variant 仅存储指针。
"""
self.vtype = vtype
self.ptr = val
def is_none(self) -> t.CInt:
return self.vtype == VARIANT_NONE
def is_int(self) -> t.CInt:
return self.vtype == VARIANT_INT
def is_float(self) -> t.CInt:
return self.vtype == VARIANT_FLOAT
def is_double(self) -> t.CInt:
return self.vtype == VARIANT_DOUBLE
def is_str(self) -> t.CInt:
return self.vtype == VARIANT_STR
def is_dict(self) -> t.CInt:
return self.vtype == VARIANT_DICT
def is_list(self) -> t.CInt:
return self.vtype == VARIANT_LIST
def is_bool(self) -> t.CInt:
return self.vtype == VARIANT_BOOL
def is_ptr(self) -> t.CInt:
return self.vtype == VARIANT_PTR