lab4写不下去了,感觉对代码理不清了,打算重新整理一下。
重点是五个类,(正好对应lab0~lab4)
ByteStream类
这里只展示startcode中类的模样(具体的实现可能各有不同,所以重点看函数的功能,成员变量倒不太需要分析)
ByteStream是一个字节流(An in-memory reliable byte stream)。可读可写,对外提供的接口功能如下:
ByteStream(const size_t capacity)
构造函数,传入的参数是这个字节流的最大容量bool input_ended()
写端使用,当写端需要往ByteStream中写的内容写完之后,调用这个函数通知ByteStream,写端写完啦。bool eof()
读端使用,当读这个ByteStream读到最后没东西可以读了(ByteStream没东西,且写端写完啦),ByteStream.eof就会返回truesize_t write(const std::string &data)
写端使用,往里面写data,返回实际写入的大小std::string read(const size_t len)
读端使用,从ByteStream中读len字节,返回实际读到的字符串size_t bytes_written()
都能使用,返回写端往ByteStream中累计写了多少字节。
StreamReassembler类
流重组器,把输入的零散的子字符串(子字符串开始编号 + 内容),组成一个连续的流(ByteStream)。(Stitching Substrings Into A Byte Stream)
StreamReassembler(const size_t capacity);
构造函数,传入参数为流重组器的容量,也就是其中流ByteStream的容量
void push_substring(const std::string &data, const uint64_t index, const bool eof)
写端使用,往流重组器写入子字符串(开始于index,内容为data,是否是最后一段eof)ByteStream &stream_out()
读端使用,返回组好的ByteStreamsize_t unassembled_bytes()
都能使用,返回还没组好的,暂存在辅助存储的数据大小,按容量的含义来说,unassembled_bytes + ByteStream.size <= capacaityempty() const;
都能使用,true
if no substrings are waiting to be assembled,也就是unassembled_bytes() == 0