public string Dump(int indentStep = 2, int indentStart = 0)
{
var kind = ValueKind;
string indent = new string(' ', indentStart);
string largeIndent = new string(' ', indentStart + indentStep);
//組み込み型
if (new QiValueKind[] { QiValueKind.QiInt, QiValueKind.QiFloat, QiValueKind.QiString }.Contains(kind))
{
return indent + kind.ToString() + ":" + Value.ToString();
}
if (kind == QiValueKind.QiDynamic)
{
return indent + "Dynamic\n" + GetDynamic().Dump(indentStep, indentStart + indentStep);
}
//メタオブジェクトを吐く(通常使われない)
if (kind == QiValueKind.QiObject)
{
return indent + "Object\n" + GetObject().MetaObject.Dump(indentStep, indentStart + indentStep);
}
//リスト/タプルは要素別に表示するので作業が一部似てる
if (kind == QiValueKind.QiList || kind == QiValueKind.QiTuple)
{
int c = Count;
var result = new StringBuilder(indent);
string typeinfo = (kind == QiValueKind.QiList) ?
$"List[{c}]:\n" :
$"Tuple[{c}]:\n";
result.Append(typeinfo);
for (int i = 0; i < c; i++)
{
result.Append(this[i].Dump(indentStep, indentStart + indentStep) + "\n");
}
return result.ToString();
}
if (kind == QiValueKind.QiMap)
{
var pairs = MapItems.ToArray();
var result = new StringBuilder();
result.Append(
indent +
$"Map<key:{GetQiType().GetMapKeyType().TypeKind}, " +
$"value:{GetQiType().GetMapValueType().TypeKind}>[{pairs.Length}]\n"
);
foreach(var p in pairs)
{
result.Append(largeIndent + "Key:\n" + p.Key.Dump(indentStep, indentStart + indentStep * 2) + "\n");
result.Append(largeIndent + "Value:\n" + p.Value.Dump(indentStep, indentStart + indentStep * 2) + "\n");
}
return result.ToString();
}
//ポインタとかバイナリは適切な表示法が特に無いので種類名だけ表示
return indent + kind.ToString();
}