chunked_input_stream.cpp 870 B

12345678910111213141516171819202122232425262728293031323334
  1. #include "chunked_input_stream.h"
  2. namespace NYT {
  3. ////////////////////////////////////////////////////////////////////////////////
  4. TChunkedInputStream::TChunkedInputStream(std::vector<TSharedRef> blocks)
  5. : Blocks_(std::move(blocks))
  6. { }
  7. size_t TChunkedInputStream::DoNext(const void** ptr, size_t len)
  8. {
  9. SkipCompletedBlocks();
  10. if (Index_ == Blocks_.size()) {
  11. *ptr = nullptr;
  12. return 0;
  13. }
  14. *ptr = Blocks_[Index_].Begin() + Position_;
  15. size_t toSkip = std::min(Blocks_[Index_].Size() - Position_, len);
  16. Position_ += toSkip;
  17. return toSkip;
  18. }
  19. void TChunkedInputStream::SkipCompletedBlocks()
  20. {
  21. while (Index_ < Blocks_.size() && Position_ == Blocks_[Index_].Size()) {
  22. Index_ += 1;
  23. Position_ = 0;
  24. }
  25. }
  26. ////////////////////////////////////////////////////////////////////////////////
  27. } // namespace NYT