private bool TryAddComponent(ValueString item, ref ValueString all, ref int nextStart)
        {
            if (item._length == 0)
            {
                return(true);
            }
            if (all._string == null)
            {
                nextStart   = item._start;
                all._start  = item._start;
                all._string = item._string;
            }
            else
            {
                if (!object.ReferenceEquals(item._string, all._string))
                {
                    return(false);
                }
                if (item._start != nextStart)
                {
                    return(false);
                }
            }
            all._length += item._length;

            nextStart += item._length;
            return(true);
        }
        public unsafe void EnsureSpace(int length)
        {
            if (used + length > str.Length)
            {
                int newSize;
                checked
                {
                    var minimumNewSize = length + used;
                    do
                    {
                        newSize = used * 2;
                    }while (newSize < minimumNewSize);
                }

                var newStr = ValueString.AllocateString(newSize);

                fixed(char *dest = newStr)
                fixed(char *source = str)
                {
                    Buffer.MemoryCopy((void *)source, dest, newStr.Length * 2, used * 2);
                }

                str = newStr;
            }
        }
예제 #3
0
 public void EnsureSpace(int length)
 {
     if (used + length > str.Length)
     {
         str  = ValueString.AllocateString(Math.Max(length, blockSize));
         used = 0;
     }
 }
        public unsafe ValueString Concatenate(ValueString vs1, ValueString vs2)
        {
            EnsureSpace(vs1.Length + vs2.Length);
            var m = used;

            CreateValueString(vs1);
            CreateValueString(vs2);
            return(new ValueString(str, m, vs1._length + vs2._length));
        }
예제 #5
0
        public static void Release(StringBuilder sb)
        {
            var u = _unusedStringBuilders;

            if (u != null && u.Count < 4 && ValueString.ShouldKeepReleasedStringBuilder(sb))
            {
                sb.Length = 0;
                u.Add(sb);
            }
        }
예제 #6
0
        public static string SubstringCached(this ValueString str, int startIndex, int length)
        {
            var reader = valueStringReader ?? (valueStringReader = new ValueStringReader());

            reader.ValueString = str;
            var result = reader.SubstringCached(startIndex, length);

            reader.ValueString._string = null;
            return(result);
        }
예제 #7
0
        public static void WriteValueString(this TextWriter writer, ValueString str)
        {
            var start = str._start;
            var end   = start + str._length;
            var text  = str._string;

            for (int i = start; i < end; i++)
            {
                writer.Write(text[i]);
            }
        }
예제 #8
0
        public unsafe ValueString Concatenate(ValueString vs1, ValueString vs2)
        {
            if (object.ReferenceEquals(vs1._string, vs2._string) && vs1._start + vs1._length == vs2._start)
            {
                return(new ValueString(vs1._string, vs1._start, vs1._length + vs2._length));
            }
            EnsureSpace(vs1.Length + vs2.Length);
            var m = used;

            CreateValueString(vs1);
            CreateValueString(vs2);
            return(new ValueString(str, m, vs1._length + vs2._length));
        }
        private bool IsAllFromSameString(List <ValueString> strings, out ValueString all)
        {
            all = default(ValueString);
            int nextStart = -1;

            foreach (var item in strings)
            {
                if (!TryAddComponent(item, ref all, ref nextStart))
                {
                    return(false);
                }
            }
            return(true);
        }
예제 #10
0
        public unsafe ValueString CreateValueString(ValueString vs)
        {
            EnsureSpace(vs._length);

            fixed(char *dest = str)
            {
                var destx  = dest + used;
                var offset = used;

                fixed(char *source = vs._string)
                {
#if NET35
                    ValueString.CopyChars(source + vs._start, destx, vs._length);
#else
                    Buffer.MemoryCopy((void *)(source + vs._start), destx, vs._length * 2, vs._length * 2);
#endif
                }

                used += vs._length;
                return(new ValueString(str, offset, vs._length));
            }
        }
        public unsafe ValueString CreateValueString(char[] arr, int start, int length)
        {
            if (length == 0)
            {
                return(ValueString.Empty);
            }
            if (start + length > arr.Length)
            {
                throw new ArgumentException();
            }
            EnsureSpace(length);
            fixed(char *ptr = str)
            {
                fixed(char *src = arr)
                {
                    ValueString.CopyChars(ptr + used, src + start, length);
                    var offset = used;

                    used += length;
                    return(new ValueString(str, offset, length));
                }
            }
        }
예제 #12
0
 public static StringBuilder AppendValueString(this StringBuilder sb, ValueString str, int start, int count)
 {
     return(sb.Append(str._string, str._start + start, count));
 }
예제 #13
0
 public static StringBuilder AppendValueString(this StringBuilder sb, ValueString str)
 {
     return(sb.AppendValueString(str._string, str._start, str._length));
 }
예제 #14
0
 public void AppendValueString(ValueString str)
 {
     ValueStringExtensions.AppendValueString(_sb, str);
 }
예제 #15
0
 public static string SubstringCached(this ValueString str, int startIndex)
 {
     return(str.SubstringCached(startIndex, str.Length - startIndex));
 }
 public MultiValueStringBuilder(int blockSize)
 {
     this.blockSize = blockSize;
     this.str       = ValueString.AllocateString(blockSize);
 }
예제 #17
0
 public static void WriteValueStringLine(this TextWriter writer, ValueString str)
 {
     writer.WriteValueString(str);
     writer.WriteLine();
 }
예제 #18
0
 public static string SubstringCached(this ValueString str)
 {
     return(str.SubstringCached(0, str.Length));
 }