示例#1
0
 public void Clear(StringBuffer stringBuffer, ArrayPoolApi_I <char> bufferPool)
 {
     if (stringBuffer.Buffer != null)
     {
         XMemory.ReturnBuffer(bufferPool, stringBuffer.Buffer);
         stringBuffer.Buffer = null;
     }
     stringBuffer.Position = 0;
 }
示例#2
0
文件: BufferApi.cs 项目: E01D/Base
        public char[] RentBuffer(ArrayPoolApi_I <char> bufferPool, int minSize)
        {
            if (bufferPool == null)
            {
                return(new char[minSize]);
            }

            char[] buffer = bufferPool.Rent(minSize);
            return(buffer);
        }
示例#3
0
        public void Append(StringBuffer stringBuffer, ArrayPoolApi_I <char> bufferPool, char value)
        {
            // test if the buffer array is large enough to take the value
            if (stringBuffer.Position == stringBuffer.Buffer.Length)
            {
                EnsureSize(stringBuffer, bufferPool, 1);
            }

            // set value and increment poisition
            stringBuffer.Buffer[stringBuffer.Position++] = value;
        }
示例#4
0
        public void Append(StringBuffer stringBuffer, ArrayPoolApi_I <char> bufferPool, char[] buffer, int startIndex, int count)
        {
            if (stringBuffer.Position + count >= stringBuffer.Buffer.Length)
            {
                EnsureSize(stringBuffer, bufferPool, count);
            }

            Array.Copy(buffer, startIndex, stringBuffer.Buffer, stringBuffer.Position, count);

            stringBuffer.Position += count;
        }
示例#5
0
        public void EnsureSize(StringBuffer stringBuffer, ArrayPoolApi_I <char> bufferPool, int appendLength)
        {
            char[] newBuffer = XMemory.RentBuffer(bufferPool, (stringBuffer.Position + appendLength) * 2);

            if (stringBuffer.Buffer != null)
            {
                Array.Copy(stringBuffer.Buffer, newBuffer, stringBuffer.Position);
                XMemory.ReturnBuffer(bufferPool, stringBuffer.Buffer);
            }

            stringBuffer.Buffer = newBuffer;
        }
示例#6
0
文件: BufferApi.cs 项目: E01D/Base
        public char[] EnsureBufferSize(ArrayPoolApi_I <char> bufferPool, int size, char[] buffer)
        {
            if (bufferPool == null)
            {
                return(new char[size]);
            }

            if (buffer != null)
            {
                bufferPool.Return(buffer);
            }

            return(bufferPool.Rent(size));
        }
示例#7
0
 public static void Append(this StringBuffer stringBuffer, ArrayPoolApi_I <char> bufferPool, char value)
 {
     XStrings.Api.StringBuffers.Append(stringBuffer, bufferPool, value);
 }
示例#8
0
 public static void EnsureSize(this StringBuffer stringBuffer, ArrayPoolApi_I <char> bufferPool, int appendLength)
 {
     XStrings.Api.StringBuffers.EnsureSize(stringBuffer, bufferPool, appendLength);
 }
示例#9
0
 public static void Clear(this StringBuffer stringBuffer, ArrayPoolApi_I <char> bufferPool)
 {
     XStrings.Api.StringBuffers.Clear(stringBuffer, bufferPool);
 }
示例#10
0
 public static void Append(this StringBuffer stringBuffer, ArrayPoolApi_I <char> bufferPool, char[] buffer, int startIndex, int count)
 {
     XStrings.Api.StringBuffers.Append(stringBuffer, bufferPool, buffer, startIndex, count);
 }
示例#11
0
文件: XStrings.cs 项目: E01D/Base
 public static StringBuffer StringBuffer(ArrayPoolApi_I <char> bufferPool, int initialSize)
 {
     return(Api.StringBuffers.StringBuffer(bufferPool, initialSize));
 }
示例#12
0
文件: XMemory.cs 项目: E01D/Base
 public static void ReturnBuffer(ArrayPoolApi_I <char> bufferPool, char[] buffer)
 {
     Api.Buffers.ReturnBuffer(bufferPool, buffer);
 }
示例#13
0
文件: XMemory.cs 项目: E01D/Base
 public static char[] RentBuffer(ArrayPoolApi_I <char> bufferPool, int minSize)
 {
     return(Api.Buffers.RentBuffer(bufferPool, minSize));
 }
示例#14
0
        public void WriteEscapedJavaScriptString(TextWriter writer, string s, char delimiter, bool appendDelimiters,
                                                 bool[] charEscapeFlags, StringEscapeHandling stringEscapeHandling, ArrayPoolApi_I <char> bufferPool, ref char[] writeBuffer)
        {
            // leading delimiter
            if (appendDelimiters)
            {
                writer.Write(delimiter);
            }

            if (!string.IsNullOrEmpty(s))
            {
                int lastWritePosition = FirstCharToEscape(s, charEscapeFlags, stringEscapeHandling);
                if (lastWritePosition == -1)
                {
                    writer.Write(s);
                }
                else
                {
                    if (lastWritePosition != 0)
                    {
                        if (writeBuffer == null || writeBuffer.Length < lastWritePosition)
                        {
                            writeBuffer = XMemory.EnsureBufferSize(bufferPool, lastWritePosition, writeBuffer);
                        }

                        // write unchanged chars at start of text.
                        s.CopyTo(0, writeBuffer, 0, lastWritePosition);
                        writer.Write(writeBuffer, 0, lastWritePosition);
                    }

                    int length;
                    for (int i = lastWritePosition; i < s.Length; i++)
                    {
                        char c = s[i];

                        if (c < charEscapeFlags.Length && !charEscapeFlags[c])
                        {
                            continue;
                        }

                        string escapedValue;

                        switch (c)
                        {
                        case '\t':
                            escapedValue = @"\t";
                            break;

                        case '\n':
                            escapedValue = @"\n";
                            break;

                        case '\r':
                            escapedValue = @"\r";
                            break;

                        case '\f':
                            escapedValue = @"\f";
                            break;

                        case '\b':
                            escapedValue = @"\b";
                            break;

                        case '\\':
                            escapedValue = @"\\";
                            break;

                        case '\u0085':     // Next Line
                            escapedValue = @"\u0085";
                            break;

                        case '\u2028':     // Line Separator
                            escapedValue = @"\u2028";
                            break;

                        case '\u2029':     // Paragraph Separator
                            escapedValue = @"\u2029";
                            break;

                        default:
                            if (c < charEscapeFlags.Length || stringEscapeHandling == StringEscapeHandling.EscapeNonAscii)
                            {
                                if (c == '\'' && stringEscapeHandling != StringEscapeHandling.EscapeHtml)
                                {
                                    escapedValue = @"\'";
                                }
                                else if (c == '"' && stringEscapeHandling != StringEscapeHandling.EscapeHtml)
                                {
                                    escapedValue = @"\""";
                                }
                                else
                                {
                                    if (writeBuffer == null || writeBuffer.Length < UnicodeTextLength)
                                    {
                                        writeBuffer = XMemory.EnsureBufferSize(bufferPool, UnicodeTextLength, writeBuffer);
                                    }

                                    XStrings.ToCharAsUnicode(c, writeBuffer);

                                    // slightly hacky but it saves multiple conditions in if test
                                    escapedValue = EscapedUnicodeText;
                                }
                            }
                            else
                            {
                                escapedValue = null;
                            }
                            break;
                        }

                        if (escapedValue == null)
                        {
                            continue;
                        }

                        bool isEscapedUnicodeText = string.Equals(escapedValue, EscapedUnicodeText);

                        if (i > lastWritePosition)
                        {
                            length = i - lastWritePosition + ((isEscapedUnicodeText) ? UnicodeTextLength : 0);
                            int start = (isEscapedUnicodeText) ? UnicodeTextLength : 0;

                            if (writeBuffer == null || writeBuffer.Length < length)
                            {
                                char[] newBuffer = XMemory.RentBuffer(bufferPool, length);

                                // the unicode text is already in the buffer
                                // copy it over when creating new buffer
                                if (isEscapedUnicodeText)
                                {
                                    XDebug.Assert(writeBuffer != null, "Write buffer should never be null because it is set when the escaped unicode text is encountered.");

                                    Array.Copy(writeBuffer, newBuffer, UnicodeTextLength);
                                }

                                XMemory.ReturnBuffer(bufferPool, writeBuffer);

                                writeBuffer = newBuffer;
                            }

                            s.CopyTo(lastWritePosition, writeBuffer, start, length - start);

                            // write unchanged chars before writing escaped text
                            writer.Write(writeBuffer, start, length - start);
                        }

                        lastWritePosition = i + 1;
                        if (!isEscapedUnicodeText)
                        {
                            writer.Write(escapedValue);
                        }
                        else
                        {
                            writer.Write(writeBuffer, 0, UnicodeTextLength);
                        }
                    }

                    XDebug.Assert(lastWritePosition != 0);
                    length = s.Length - lastWritePosition;
                    if (length > 0)
                    {
                        if (writeBuffer == null || writeBuffer.Length < length)
                        {
                            writeBuffer = XMemory.EnsureBufferSize(bufferPool, length, writeBuffer);
                        }

                        s.CopyTo(lastWritePosition, writeBuffer, 0, length);

                        // write remaining text
                        writer.Write(writeBuffer, 0, length);
                    }
                }
            }

            // trailing delimiter
            if (appendDelimiters)
            {
                writer.Write(delimiter);
            }
        }
示例#15
0
 public StringBuffer StringBuffer(ArrayPoolApi_I <char> bufferPool, int initalSize)
 {
     return(StringBuffer(XMemory.RentBuffer(bufferPool, initalSize)));
 }
示例#16
0
文件: BufferApi.cs 项目: E01D/Base
 public void ReturnBuffer(ArrayPoolApi_I <char> bufferPool, char[] buffer)
 {
     bufferPool?.Return(buffer);
 }
示例#17
0
文件: XMemory.cs 项目: E01D/Base
 public static char[] EnsureBufferSize(ArrayPoolApi_I <char> bufferPool, int size, char[] buffer)
 {
     return(Api.Buffers.EnsureBufferSize(bufferPool, size, buffer));
 }
示例#18
0
 public static void WriteEscapedJavaScriptString(TextWriter writer, string s, char delimiter,
                                                 bool appendDelimiters,
                                                 bool[] charEscapeFlags, StringEscapeHandling stringEscapeHandling, ArrayPoolApi_I <char> bufferPool,
                                                 ref char[] writeBuffer)
 {
     Api.WriteEscapedJavaScriptString(writer, s, delimiter, appendDelimiters, charEscapeFlags,
                                      stringEscapeHandling, bufferPool, ref writeBuffer);
 }