示例#1
0
        /// <summary>
        /// Returns AInteger or AFloat based on the input number.
        /// If the number can be represented as an integer return AInteger
        /// otherwise return AFloat.
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static AType CreateATypeResult(double number)
        {
            int result;

            if (ConvertDoubleToInteger(number, out result))
            {
                return(AInteger.Create(result));
            }
            return(AFloat.Create(number));
        }
示例#2
0
        private static void PerformIndexAssign(AType target, AType value)
        {
            if (target.Rank > 0)
            {
                for (int i = 0; i < target.Length; i++)
                {
                    PerformIndexAssign(target[i], value.IsArray ? value[i] : value);
                }
            }
            else
            {
                AValue result;

                if (target.Type == value.Type)
                {
                    result = value.Clone().Data;
                }
                else if (target.Type == ATypes.AInteger && value.Type == ATypes.AFloat)
                {
                    int number;
                    if (!value.ConvertToRestrictedWholeNumber(out number))
                    {
                        throw new Error.Type("assign");
                    }

                    result = AInteger.Create(number).Data;
                }
                else if (target.Type == ATypes.AFloat && value.Type == ATypes.AInteger)
                {
                    result = AFloat.Create(value.asInteger).Data;
                }
                else
                {
                    throw new Error.Type("Assign");
                }

                if (target.IsMemoryMappedFile)
                {
                    ((IMapped)target.Data).Update(result);
                }
                else
                {
                    target.Data = result;
                }
            }
        }
示例#3
0
        /// <summary>
        /// AArray generated by type and shape with Reshape dyadic nonscalar function.
        /// If shape list is null, we give back the filler elemenet.
        /// </summary>
        /// <param name="type"></param>
        /// <param name="shape"></param>
        internal static AType FillElement(ATypes type, AType shape = null)
        {
            AType filler = null;

            switch (type)
            {
            case ATypes.ABox:
            case ATypes.AFunc:
                filler = ABox.Create(ANull());
                break;

            case ATypes.AChar:
                filler = AChar.Create(' ');
                break;

            case ATypes.AFloat:
                filler = AFloat.Create(0);
                break;

            case ATypes.AInteger:
                filler = AInteger.Create(0);
                break;

            case ATypes.ASymbol:
                filler = ASymbol.Create("");
                break;

            default:
                throw new NotImplementedException("Invalid use-case");
            }

            if (shape != null)
            {
                return(AplusCore.Runtime.Function.Dyadic.DyadicFunctionInstance.Reshape.Execute(filler, shape));
            }
            else
            {
                return(filler);
            }
        }
示例#4
0
        /// <summary>
        /// Converts AType elements to float
        /// </summary>
        public static AType ConvertToFloat(this AType input)
        {
            if (input.Type != ATypes.AFloat && input.Type != ATypes.AInteger && input.Type != ATypes.AArray)
            {
                throw new Error.Type("Conversion");
            }

            if (input.IsArray)
            {
                for (int i = 0; i < input.Length; i++)
                {
                    input[i] = Utils.ConvertToFloat(input[i]);
                }

                input.Type = ATypes.AFloat;
                return(input);
            }
            else
            {
                return(AFloat.Create(input.asFloat));
            }
        }