类别:容器 | 组件类型:类型 |
Char_producer<charT>是一个抽象基类;它提供了一个空的虚析构函数和一个纯虚operator()。只能使用char_producer的子类,不能char_producer直接使用。
从派生的类char_producer在rope中定义了计算字符的方法,只要需要这些字符就会延迟计算。与函数对象不同,char_producers 可以存储在rope数据结构中。所有 char producers 都必须派生自单个基类char_producer.
由于性能原因,operator()内部的char_producer被调用来填充一个带有字符序列的缓冲区,而不是一次生成一个字符。其声明为
virtual void operator()(size_t start_pos, size_t len, charT* buffer) = 0;
调用operator()请求len个从start_pos开始的字符存储在buffer中。如果请求第nnchar_producer个位置的字符两次,则必须两次返回相同的字符。(即,
必须表示特定的确定性字符序列。)char_producer以下是如何使用char_producer和延迟求值的示例:它是一个(有待改进的子类的实现),它允许将整个文件视为rope。从rope构建的file_char_prod将包含与构造函数中指定的文件相同的字符序列。文件只会在rope被访问时读取,而不是在rope被构建时读取。
void fail(char* s) { fprintf(stderr, "%s errno = %d\n", s, errno); exit(1); } class file_char_prod : public char_producer<char> { public: FILE* f; file_char_prod(char *file_name) { if (NULL == (f = fopen(file_name, "rb"))) fail("Open failed"); } ~file_char_prod() { fclose(f); } virtual void operator()(size_t start_pos, size_t len, char* buffer) { if (fseek(f, start_pos, SEEK_SET)) fail("Seek failed"); if (fread(buffer, sizeof(char), len, f) < len) fail("Read failed"); } long len() { // Return the length of a file; this is the only // mechanism that the standard C library makes possible. if (fseek(f, 0, SEEK_END)) fail("Seek failed"); return ftell(f); } };
以下程序使用上述类来提取和写入文件的中间 200 个字符。请注意,即使程序在千兆字节文件上被调用,它仍然只从该文件读取大约 200 个字符。同样,rope只需要少量的内存。
int main(int argc, char** argv) { if (argc != 2) fail("wrong number of arguments"); file_char_prod* fcp = new file_char_prod(argv[1]); crope s(fcp, fcp -> len(), true); size_t len = s.size(); crope middle = s.substr(len/2 - 100, 200) + "\n"; fwrite(middle.c_str(), sizeof(char), middle.size(), stdout); }
参数 | 说明 | 默认 |
---|---|---|
charT | 字符类型 |
成员 | 定义位置 | 说明 |
---|---|---|
virtual ~char_producer() | char_producer | 虚拟析构函数。 |
virtual void operator()(size_t start_pos, size_t len, charT* buffer) |
复制len从字符串的第start_pos个位置开始的字符buffer. 如果多次请求特定位置的一个字符,则每个请求必须导致相同的字符。请注意,这是一个纯粹的虚函数;它必须由每个子类覆盖char_producer. |