public override void WriteToWithCast(CodeWriter writer, CppTypeName cast) { if (cast == null || cast == EocDataTypes.Auto || cast == EocDataTypes.Any) { cast = GetResultType(); } var resultType = cast; CppTypeName elemType; if (cast == EocDataTypes.Bin) { elemType = EocDataTypes.Byte; } else if (cast.Name == "e::system::array") { elemType = resultType.TypeParam[0]; } else { throw new Exception("无效数组类型"); } writer.Write(resultType.ToString()); writer.Write(" {"); for (int i = 0; i < Item.Count; i++) { var item = Item[i]; if (i != 0) { writer.Write(", "); } item.WriteToWithCast(writer, elemType); } writer.Write("}"); }
public override bool TryGetConstValueWithCast(CppTypeName cast, out object value) { var resultType = cast; CppTypeName elemType; if (cast == EocDataTypes.Bin) { elemType = EocDataTypes.Byte; } else if (cast.Name == "e::system::array") { elemType = resultType.TypeParam[0]; } else { value = null; return(false); } var values = new object[Item.Count]; for (int i = 0; i < Item.Count; i++) { if (!Item[i].TryGetConstValueWithCast(elemType, out values[i])) { value = null; return(false); } } value = values; return(true); }
public virtual bool TryGetConstValueWithCast(CppTypeName cast, out object value) { if (!TryGetConstValue(out value)) { return(false); } var type = ProjectConverter.GetConstValueType(value); if (type == cast) { return(true); } if (P.IsArithmeticType(type) && P.IsArithmeticType(cast)) { var NumberConverter = new Dictionary <CppTypeName, Func <object, object> > { { ProjectConverter.CppTypeName_Byte, x => Convert.ToByte(x) }, { ProjectConverter.CppTypeName_Short, x => Convert.ToInt16(x) }, { ProjectConverter.CppTypeName_Int, x => Convert.ToInt32(x) }, { ProjectConverter.CppTypeName_Long, x => Convert.ToInt64(x) }, { ProjectConverter.CppTypeName_Float, x => Convert.ToSingle(x) }, { ProjectConverter.CppTypeName_Double, x => Convert.ToDouble(x) }, }; if (NumberConverter.TryGetValue(cast, out var converter)) { value = converter(value); return(true); } } return(false); }
public virtual bool TryGetConstValueWithCast(CppTypeName cast, out object value) { if (!TryGetConstValue(out value)) { return(false); } var type = ProjectConverter.GetConstValueType(value); if (type == cast) { return(true); //FIXME 类型自动转换 } return(false); }
public virtual void WriteToWithCast(CodeWriter writer, CppTypeName cast) { var exprType = GetResultType(); if (cast == null || cast == ProjectConverter.CppTypeName_SkipCheck || cast == exprType) { WriteTo(writer); return; } writer.Write("e::system::cast<"); writer.Write(cast.ToString()); writer.Write(">("); WriteTo(writer); writer.Write(")"); }
public virtual void WriteToWithCast(CodeWriter writer, CppTypeName cast) { var exprType = GetResultType(); if (cast == null || cast == EocDataTypes.Auto || cast == exprType) { WriteTo(writer); return; } writer.Write("e::system::cast<"); writer.Write(cast.ToString()); writer.Write(">("); WriteTo(writer); writer.Write(")"); }
public override void WriteTo(CodeWriter writer) { if (Mask) { writer.AddCommentLine(CommentOnStart); using (writer.NewBlock()) { Block.WriteTo(writer); } writer.AddCommentLine(CommentOnEnd); return; } var hasVar = Var != null; var varPrefix = C.AllocTempVar(); var varForCount = $"{varPrefix}_count"; var varForIndex = $"{varPrefix}_index"; var typeName = $"decltype({varForCount})"; CppTypeName expectedType = null; writer.AddCommentLine(CommentOnStart); writer.NewLine(); if (hasVar) { expectedType = Var.GetResultType(); typeName = expectedType.ToString(); writer.Write(typeName); writer.Write(" "); } else { writer.Write("auto "); } writer.Write(varForCount); writer.Write(" = "); Count.WriteToWithCast(writer, expectedType); writer.Write(";"); writer.NewLine(); writer.Write(typeName); writer.Write(" "); writer.Write(varForIndex); writer.Write(" = 1"); writer.Write(";"); writer.NewLine(); writer.Write("for ("); if (hasVar) { C.WriteLetExpression(writer, Var, () => { writer.Write(varForIndex); }); } writer.Write("; "); writer.Write(varForIndex); writer.Write(" <= "); writer.Write(varForCount); writer.Write("; "); if (hasVar) { C.WriteLetExpression(writer, Var, () => { writer.Write("++"); writer.Write(varForIndex); }); } else { writer.Write(varForIndex); writer.Write("++"); } writer.Write(")"); using (writer.NewBlock()) { Block.WriteTo(writer); } writer.AddCommentLine(CommentOnEnd); }