Esempio n. 1
0
        public static BoxedValue Box(SuffixString value)
        {
            var box = new BoxedValue();

            box.Clr = value;
            box.Tag = TypeTags.SuffixString;
            return(box);
        }
Esempio n. 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="left"></param>
        /// <param name="right"></param>
        /// <returns></returns>
        public static SuffixString Concat(object left, object right)
        {
            var leftValue  = left.ToString();
            var rightValue = right.ToString();
            var @new       = new SuffixString();

            @new.Length  = leftValue.Length + rightValue.Length;
            @new.Builder = new StringBuilder(leftValue, @new.Length);
            @new.Builder.Append(rightValue);

            return(@new);
        }
Esempio n. 3
0
        /// <summary>
        /// Implements the binary `+` operator.
        /// </summary>
        public static BoxedValue add(BoxedValue l, BoxedValue r)
        {
            if (l.Tag == TypeTags.SuffixString)
            {
                var newString = SuffixString.Concat(
                    l.SuffixString,
                    TypeConverter.ToString(TypeConverter.ToPrimitive(r)));

                return(BoxedValue.Box(newString));
            }

            if (l.Tag == TypeTags.String ||
                r.Tag == TypeTags.String ||
                r.Tag == TypeTags.SuffixString)
            {
                var newString = SuffixString.Concat(
                    TypeConverter.ToString(TypeConverter.ToPrimitive(l)),
                    TypeConverter.ToString(TypeConverter.ToPrimitive(r)));

                return(BoxedValue.Box(newString));
            }

            var lPrim = TypeConverter.ToPrimitive(l);
            var rPrim = TypeConverter.ToPrimitive(r);

            if (lPrim.Tag == TypeTags.SuffixString)
            {
                var newString = SuffixString.Concat(
                    lPrim.SuffixString,
                    TypeConverter.ToString(rPrim));

                return(BoxedValue.Box(newString));
            }

            if (lPrim.Tag == TypeTags.String ||
                rPrim.Tag == TypeTags.String ||
                rPrim.Tag == TypeTags.SuffixString)
            {
                var newString = SuffixString.Concat(
                    TypeConverter.ToString(lPrim),
                    TypeConverter.ToString(rPrim));

                return(BoxedValue.Box(newString));
            }

            return(BoxedValue.Box(TypeConverter.ToNumber(lPrim) + TypeConverter.ToNumber(rPrim)));
        }
Esempio n. 4
0
        /*
         * override x.Finalize() =
         * if x.Parent !== null then
         *  x.Parent.Suffixes <- x.Parent.Suffixes - 1
         *  if x.Suffixes = 0
         *  then x.Builder.Remove(x.Parent.Length, x.Length-x.Parent.Length) |> ignore
         *  else x.Parent.Suffixes <- x.Parent.Suffixes + x.Suffixes
         */

        /// <summary>
        ///
        /// </summary>
        /// <param name="current"></param>
        /// <param name="right"></param>
        /// <returns></returns>
        public static SuffixString Concat(SuffixString current, object right)
        {
            SuffixString  @new;
            StringBuilder builder;

            var value = right.ToString();

            if (current.Length == current.Builder.Length)
            {
                builder = current.Builder.Append(value);
            }
            else
            {
                var newLength = current.Length + value.Length;
                builder = new StringBuilder(current.ToString(), newLength);
                builder.Append(value);
            }

            @new         = new SuffixString();
            @new.Length  = builder.Length;
            @new.Builder = builder;

            return(@new);
        }
Esempio n. 5
0
 public static BoxedValue ToBoxedValue(SuffixString s)
 {
     return(BoxedValue.Box(s));
 }