size_t IStream::ReadToStream(size_t size, IStream& dest, size_t bufferSize/*=1024*/)const { RETURN_ZERO_IF_FALSE(CanRead() && dest.CanWrite()); if (dest.IsPtrAvailable())//could directly write { dest.ReserveLeftSize(size); byte* buffer = dest.MutablePtr(); MemoryData destBuffer = MemoryData::FromStatic(buffer, size); return ReadDataTo(destBuffer, DataReadingMode::AlwaysCopy); } else { //should use temp buffer size_t count = 0; size_t realBufferSize = Math::Min(LeftLength(), bufferSize, size); MemoryData tempBuffer = MemoryData::Alloc(realBufferSize); do { size_t readSize = Math::Min(size, realBufferSize); tempBuffer.ForceSetSize(readSize); readSize = ReadDataTo(tempBuffer, DataReadingMode::AlwaysCopy); BREAK_IF_ZERO(readSize); tempBuffer.ForceSetSize(readSize); count += dest.WriteData(tempBuffer); tempBuffer.ForceSetSize(realBufferSize); size -= readSize; } while (size > 0); return count; } }
size_t IStream::CopyTo(IStream& dest, size_t bufferSize/*=1024*/)const { RETURN_ZERO_IF_FALSE(CanRead() && dest.CanWrite()); size_t realBufferSize = Math::Min(LeftLength(), bufferSize); size_t count = 0; MemoryData buffer = MemoryData::Alloc(realBufferSize); do { size_t readSize = ReadDataTo(buffer, DataReadingMode::AlwaysCopy); BREAK_IF_ZERO(readSize); buffer.ForceSetSize(readSize); count += dest.WriteData(buffer); buffer.ForceSetSize(realBufferSize); } while (true); return count; }