home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 June / VPR0106A.BIN / OLS / TAR32212 / tar32212.lzh / tar32_2 / src / fast_stl.h < prev    next >
C/C++ Source or Header  |  2000-12-25  |  2KB  |  113 lines

  1. /*
  2.    VC++6付属のSTLは余りに遅いので簡単な高速化バージョンを作る。
  3.    # SGIのSTLportも速いらしい...
  4.    展開速度が約3倍になった。
  5.    by tsuneo. 2000/09/14
  6. */
  7.  
  8. #ifndef __FAST_OFSTREAM_H
  9. #define __FAST_OFSTREAM_H
  10.  
  11. #include <stdio.h>
  12.  
  13. class fast_ofstream
  14. {
  15.     FILE *m_fp;
  16.     bool m_berror;
  17. public:
  18.     fast_ofstream(){
  19.         m_fp = NULL;
  20.         m_berror = false;
  21.     };
  22.     ~fast_ofstream(){
  23.         close();
  24.     };
  25.     void open(const char *fname, int mode){
  26.         m_fp = fopen(fname,"wb");
  27.         m_berror = (m_fp == NULL);
  28.     };
  29.     bool fail(){
  30.         return m_berror;
  31.     };
  32.     void write(const char *buf, int n){
  33.         int m = fwrite(buf,1,n,m_fp);
  34.         m_berror = (m!=n);
  35.     };
  36.     void close(){
  37.         if(m_fp){
  38.             fclose(m_fp);
  39.             m_fp = NULL;
  40.         }
  41.     };
  42. };
  43.  
  44. class fast_strstreambuf
  45. {
  46.     int buf_size;
  47.     char *buf;
  48.     int start_pos;
  49.     int end_pos;
  50. public:
  51.     fast_strstreambuf(){
  52.         buf = new char[2];
  53.         buf_size = 2;
  54.         start_pos = end_pos = 0;
  55.     };
  56.     ~fast_strstreambuf(){
  57.         delete [] buf;
  58.     };
  59.     int in_avail(){
  60.         return ((end_pos - start_pos) & (buf_size - 1));
  61.     };
  62.     int write(char *writebuf, int n){
  63.         int n2 = n;
  64.         while(buf_size - in_avail() <= n){
  65.             char *p = new char[buf_size*2];
  66.             char *newbuf = p;
  67.             while(start_pos != end_pos){
  68.                 *p++ = buf[start_pos++];
  69.                 start_pos &= (buf_size-1);
  70.             }
  71.             start_pos = 0;
  72.             end_pos = p - newbuf;
  73.             delete [] buf;
  74.             buf = newbuf;
  75.             buf_size *= 2;
  76.         }
  77.         while(n2>0){
  78.             buf[end_pos ++] = *writebuf++;
  79.             end_pos &= (buf_size-1);
  80.             n2--;
  81.         }
  82.         return n-n2;
  83.     };
  84.     int read(char *readbuf, int n){
  85.         int n2 = n;
  86.         while(n2>0){
  87.             *readbuf++ = buf[start_pos++];
  88.             start_pos &= (buf_size-1);
  89.             n2--;
  90.         }
  91.         return n-n2;
  92.     };
  93. };
  94. class fast_strstream
  95. {
  96.     fast_strstreambuf streambuf;
  97. public:
  98.     int write(char *writebuf, int n){
  99.         return streambuf.write(writebuf,n);
  100.     };
  101.     int read(char *writebuf, int n){
  102.         return streambuf.read(writebuf,n);
  103.     };
  104.     void put(char c){
  105.         write(&c, 1);
  106.     };
  107.     fast_strstreambuf *rdbuf(){
  108.         return &streambuf;
  109.     }
  110. };
  111.  
  112. #endif // __FAST_OFSTREAM_H
  113.