home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2003 November / VPR0311.ISO / OLS / TAR32223 / tar32223.lzh / tar32_2 / src / fast_stl.h < prev    next >
C/C++ Source or Header  |  2003-01-17  |  2KB  |  125 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_fstream
  14. {
  15.     FILE *m_fp;
  16.     bool m_berror;
  17.     bool m_bwrite;
  18.     int m_count;
  19. public:
  20.     fast_fstream(){
  21.         m_fp = NULL;
  22.         m_berror = false;
  23.         m_bwrite = false;
  24.         m_count = 0;
  25.     };
  26.     ~fast_fstream(){
  27.         close();
  28.     };
  29.     void open(const char *fname, int mode){
  30.         if(mode & ios::out){m_bwrite=true;}
  31.         m_fp = fopen(fname, (m_bwrite ? "wb" : "rb"));
  32.         m_berror = (m_fp == NULL);
  33.     };
  34.     bool fail(){
  35.         return m_berror;
  36.     };
  37.     void write(const char *buf, int n){
  38.         int m = fwrite(buf,1,n,m_fp);
  39.         m_count = m;
  40.         m_berror = (m!=n);
  41.     };
  42.     void read(char *buf, int n){
  43.         int m = fread(buf,1,n,m_fp);
  44.         m_count = m;
  45.         m_berror = (m!=n);
  46.     }
  47.     void close(){
  48.         if(m_fp){
  49.             fclose(m_fp);
  50.             m_fp = NULL;
  51.         }
  52.     };
  53.     int gcount(){return m_count;}
  54. };
  55.  
  56. class fast_strstreambuf
  57. {
  58.     int buf_size;
  59.     char *buf;
  60.     int start_pos;
  61.     int end_pos;
  62. public:
  63.     fast_strstreambuf(){
  64.         buf = new char[2];
  65.         buf_size = 2;
  66.         start_pos = end_pos = 0;
  67.     };
  68.     ~fast_strstreambuf(){
  69.         delete [] buf;
  70.     };
  71.     int in_avail(){
  72.         return ((end_pos - start_pos) & (buf_size - 1));
  73.     };
  74.     int write(char *writebuf, int n){
  75.         int n2 = n;
  76.         while(buf_size - in_avail() <= n){
  77.             char *p = new char[buf_size*2];
  78.             char *newbuf = p;
  79.             while(start_pos != end_pos){
  80.                 *p++ = buf[start_pos++];
  81.                 start_pos &= (buf_size-1);
  82.             }
  83.             start_pos = 0;
  84.             end_pos = p - newbuf;
  85.             delete [] buf;
  86.             buf = newbuf;
  87.             buf_size *= 2;
  88.         }
  89.         while(n2>0){
  90.             buf[end_pos ++] = *writebuf++;
  91.             end_pos &= (buf_size-1);
  92.             n2--;
  93.         }
  94.         return n-n2;
  95.     };
  96.     int read(char *readbuf, int n){
  97.         int n2 = n;
  98.         while(n2>0){
  99.             *readbuf++ = buf[start_pos++];
  100.             start_pos &= (buf_size-1);
  101.             n2--;
  102.         }
  103.         return n-n2;
  104.     };
  105. };
  106. class fast_strstream
  107. {
  108.     fast_strstreambuf streambuf;
  109. public:
  110.     int write(char *writebuf, int n){
  111.         return streambuf.write(writebuf,n);
  112.     };
  113.     int read(char *writebuf, int n){
  114.         return streambuf.read(writebuf,n);
  115.     };
  116.     void put(char c){
  117.         write(&c, 1);
  118.     };
  119.     fast_strstreambuf *rdbuf(){
  120.         return &streambuf;
  121.     }
  122. };
  123.  
  124. #endif // __FAST_OFSTREAM_H
  125.