From babbbe2fc58d83fde1a055f0ab37a691aeb75874 Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Thu, 11 Jun 2026 19:05:46 +0800 Subject: [PATCH] =?UTF-8?q?feat(php):=20=E6=B7=BB=E5=8A=A0=E6=A0=87?= =?UTF-8?q?=E5=87=86=E5=AE=B9=E5=99=A8=E7=BC=96=E8=AF=91=E6=97=B6=E8=AE=A1?= =?UTF-8?q?=E6=95=B0=E7=94=9F=E6=88=90=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现了 genStdContainerCount 方法用于生成 C++ 整数字面量 - 支持简单变量表达式的容器大小计算 - 支持数组维度获取的层级大小计算 - 处理标准数组、向量、映射等多种容器类型 - 返回平台特定的整数字面量后缀 - 对非标准容器返回 false 以进行错误处理 --- src/Php/Parser/StdContainerTrait.php | 64 ++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/Php/Parser/StdContainerTrait.php b/src/Php/Parser/StdContainerTrait.php index 477f0441..fac301a7 100644 --- a/src/Php/Parser/StdContainerTrait.php +++ b/src/Php/Parser/StdContainerTrait.php @@ -756,4 +756,68 @@ trait StdContainerTrait ]); return '// ' . $decl; } + + /** + * Generate compile-time count for std containers. + * Returns the C++ integer literal for the size, or false if not a std container. + */ + protected function genStdContainerCount(NodeAbstract $expr): string|false + { + // Simple variable: $var + if ($this->isVarExpr($expr)) { + $var = $this->parseVariable($expr); + if ($this->isStdArray($var)) { + $info = $this->context->stdArrays[$var]; + $sizes = array_reverse($info['sizes']); + return $sizes[0] . $this->getPlatform()->getIntegerLiteralSuffix(); + } + if ($this->isStdVector($var)) { + $info = $this->context->stdContainers[$var]; + if ($info['size'] !== null) { + return $info['size'] . $this->getPlatform()->getIntegerLiteralSuffix(); + } + return $var . '_ref.size()'; + } + if ($this->isStdContainer($var)) { + return $var . '_ref.size()'; + } + return false; + } + + // ArrayDimFetch: $array[idx1][idx2]... + if ($this->isArrayDimFetch($expr)) { + $tmp = $expr; + $dimLevel = 0; + while ($this->isArrayDimFetch($tmp)) { + $dimLevel++; + $tmp = $tmp->var; + } + if ($this->isVarExpr($tmp)) { + $var = $this->parseVariable($tmp); + if ($this->isStdArray($var)) { + $info = $this->context->stdArrays[$var]; + $outerSizes = array_reverse($info['sizes']); + if ($dimLevel < count($outerSizes)) { + return $outerSizes[$dimLevel] . $this->getPlatform()->getIntegerLiteralSuffix(); + } + } + } + + if ($this->isVarExpr($tmp)) { + $var = $this->parseVariable($tmp); + if ($this->isStdVector($var)) { + $info = $this->context->stdContainers[$var]; + if ($info['size'] !== null) { + return $info['size'] . $this->getPlatform()->getIntegerLiteralSuffix(); + } + return $var . '_ref.size()'; + } + if ($this->isStdMap($var) || $this->isStdUnorderedMap($var)) { + return $var . '_ref.size()'; + } + } + } + + return false; + } }