SerializableFile.cpp

Go to the documentation of this file.
00001 /*
00002  * This program is free software; you can redistribute it and/or modify
00003  * it under the terms of the GNU General Public License as published by
00004  * the Free Software Foundation; either version 3 of the License, or
00005  * (at your option) any later version.
00006  *
00007  * Written (W) 1999-2010 Soeren Sonnenburg
00008  * Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society
00009  * Copyright (C) 2010 Berlin Institute of Technology
00010  */
00011 
00012 #include <shogun/io/SerializableFile.h>
00013 
00014 using namespace shogun;
00015 
00016 CSerializableFile::CSerializableFile()
00017     :CSGObject()
00018 {
00019     init(NULL, 0, "(file)");
00020 }
00021 
00022 CSerializableFile::CSerializableFile(FILE* fstream, char rw)
00023     :CSGObject()
00024 {
00025     init(fstream, rw, "(file)");
00026 }
00027 
00028 CSerializableFile::CSerializableFile(const char* fname, char rw)
00029     :CSGObject()
00030 {
00031     char mode[3] = {rw, 'b', '\0'};
00032 
00033     init(NULL, rw, fname);
00034 
00035     if (m_filename == NULL || *m_filename == '\0') {
00036         SG_WARNING("Filename not given for opening file!\n");
00037         close(); return;
00038     }
00039 
00040     if (rw != 'r' && rw != 'w') {
00041         SG_WARNING("Unknown mode '%c'!\n", mode[0]);
00042         close(); return;
00043     }
00044 
00045     m_fstream = fopen(m_filename, mode);
00046     if (!is_opened()) {
00047         SG_WARNING("Error opening file '%s'\n", m_filename);
00048         close(); return;
00049     }
00050 }
00051 
00052 CSerializableFile::~CSerializableFile()
00053 {
00054     close();
00055     SG_FREE(m_filename);
00056     delete m_reader;
00057     m_task = 0;
00058 }
00059 
00060 void
00061 CSerializableFile::init(FILE* fstream, char task, const char* filename)
00062 {
00063     m_fstream = fstream;
00064     m_task = task;
00065     m_filename = strdup(filename);
00066     m_reader = NULL;
00067 }
00068 
00069 void
00070 CSerializableFile::close()
00071 {
00072     if (is_opened()) { fclose(m_fstream); m_fstream = NULL; }
00073 }
00074 
00075 bool
00076 CSerializableFile::is_opened()
00077 {
00078     return m_fstream != NULL;
00079 }
00080 
00081 bool
00082 CSerializableFile::is_task_warn(char rw, const char* name,
00083                                 const char* prefix)
00084 {
00085     if (m_task == 'r' && m_reader == NULL) {
00086         string_t dest_version;
00087         strncpy(dest_version, "(unkown)", STRING_LEN);
00088         m_reader = new_reader(dest_version, STRING_LEN);
00089         if (m_reader == NULL) {
00090             SG_WARNING("`%s' has file-version `%s', which is not "
00091                        "supported!\n", m_filename, dest_version);
00092             close(); return false;
00093         }
00094     }
00095 
00096     if (rw == 'w' && (m_task != 'w' || !is_opened())) {
00097         SG_WARNING("`%s' not opened (for writing) during writing "
00098                    "`%s%s'!\n", m_filename, prefix, name);
00099         return false;
00100     }
00101     if (rw == 'r' && (m_task != 'r' || !is_opened())) {
00102         SG_WARNING("`%s' not opened (for reading) during reading "
00103                    "`%s%s'!\n", m_filename, prefix, name);
00104         return false;
00105     }
00106 
00107     return true;
00108 }
00109 
00110 bool
00111 CSerializableFile::false_warn(const char* prefix, const char* name)
00112 {
00113     if (m_task == 'w')
00114         SG_WARNING("Could not write `%s%s' to `%s'!\n", prefix,
00115                    name, m_filename);
00116     if (m_task == 'r')
00117         SG_WARNING("Could not read `%s%s' from `%s'!\n", prefix,
00118                    name, m_filename);
00119     if (m_task != 'w' && m_task != 'r')
00120         SG_WARNING("Could not read/write `%s%s' from `%s'!\n",
00121                    prefix, name, m_filename);
00122 
00123     return false;
00124 }
00125 
00126 bool
00127 CSerializableFile::write_scalar(
00128     const TSGDataType* type, const char* name, const char* prefix,
00129     const void* param)
00130 {
00131     if (!is_task_warn('w', name, prefix)) return false;
00132 
00133     if (!write_scalar_wrapped(type, param))
00134         return false_warn(prefix, name);
00135 
00136     return true;
00137 }
00138 
00139 bool
00140 CSerializableFile::read_scalar(
00141     const TSGDataType* type, const char* name, const char* prefix,
00142     void* param)
00143 {
00144     if (!is_task_warn('r', name, prefix)) return false;
00145 
00146     if (!m_reader->read_scalar_wrapped(type, param))
00147         return false_warn(prefix, name);
00148 
00149     return true;
00150 }
00151 
00152 bool
00153 CSerializableFile::write_cont_begin(
00154     const TSGDataType* type, const char* name, const char* prefix,
00155     index_t len_real_y, index_t len_real_x)
00156 {
00157     if (!is_task_warn('w', name, prefix)) return false;
00158 
00159     if (!write_cont_begin_wrapped(type, len_real_y, len_real_x))
00160         return false_warn(prefix, name);
00161 
00162     return true;
00163 }
00164 
00165 bool
00166 CSerializableFile::read_cont_begin(
00167     const TSGDataType* type, const char* name, const char* prefix,
00168     index_t* len_read_y, index_t* len_read_x)
00169 {
00170     if (!is_task_warn('r', name, prefix)) return false;
00171 
00172     if (!m_reader->read_cont_begin_wrapped(type, len_read_y,
00173                                            len_read_x))
00174         return false_warn(prefix, name);
00175 
00176     return true;
00177 }
00178 
00179 bool
00180 CSerializableFile::write_cont_end(
00181     const TSGDataType* type, const char* name, const char* prefix,
00182     index_t len_real_y, index_t len_real_x)
00183 {
00184     if (!is_task_warn('w', name, prefix)) return false;
00185 
00186     if (!write_cont_end_wrapped(type, len_real_y, len_real_x))
00187         return false_warn(prefix, name);
00188 
00189     return true;
00190 }
00191 
00192 bool
00193 CSerializableFile::read_cont_end(
00194     const TSGDataType* type, const char* name, const char* prefix,
00195     index_t len_read_y, index_t len_read_x)
00196 {
00197     if (!is_task_warn('r', name, prefix)) return false;
00198 
00199     if (!m_reader->read_cont_end_wrapped(type, len_read_y, len_read_x))
00200         return false_warn(prefix, name);
00201 
00202     return true;
00203 }
00204 
00205 bool
00206 CSerializableFile::write_string_begin(
00207     const TSGDataType* type, const char* name, const char* prefix,
00208     index_t length)
00209 {
00210     if (!is_task_warn('w', name, prefix)) return false;
00211 
00212     if (!write_string_begin_wrapped(type, length))
00213         return false_warn(prefix, name);
00214 
00215     return true;
00216 }
00217 
00218 bool
00219 CSerializableFile::read_string_begin(
00220     const TSGDataType* type, const char* name, const char* prefix,
00221     index_t* length)
00222 {
00223     if (!is_task_warn('r', name, prefix)) return false;
00224 
00225     if (!m_reader->read_string_begin_wrapped(type, length))
00226         return false_warn(prefix, name);
00227 
00228     return true;
00229 }
00230 
00231 bool
00232 CSerializableFile::write_string_end(
00233     const TSGDataType* type, const char* name, const char* prefix,
00234     index_t length)
00235 {
00236     if (!is_task_warn('w', name, prefix)) return false;
00237 
00238     if (!write_string_end_wrapped(type, length))
00239         return false_warn(prefix, name);
00240 
00241     return true;
00242 }
00243 
00244 bool
00245 CSerializableFile::read_string_end(
00246     const TSGDataType* type, const char* name, const char* prefix,
00247     index_t length)
00248 {
00249     if (!is_task_warn('r', name, prefix)) return false;
00250 
00251     if (!m_reader->read_string_end_wrapped(type, length))
00252         return false_warn(prefix, name);
00253 
00254     return true;
00255 }
00256 
00257 bool
00258 CSerializableFile::write_stringentry_begin(
00259     const TSGDataType* type, const char* name, const char* prefix,
00260     index_t y)
00261 {
00262     if (!is_task_warn('w', name, prefix)) return false;
00263 
00264     if (!write_stringentry_begin_wrapped(type, y))
00265         return false_warn(prefix, name);
00266 
00267     return true;
00268 }
00269 
00270 bool
00271 CSerializableFile::read_stringentry_begin(
00272     const TSGDataType* type, const char* name, const char* prefix,
00273     index_t y)
00274 {
00275     if (!is_task_warn('r', name, prefix)) return false;
00276 
00277     if (!m_reader->read_stringentry_begin_wrapped(type, y))
00278         return false_warn(prefix, name);
00279 
00280     return true;
00281 }
00282 
00283 bool
00284 CSerializableFile::write_stringentry_end(
00285     const TSGDataType* type, const char* name, const char* prefix,
00286     index_t y)
00287 {
00288     if (!is_task_warn('w', name, prefix)) return false;
00289 
00290     if (!write_stringentry_end_wrapped(type, y))
00291         return false_warn(prefix, name);
00292 
00293     return true;
00294 }
00295 
00296 bool
00297 CSerializableFile::read_stringentry_end(
00298     const TSGDataType* type, const char* name, const char* prefix,
00299     index_t y)
00300 {
00301     if (!is_task_warn('r', name, prefix)) return false;
00302 
00303     if (!m_reader->read_stringentry_end_wrapped(type, y))
00304         return false_warn(prefix, name);
00305 
00306     return true;
00307 }
00308 
00309 bool
00310 CSerializableFile::write_sparse_begin(
00311     const TSGDataType* type, const char* name, const char* prefix,
00312     index_t length)
00313 {
00314     if (!is_task_warn('w', name, prefix)) return false;
00315 
00316     if (!write_sparse_begin_wrapped(type, length))
00317         return false_warn(prefix, name);
00318 
00319     return true;
00320 }
00321 
00322 bool
00323 CSerializableFile::read_sparse_begin(
00324     const TSGDataType* type, const char* name, const char* prefix,
00325     index_t* length)
00326 {
00327     if (!is_task_warn('r', name, prefix)) return false;
00328 
00329     if (!m_reader->read_sparse_begin_wrapped(type, length))
00330         return false_warn(prefix, name);
00331 
00332     return true;
00333 }
00334 
00335 bool
00336 CSerializableFile::write_sparse_end(
00337     const TSGDataType* type, const char* name, const char* prefix,
00338     index_t length)
00339 {
00340     if (!is_task_warn('w', name, prefix)) return false;
00341 
00342     if (!write_sparse_end_wrapped(type, length))
00343         return false_warn(prefix, name);
00344 
00345     return true;
00346 }
00347 
00348 bool
00349 CSerializableFile::read_sparse_end(
00350     const TSGDataType* type, const char* name, const char* prefix,
00351     index_t length)
00352 {
00353     if (!is_task_warn('r', name, prefix)) return false;
00354 
00355     if (!m_reader->read_sparse_end_wrapped(type, length))
00356         return false_warn(prefix, name);
00357 
00358     return true;
00359 }
00360 
00361 bool
00362 CSerializableFile::write_sparseentry_begin(
00363     const TSGDataType* type, const char* name, const char* prefix,
00364     const SGSparseVectorEntry<char>* first_entry, index_t feat_index,
00365     index_t y)
00366 {
00367     if (!is_task_warn('w', name, prefix)) return false;
00368 
00369     if (!write_sparseentry_begin_wrapped(type, first_entry,
00370                                          feat_index, y))
00371         return false_warn(prefix, name);
00372 
00373     return true;
00374 }
00375 
00376 bool
00377 CSerializableFile::read_sparseentry_begin(
00378     const TSGDataType* type, const char* name, const char* prefix,
00379     SGSparseVectorEntry<char>* first_entry, index_t* feat_index, index_t y)
00380 {
00381     if (!is_task_warn('r', name, prefix)) return false;
00382 
00383     if (!m_reader->read_sparseentry_begin_wrapped(type, first_entry,
00384                                                   feat_index, y))
00385         return false_warn(prefix, name);
00386 
00387     return true;
00388 }
00389 
00390 bool
00391 CSerializableFile::write_sparseentry_end(
00392     const TSGDataType* type, const char* name, const char* prefix,
00393     const SGSparseVectorEntry<char>* first_entry, index_t feat_index,
00394     index_t y)
00395 {
00396     if (!is_task_warn('w', name, prefix)) return false;
00397 
00398     if (!write_sparseentry_end_wrapped(type, first_entry, feat_index,
00399                                        y))
00400         return false_warn(prefix, name);
00401 
00402     return true;
00403 }
00404 
00405 bool
00406 CSerializableFile::read_sparseentry_end(
00407     const TSGDataType* type, const char* name, const char* prefix,
00408     SGSparseVectorEntry<char>* first_entry, index_t* feat_index,
00409     index_t y)
00410 {
00411     if (!is_task_warn('r', name, prefix)) return false;
00412 
00413     if (!m_reader->read_sparseentry_end_wrapped(type, first_entry,
00414                                                 feat_index, y))
00415         return false_warn(prefix, name);
00416 
00417     return true;
00418 }
00419 
00420 bool
00421 CSerializableFile::write_item_begin(
00422     const TSGDataType* type, const char* name, const char* prefix,
00423     index_t y, index_t x)
00424 {
00425     if (!is_task_warn('w', name, prefix)) return false;
00426 
00427     if (!write_item_begin_wrapped(type, y, x))
00428         return false_warn(prefix, name);
00429 
00430     return true;
00431 }
00432 
00433 bool
00434 CSerializableFile::read_item_begin(
00435     const TSGDataType* type, const char* name, const char* prefix,
00436     index_t y, index_t x)
00437 {
00438     if (!is_task_warn('r', name, prefix)) return false;
00439 
00440     if (!m_reader->read_item_begin_wrapped(type, y, x))
00441         return false_warn(prefix, name);
00442 
00443     return true;
00444 }
00445 
00446 bool
00447 CSerializableFile::write_item_end(
00448     const TSGDataType* type, const char* name, const char* prefix,
00449     index_t y, index_t x)
00450 {
00451     if (!is_task_warn('w', name, prefix)) return false;
00452 
00453     if (!write_item_end_wrapped(type, y, x))
00454         return false_warn(prefix, name);
00455 
00456     return true;
00457 }
00458 
00459 bool
00460 CSerializableFile::read_item_end(
00461     const TSGDataType* type, const char* name, const char* prefix,
00462     index_t y, index_t x)
00463 {
00464     if (!is_task_warn('r', name, prefix)) return false;
00465 
00466     if (!m_reader->read_item_end_wrapped(type, y, x))
00467         return false_warn(prefix, name);
00468 
00469     return true;
00470 }
00471 
00472 bool
00473 CSerializableFile::write_sgserializable_begin(
00474     const TSGDataType* type, const char* name, const char* prefix,
00475     const char* sgserializable_name, EPrimitiveType generic)
00476 {
00477     if (!is_task_warn('w', name, prefix)) return false;
00478 
00479     if (!write_sgserializable_begin_wrapped(type, sgserializable_name,
00480                                             generic))
00481         return false_warn(prefix, name);
00482 
00483     return true;
00484 }
00485 
00486 bool
00487 CSerializableFile::read_sgserializable_begin(
00488     const TSGDataType* type, const char* name, const char* prefix,
00489     char* sgserializable_name, EPrimitiveType* generic)
00490 {
00491     if (!is_task_warn('r', name, prefix)) return false;
00492 
00493     if (!m_reader->read_sgserializable_begin_wrapped(
00494             type, sgserializable_name, generic))
00495         return false_warn(prefix, name);
00496 
00497     return true;
00498 }
00499 
00500 bool
00501 CSerializableFile::write_sgserializable_end(
00502     const TSGDataType* type, const char* name, const char* prefix,
00503     const char* sgserializable_name, EPrimitiveType generic)
00504 {
00505     if (!is_task_warn('w', name, prefix)) return false;
00506 
00507     if (!write_sgserializable_end_wrapped(type, sgserializable_name,
00508                                           generic))
00509         return false_warn(prefix, name);
00510 
00511     return true;
00512 }
00513 
00514 bool
00515 CSerializableFile::read_sgserializable_end(
00516     const TSGDataType* type, const char* name, const char* prefix,
00517     const char* sgserializable_name, EPrimitiveType generic)
00518 {
00519     if (!is_task_warn('r', name, prefix)) return false;
00520 
00521     if (!m_reader->read_sgserializable_end_wrapped(
00522             type, sgserializable_name, generic))
00523         return false_warn(prefix, name);
00524 
00525     return true;
00526 }
00527 
00528 bool
00529 CSerializableFile::write_type_begin(
00530     const TSGDataType* type, const char* name, const char* prefix)
00531 {
00532     if (!is_task_warn('w', name, prefix)) return false;
00533 
00534     if (!write_type_begin_wrapped(type, name, prefix))
00535         return false_warn(prefix, name);
00536 
00537     return true;
00538 }
00539 
00540 bool
00541 CSerializableFile::read_type_begin(
00542     const TSGDataType* type, const char* name, const char* prefix)
00543 {
00544     if (!is_task_warn('r', name, prefix)) return false;
00545 
00546     if (!m_reader->read_type_begin_wrapped(type, name, prefix))
00547         return false_warn(prefix, name);
00548 
00549     return true;
00550 }
00551 
00552 bool
00553 CSerializableFile::write_type_end(
00554     const TSGDataType* type, const char* name, const char* prefix)
00555 {
00556     if (!is_task_warn('w', name, prefix)) return false;
00557 
00558     if (!write_type_end_wrapped(type, name, prefix))
00559         return false_warn(prefix, name);
00560 
00561     return true;
00562 }
00563 
00564 bool
00565 CSerializableFile::read_type_end(
00566     const TSGDataType* type, const char* name, const char* prefix)
00567 {
00568     if (!is_task_warn('r', name, prefix)) return false;
00569 
00570     if (!m_reader->read_type_end_wrapped(type, name, prefix))
00571         return false_warn(prefix, name);
00572 
00573     return true;
00574 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

SHOGUN Machine Learning Toolbox - Documentation