예제 #1
0
            static void SetCharInChunk(ref object chunk, int index, BlobChar ch)
            {
                AssertChunkObject(chunk);

                if (chunk is string str)
                {
                    if (ch.IsByte)
                    {
                        var chars = BlobChar.ToBlobCharArray(str);
                        chars[index] = ch;
                        chunk        = chars;
                    }
                    else
                    {
                        var chars = str.ToCharArray();
                        chars[index] = ch.AsChar();
                        chunk        = chars;
                    }
                }
                else if (chunk.GetType() == typeof(byte[]))
                {
                    if (ch.IsByte)
                    {
                        ((byte[])chunk)[index] = ch.AsByte();
                    }
                    else
                    {
                        var chars = BlobChar.ToBlobCharArray((byte[])chunk);
                        chars[index] = ch;
                        chunk        = chars;
                    }
                }
                else if (chunk.GetType() == typeof(char[]))
                {
                    if (ch.IsByte)
                    {
                        var chars = BlobChar.ToBlobCharArray((char[])chunk);
                        chars[index] = ch;
                        chunk        = chars;
                    }
                    else
                    {
                        ((char[])chunk)[index] = ch.AsChar();
                    }
                }
                else if (chunk.GetType() == typeof(Blob))
                {
                    ((Blob)chunk)[index] = ch;
                }
                else if (chunk.GetType() == typeof(BlobChar[]))
                {
                    ((BlobChar[])chunk)[index] = ch;
                }
                else
                {
                    throw new ArgumentException(chunk.GetType().ToString());
                }
            }
예제 #2
0
            static string ChunkToString(Encoding encoding, object chunk)
            {
                AssertChunkObject(chunk);

                switch (chunk)
                {
                case string str: return(str);

                case byte[] barr: return(encoding.GetString(barr));

                case Blob b: return(b.ToString(encoding));

                case char[] carr: return(new string(carr));

                case BlobChar[] barr: return(new string(BlobChar.ToCharArray(barr, encoding)));

                default: throw new ArgumentException(chunk.GetType().ToString());
                }
            }
예제 #3
0
            static void ChunkSubstring(Blob target, int start, ref int count, object chunk, out int chunkLength)
            {
                Debug.Assert(start >= 0);
                Debug.Assert(count > 0);
                AssertChunkObject(chunk);

                switch (chunk)
                {
                case string str:
                    chunkLength = str.Length;

                    if (start < str.Length)
                    {
                        int append = Math.Min(str.Length - start, count);
                        target.AddChunk(str.Substring(start, append));
                        count -= append;
                    }

                    break;

                case byte[] barr:
                    chunkLength = barr.Length;

                    if (start < barr.Length)
                    {
                        int append = Math.Min(barr.Length - start, count);
                        var newarr = new byte[append];
                        Array.Copy(barr, start, newarr, 0, append);
                        target.Add(newarr);     // flags must be set
                        count -= append;
                    }

                    break;

                case Blob b:
                    chunkLength = b.Length;
                    b.Substring(target, start, ref count);
                    break;

                case char[] carr:
                    chunkLength = carr.Length;

                    if (start < carr.Length)
                    {
                        int append = Math.Min(carr.Length - start, count);
                        var newarr = new char[append];
                        Array.Copy(carr, start, newarr, 0, append);
                        target.Add(newarr);     // flags must be set
                        count -= append;
                    }
                    break;

                case BlobChar[] barr:
                    chunkLength = barr.Length;

                    if (start < barr.Length)
                    {
                        int append = Math.Min(barr.Length - start, count);
                        var newarr = new BlobChar[append];
                        Array.Copy(barr, start, newarr, 0, append);
                        target.Add(newarr);     // flags must be set
                        count -= append;
                    }
                    break;

                default:
                    throw new ArgumentException(chunk.GetType().ToString());
                }
            }