size_t write()

in src/afs.cc [261:339]


	size_t write(const void* data, size_t n)
	{
#ifdef AFS_VERBOSE
		const char* tag = "write";
#endif
		P("%s: %s: %s: before: (%" PRIsize ":%" PRIsize ") %" PRIsize,
		  Tag,
		  tag_,
		  tag,
		  data_->head,
		  data_->tail,
		  n);
		if (rest_size() == 0)
		{
			P("%s: %s: %s: after: no space: (%" PRIsize ":%" PRIsize ") %" PRIsize ":0",
			  Tag,
			  tag_,
			  tag,
			  data_->head,
			  data_->tail,
			  n);
			return 0;
		}

		size_t writtenSize = 0;
		auto output = address_;
		if (data_->head <= data_->tail)
		{
			auto restSize = data_->total - data_->tail;
			if (data_->head == 0)
			{
				restSize--;
			}
			const auto firstHalfWriteSize = std::min(n, restSize);
			P("%s: %s: %s: first half: (%" PRIsize ":%" PRIsize ") %" PRIsize
			  ":%" PRIsize,
			  Tag,
			  tag_,
			  tag,
			  data_->head,
			  data_->tail,
			  n,
			  firstHalfWriteSize);
			memcpy(output + data_->tail, data, firstHalfWriteSize);
			data_->tail = (data_->tail + firstHalfWriteSize) % data_->total;
			n -= firstHalfWriteSize;
			writtenSize += firstHalfWriteSize;
		}
		if (n > 0 && rest_size() > 0)
		{
			const auto lastHalfWriteSize = std::min(n, data_->head - data_->tail - 1);
			P("%s: %s: %s: last half: (%" PRIsize ":%" PRIsize ") %" PRIsize ":%" PRIsize,
			  Tag,
			  tag_,
			  tag,
			  data_->head,
			  data_->tail,
			  n,
			  lastHalfWriteSize);
			memcpy(output + data_->tail,
			       static_cast<const uint8_t*>(data) + writtenSize,
			       lastHalfWriteSize);
			data_->tail += lastHalfWriteSize;
			n -= lastHalfWriteSize;
			writtenSize += lastHalfWriteSize;
		}
		P("%s: %s: %s: after: (%" PRIsize ":%" PRIsize ") %" PRIsize ":%" PRIsize
		  " [%s] [%s]",
		  Tag,
		  tag_,
		  tag,
		  data_->head,
		  data_->tail,
		  n,
		  writtenSize,
		  arrow::HexEncode(reinterpret_cast<const uint8_t*>(data), writtenSize).c_str(),
		  arrow::HexEncode(reinterpret_cast<uint8_t*>(output), writtenSize).c_str());
		return writtenSize;
	}