feat(php): 添加标准容器编译时计数生成功能

- 实现了 genStdContainerCount 方法用于生成 C++ 整数字面量
- 支持简单变量表达式的容器大小计算
- 支持数组维度获取的层级大小计算
- 处理标准数组、向量、映射等多种容器类型
- 返回平台特定的整数字面量后缀
- 对非标准容器返回 false 以进行错误处理
pull/1/head
韩天峰 3 months ago
parent 549052df05
commit babbbe2fc5
  1. 64
      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;
}
}

Loading…
Cancel
Save