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()); } }
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()); } }
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()); } }