size_t read()

in src/afs.cc [342:403]


	size_t read(size_t n, void* output)
	{
#ifdef AFS_VERBOSE
		const char* tag = "read";
#endif
		P("%s: %s: %s: before: (%" PRIsize ":%" PRIsize ") %" PRIsize,
		  Tag,
		  tag_,
		  tag,
		  data_->head,
		  data_->tail,
		  n);
		size_t readSize = 0;
		const auto input = address_;
		if (data_->head > data_->tail)
		{
			const auto firstHalfReadSize = std::min(n, data_->total - data_->head);
			P("%s: %s: %s: first half: (%" PRIsize ":%" PRIsize ") %" PRIsize
			  ":%" PRIsize,
			  Tag,
			  tag_,
			  tag,
			  data_->head,
			  data_->tail,
			  n,
			  firstHalfReadSize);
			memcpy(output, input + data_->head, firstHalfReadSize);
			data_->head = (data_->head + firstHalfReadSize) % data_->total;
			n -= firstHalfReadSize;
			readSize += firstHalfReadSize;
		}
		if (n > 0 && data_->head != data_->tail)
		{
			const auto lastHalfReadSize = std::min(n, data_->tail - data_->head);
			P("%s: %s: %s: last half: (%" PRIsize ":%" PRIsize ") %" PRIsize ":%" PRIsize,
			  Tag,
			  tag_,
			  tag,
			  data_->head,
			  data_->tail,
			  n,
			  lastHalfReadSize);
			memcpy(static_cast<uint8_t*>(output) + readSize,
			       input + data_->head,
			       lastHalfReadSize);
			data_->head += lastHalfReadSize;
			n -= lastHalfReadSize;
			readSize += lastHalfReadSize;
		}
		P("%s: %s: %s: after: (%" PRIsize ":%" PRIsize ") %" PRIsize ":%" PRIsize
		  " [%s] [%s]",
		  Tag,
		  tag_,
		  tag,
		  data_->head,
		  data_->tail,
		  n,
		  readSize,
		  arrow::HexEncode(reinterpret_cast<const uint8_t*>(output), readSize).c_str(),
		  arrow::HexEncode(reinterpret_cast<const uint8_t*>(input), readSize).c_str());
		return readSize;
	}