예제 #1
0
        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("}");
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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(")");
        }
예제 #6
0
        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(")");
        }
예제 #7
0
        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);
        }