SGI

char_producer

类别:容器 组件类型:类型

说明

Char_producter<charT>rope的辅助类。它的唯一目的是创建ropes 使用延迟求值。使用延迟求值的rope在实际需要特定字符的值之前,不会存储第n个字符的值。这有时是一种有用的优化。

Char_producer<charT>是一个抽象基类;它提供了一个空的虚析构函数和一个纯虚operator()。只能使用char_producer的子类,不能char_producer直接使用。

从派生的类char_producerrope中定义了计算字符的方法,只要需要这些字符就会延迟计算。与函数对象不同,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);
}

定义

rope 和向后兼容性头文件 rope.h 中定义。char_producer类是 SGI 扩展;它不是 C++ 标准的一部分。

模板参数

参数 说明 默认
charT 字符类型  

模型

可赋值

类型要求

charT可赋值 的模型。

成员

成员 定义位置 说明
virtual ~char_producer() char_producer 虚拟析构函数。
 
virtual void operator()(size_t start_pos, 
                        size_t len,
                        charT* buffer)
复制len从字符串的第start_pos个位置开始的字符buffer. 如果多次请求特定位置的一个字符,则每个请求必须导致相同的字符。请注意,这是一个纯粹的虚函数;它必须由每个子类覆盖char_producer.

注意

另请参阅

rope, 函数对象
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc. 所有权利保留。 TrademarkInformation