MemFile Class ReferenceImplements a memory file.
More...
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Public Member Functions | |
| MemFile () | |
| MemFile (const std::string &path) | |
| ~MemFile () | |
| bool | fopen (const std::string &path, const std::string &mode) |
| void | fclose () const |
| size_t | fread (char *ptr, size_t size, size_t nmemb) const |
| size_t | fwrite (const char *ptr, size_t size, size_t nmemb) |
| char * | fgets (char *s, int size) const |
| void | fprintf (const char *format,...) |
| off_t | size () const |
| bool | eof () const |
| void | reset_read () const |
| void | reset_write () |
Private Member Functions | |
| MemFile (const MemFile &) | |
| MemFile & | operator= (const MemFile &) |
Private Attributes | |
| std::string | m_path |
| bool | m_temporary |
| block_t * | m_base |
| block_t * | m_current_read |
| block_t * | m_current_write |
| int | m_current_write_nr |
| size_t | m_read_ptr |
| size_t | m_write_ptr |
| bool | m_b_read_caused_eof |
Static Private Attributes | |
| static std::map< std::string, block_t * > | m_files |
Classes | |
| struct | block_t |
| File block structure. More... | |
Definition at line 46 of file MemFile.h.
| MemFile::MemFile | ( | ) |
Definition at line 48 of file MemFile.cpp.
00049 :m_temporary(true) 00050 ,m_base(new block_t) 00051 ,m_current_read(m_base) 00052 ,m_current_write(m_base) 00053 ,m_current_write_nr(0) 00054 ,m_read_ptr(0) 00055 ,m_write_ptr(0) 00056 ,m_b_read_caused_eof(false) 00057 { 00058 }
| MemFile::MemFile | ( | const std::string & | path | ) |
Definition at line 61 of file MemFile.cpp.
References m_base, m_current_read, m_current_write, and m_files.
00062 :m_path(path) 00063 ,m_temporary(false) 00064 ,m_base(m_files[path]) 00065 ,m_current_read(NULL) 00066 ,m_current_write(NULL) 00067 ,m_current_write_nr(0) 00068 ,m_read_ptr(0) 00069 ,m_write_ptr(0) 00070 ,m_b_read_caused_eof(false) 00071 { 00072 if (!m_base) 00073 { 00074 m_base = new block_t; 00075 m_files[path] = m_base; 00076 } 00077 m_current_read = m_base; 00078 m_current_write = m_base; 00079 }
| MemFile::~MemFile | ( | ) |
Definition at line 82 of file MemFile.cpp.
References m_base, and m_temporary.
00083 { 00084 while (m_base && m_temporary) 00085 { 00086 block_t *p = m_base; 00087 m_base = p -> next; 00088 delete p; 00089 } 00090 }
| MemFile::MemFile | ( | const MemFile & | ) | [inline, private] |
| bool MemFile::fopen | ( | const std::string & | path, | |
| const std::string & | mode | |||
| ) | [virtual] |
| void MemFile::fclose | ( | ) | const [virtual] |
| size_t MemFile::fread | ( | char * | ptr, | |
| size_t | size, | |||
| size_t | nmemb | |||
| ) | const [virtual] |
Implements IFile.
Definition at line 104 of file MemFile.cpp.
References BLOCKSIZE, m_b_read_caused_eof, m_current_read, m_read_ptr, and m_write_ptr.
Referenced by fgets().
00105 { 00106 size_t p = m_read_ptr % BLOCKSIZE; 00107 size_t sz = size * nmemb; 00108 size_t available = m_write_ptr - m_read_ptr; 00109 if (sz > available) // read beyond eof 00110 { 00111 sz = available; 00112 m_b_read_caused_eof = true; 00113 } 00114 if (!sz) 00115 { 00116 return 0; 00117 } 00118 if (p + sz < BLOCKSIZE) 00119 { 00120 memcpy(ptr, m_current_read -> data + p, sz); 00121 m_read_ptr += sz; 00122 } 00123 else 00124 { 00125 size_t sz1 = BLOCKSIZE - p; 00126 size_t sz2 = sz - sz1; 00127 memcpy(ptr, m_current_read -> data + p, sz1); 00128 m_read_ptr += sz1; 00129 while (sz2 > BLOCKSIZE) 00130 { 00131 if (m_current_read -> next) 00132 { 00133 m_current_read = m_current_read -> next; 00134 memcpy(ptr + sz1, m_current_read -> data, BLOCKSIZE); 00135 m_read_ptr += BLOCKSIZE; 00136 sz1 += BLOCKSIZE; 00137 sz2 -= BLOCKSIZE; 00138 } 00139 else 00140 { 00141 return sz1; 00142 } 00143 } 00144 if (m_current_read -> next) 00145 { 00146 m_current_read = m_current_read -> next; 00147 memcpy(ptr + sz1, m_current_read -> data, sz2); 00148 m_read_ptr += sz2; 00149 } 00150 else 00151 { 00152 return sz1; 00153 } 00154 } 00155 return sz; 00156 }
| size_t MemFile::fwrite | ( | const char * | ptr, | |
| size_t | size, | |||
| size_t | nmemb | |||
| ) | [virtual] |
Implements IFile.
Definition at line 159 of file MemFile.cpp.
References BLOCKSIZE, m_current_write, m_current_write_nr, and m_write_ptr.
Referenced by fprintf().
00160 { 00161 size_t p = m_write_ptr % BLOCKSIZE; 00162 int nr = (int)m_write_ptr / BLOCKSIZE; 00163 size_t sz = size * nmemb; 00164 if (m_current_write_nr < nr) 00165 { 00166 block_t *next = new block_t; 00167 m_current_write -> next = next; 00168 m_current_write = next; 00169 m_current_write_nr++; 00170 } 00171 if (p + sz <= BLOCKSIZE) 00172 { 00173 memcpy(m_current_write -> data + p, ptr, sz); 00174 m_write_ptr += sz; 00175 } 00176 else 00177 { 00178 size_t sz1 = BLOCKSIZE - p; // size left 00179 size_t sz2 = sz - sz1; 00180 memcpy(m_current_write -> data + p, ptr, sz1); 00181 m_write_ptr += sz1; 00182 while (sz2 > BLOCKSIZE) 00183 { 00184 if (m_current_write -> next) 00185 { 00186 m_current_write = m_current_write -> next; 00187 m_current_write_nr++; 00188 } 00189 else 00190 { 00191 block_t *next = new block_t; 00192 m_current_write -> next = next; 00193 m_current_write = next; 00194 m_current_write_nr++; 00195 } 00196 memcpy(m_current_write -> data, ptr + sz1, BLOCKSIZE); 00197 m_write_ptr += BLOCKSIZE; 00198 sz1 += BLOCKSIZE; 00199 sz2 -= BLOCKSIZE; 00200 } 00201 if (m_current_write -> next) 00202 { 00203 m_current_write = m_current_write -> next; 00204 m_current_write_nr++; 00205 } 00206 else 00207 { 00208 block_t *next = new block_t; 00209 m_current_write -> next = next; 00210 m_current_write = next; 00211 m_current_write_nr++; 00212 } 00213 memcpy(m_current_write -> data, ptr + sz1, sz2); 00214 m_write_ptr += sz2; 00215 } 00216 return sz; 00217 }
| char * MemFile::fgets | ( | char * | s, | |
| int | size | |||
| ) | const [virtual] |
Implements IFile.
Definition at line 221 of file MemFile.cpp.
References eof(), and fread().
00222 { 00223 int n = 0; 00224 while (n < size - 1 && !eof()) 00225 { 00226 char c; 00227 size_t sz = fread(&c, 1, 1); 00228 if (sz) 00229 { 00230 if (c == 10) 00231 { 00232 s[n] = 0; 00233 return s; 00234 } 00235 s[n++] = c; 00236 } 00237 } 00238 s[n] = 0; 00239 return s; 00240 }
| void MemFile::fprintf | ( | const char * | format, | |
| ... | ||||
| ) | [virtual] |
Implements IFile.
Definition at line 243 of file MemFile.cpp.
References BLOCKSIZE, and fwrite().
00244 { 00245 va_list ap; 00246 char tmp[BLOCKSIZE]; 00247 va_start(ap, format); 00248 #ifdef _WIN32 00249 vsprintf(tmp, format, ap); 00250 #else 00251 vsnprintf(tmp, BLOCKSIZE - 1, format, ap); 00252 #endif 00253 va_end(ap); 00254 fwrite(tmp, 1, strlen(tmp)); 00255 }
| off_t MemFile::size | ( | ) | const [virtual] |
Implements IFile.
Definition at line 258 of file MemFile.cpp.
References m_write_ptr.
00259 { 00260 return (off_t)m_write_ptr; 00261 }
| bool MemFile::eof | ( | ) | const [virtual] |
Implements IFile.
Definition at line 264 of file MemFile.cpp.
References m_b_read_caused_eof.
Referenced by fgets().
00265 { 00266 return m_b_read_caused_eof; //(m_read_ptr < m_write_ptr) ? false : true; 00267 }
| void MemFile::reset_read | ( | ) | const [virtual] |
Implements IFile.
Definition at line 270 of file MemFile.cpp.
References m_base, m_current_read, and m_read_ptr.
00271 { 00272 m_read_ptr = 0; 00273 m_current_read = m_base; 00274 }
| void MemFile::reset_write | ( | ) | [virtual] |
Implements IFile.
Definition at line 277 of file MemFile.cpp.
References m_base, m_current_write, m_current_write_nr, and m_write_ptr.
00278 { 00279 m_write_ptr = 0; 00280 m_current_write = m_base; 00281 m_current_write_nr = 0; 00282 }
std::map< std::string, MemFile::block_t * > MemFile::m_files [static, private] |
std::string MemFile::m_path [private] |
bool MemFile::m_temporary [private] |
block_t* MemFile::m_base [private] |
Definition at line 83 of file MemFile.h.
Referenced by MemFile(), reset_read(), reset_write(), and ~MemFile().
block_t* MemFile::m_current_read [mutable, private] |
block_t* MemFile::m_current_write [private] |
int MemFile::m_current_write_nr [private] |
size_t MemFile::m_read_ptr [mutable, private] |
size_t MemFile::m_write_ptr [private] |
bool MemFile::m_b_read_caused_eof [mutable, private] |
1.4.4