SHOGUN  v3.0.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SerializableFile.cpp
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 3 of the License, or
5  * (at your option) any later version.
6  *
7  * Written (W) 1999-2010 Soeren Sonnenburg
8  * Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society
9  * Copyright (C) 2010 Berlin Institute of Technology
10  */
11 
13 
14 using namespace shogun;
15 
17  : CSGObject(), m_filename(NULL)
18 {
19  init(NULL, 0, "(file)");
20 }
21 
22 CSerializableFile::CSerializableFile(FILE* fstream, char rw)
23  :CSGObject(), m_filename(NULL)
24 {
25  init(fstream, rw, "(file)");
26 }
27 
28 CSerializableFile::CSerializableFile(const char* fname, char rw)
29  :CSGObject(), m_filename(NULL)
30 {
31  char mode[3] = {rw, 'b', '\0'};
32 
33  init(NULL, rw, fname);
34 
35  if (m_filename == NULL || *m_filename == '\0') {
36  SG_WARNING("Filename not given for opening file!\n")
37  close(); return;
38  }
39 
40  if (rw != 'r' && rw != 'w') {
41  SG_WARNING("Unknown mode '%c'!\n", mode[0])
42  close(); return;
43  }
44 
45  m_fstream = fopen(m_filename, mode);
46  if (!is_opened()) {
47  SG_WARNING("Error opening file '%s'\n", m_filename)
48  close(); return;
49  }
50 }
51 
53 {
54  close();
55  SG_FREE(m_filename);
56  delete m_reader;
57  m_task = 0;
58 }
59 
60 void
61 CSerializableFile::init(FILE* fstream, char task, const char* filename)
62 {
63  m_fstream = fstream;
64  m_task = task;
65  SG_FREE(m_filename);
66  m_filename = SG_MALLOC(char, strlen(filename)+1);
67  strcpy(m_filename, filename);
68  m_reader = NULL;
69 }
70 
71 void
73 {
74  if (is_opened()) { fclose(m_fstream); m_fstream = NULL; }
75 }
76 
77 bool
79 {
80  return m_fstream != NULL;
81 }
82 
83 bool
84 CSerializableFile::is_task_warn(char rw, const char* name,
85  const char* prefix)
86 {
87  if (m_task == 'r' && m_reader == NULL) {
88  string_t dest_version;
89  strncpy(dest_version, "(unkown)", STRING_LEN);
90  m_reader = new_reader(dest_version, STRING_LEN);
91  if (m_reader == NULL) {
92  SG_WARNING("`%s' has file-version `%s', which is not "
93  "supported!\n", m_filename, dest_version);
94  close(); return false;
95  }
96  }
97 
98  if (rw == 'w' && (m_task != 'w' || !is_opened())) {
99  SG_WARNING("`%s' not opened (for writing) during writing "
100  "`%s%s'!\n", m_filename, prefix, name);
101  return false;
102  }
103  if (rw == 'r' && (m_task != 'r' || !is_opened())) {
104  SG_WARNING("`%s' not opened (for reading) during reading "
105  "`%s%s'!\n", m_filename, prefix, name);
106  return false;
107  }
108 
109  return true;
110 }
111 
112 bool
113 CSerializableFile::false_warn(const char* prefix, const char* name)
114 {
115  if (m_task == 'w')
116  SG_WARNING("Could not write `%s%s' to `%s'!\n", prefix,
117  name, m_filename);
118  if (m_task == 'r')
119  SG_WARNING("Could not read `%s%s' from `%s'!\n", prefix,
120  name, m_filename);
121  if (m_task != 'w' && m_task != 'r')
122  SG_WARNING("Could not read/write `%s%s' from `%s'!\n",
123  prefix, name, m_filename);
124 
125  return false;
126 }
127 
128 bool
129 CSerializableFile::write_scalar(
130  const TSGDataType* type, const char* name, const char* prefix,
131  const void* param)
132 {
133  if (!is_task_warn('w', name, prefix)) return false;
134 
135  if (!write_scalar_wrapped(type, param))
136  return false_warn(prefix, name);
137 
138  return true;
139 }
140 
141 bool
142 CSerializableFile::read_scalar(
143  const TSGDataType* type, const char* name, const char* prefix,
144  void* param)
145 {
146  if (!is_task_warn('r', name, prefix)) return false;
147 
148  if (!m_reader->read_scalar_wrapped(type, param))
149  return false_warn(prefix, name);
150 
151  return true;
152 }
153 
154 bool
155 CSerializableFile::write_cont_begin(
156  const TSGDataType* type, const char* name, const char* prefix,
157  index_t len_real_y, index_t len_real_x)
158 {
159  if (!is_task_warn('w', name, prefix)) return false;
160 
161  if (!write_cont_begin_wrapped(type, len_real_y, len_real_x))
162  return false_warn(prefix, name);
163 
164  return true;
165 }
166 
167 bool
168 CSerializableFile::read_cont_begin(
169  const TSGDataType* type, const char* name, const char* prefix,
170  index_t* len_read_y, index_t* len_read_x)
171 {
172  if (!is_task_warn('r', name, prefix)) return false;
173 
174  if (!m_reader->read_cont_begin_wrapped(type, len_read_y,
175  len_read_x))
176  return false_warn(prefix, name);
177 
178  return true;
179 }
180 
181 bool
182 CSerializableFile::write_cont_end(
183  const TSGDataType* type, const char* name, const char* prefix,
184  index_t len_real_y, index_t len_real_x)
185 {
186  if (!is_task_warn('w', name, prefix)) return false;
187 
188  if (!write_cont_end_wrapped(type, len_real_y, len_real_x))
189  return false_warn(prefix, name);
190 
191  return true;
192 }
193 
194 bool
195 CSerializableFile::read_cont_end(
196  const TSGDataType* type, const char* name, const char* prefix,
197  index_t len_read_y, index_t len_read_x)
198 {
199  if (!is_task_warn('r', name, prefix)) return false;
200 
201  if (!m_reader->read_cont_end_wrapped(type, len_read_y, len_read_x))
202  return false_warn(prefix, name);
203 
204  return true;
205 }
206 
207 bool
208 CSerializableFile::write_string_begin(
209  const TSGDataType* type, const char* name, const char* prefix,
210  index_t length)
211 {
212  if (!is_task_warn('w', name, prefix)) return false;
213 
214  if (!write_string_begin_wrapped(type, length))
215  return false_warn(prefix, name);
216 
217  return true;
218 }
219 
220 bool
221 CSerializableFile::read_string_begin(
222  const TSGDataType* type, const char* name, const char* prefix,
223  index_t* length)
224 {
225  if (!is_task_warn('r', name, prefix)) return false;
226 
227  if (!m_reader->read_string_begin_wrapped(type, length))
228  return false_warn(prefix, name);
229 
230  return true;
231 }
232 
233 bool
234 CSerializableFile::write_string_end(
235  const TSGDataType* type, const char* name, const char* prefix,
236  index_t length)
237 {
238  if (!is_task_warn('w', name, prefix)) return false;
239 
240  if (!write_string_end_wrapped(type, length))
241  return false_warn(prefix, name);
242 
243  return true;
244 }
245 
246 bool
247 CSerializableFile::read_string_end(
248  const TSGDataType* type, const char* name, const char* prefix,
249  index_t length)
250 {
251  if (!is_task_warn('r', name, prefix)) return false;
252 
253  if (!m_reader->read_string_end_wrapped(type, length))
254  return false_warn(prefix, name);
255 
256  return true;
257 }
258 
259 bool
260 CSerializableFile::write_stringentry_begin(
261  const TSGDataType* type, const char* name, const char* prefix,
262  index_t y)
263 {
264  if (!is_task_warn('w', name, prefix)) return false;
265 
266  if (!write_stringentry_begin_wrapped(type, y))
267  return false_warn(prefix, name);
268 
269  return true;
270 }
271 
272 bool
273 CSerializableFile::read_stringentry_begin(
274  const TSGDataType* type, const char* name, const char* prefix,
275  index_t y)
276 {
277  if (!is_task_warn('r', name, prefix)) return false;
278 
279  if (!m_reader->read_stringentry_begin_wrapped(type, y))
280  return false_warn(prefix, name);
281 
282  return true;
283 }
284 
285 bool
286 CSerializableFile::write_stringentry_end(
287  const TSGDataType* type, const char* name, const char* prefix,
288  index_t y)
289 {
290  if (!is_task_warn('w', name, prefix)) return false;
291 
292  if (!write_stringentry_end_wrapped(type, y))
293  return false_warn(prefix, name);
294 
295  return true;
296 }
297 
298 bool
299 CSerializableFile::read_stringentry_end(
300  const TSGDataType* type, const char* name, const char* prefix,
301  index_t y)
302 {
303  if (!is_task_warn('r', name, prefix)) return false;
304 
305  if (!m_reader->read_stringentry_end_wrapped(type, y))
306  return false_warn(prefix, name);
307 
308  return true;
309 }
310 
311 bool
312 CSerializableFile::write_sparse_begin(
313  const TSGDataType* type, const char* name, const char* prefix,
314  index_t length)
315 {
316  if (!is_task_warn('w', name, prefix)) return false;
317 
318  if (!write_sparse_begin_wrapped(type, length))
319  return false_warn(prefix, name);
320 
321  return true;
322 }
323 
324 bool
325 CSerializableFile::read_sparse_begin(
326  const TSGDataType* type, const char* name, const char* prefix,
327  index_t* length)
328 {
329  if (!is_task_warn('r', name, prefix)) return false;
330 
331  if (!m_reader->read_sparse_begin_wrapped(type, length))
332  return false_warn(prefix, name);
333 
334  return true;
335 }
336 
337 bool
338 CSerializableFile::write_sparse_end(
339  const TSGDataType* type, const char* name, const char* prefix,
340  index_t length)
341 {
342  if (!is_task_warn('w', name, prefix)) return false;
343 
344  if (!write_sparse_end_wrapped(type, length))
345  return false_warn(prefix, name);
346 
347  return true;
348 }
349 
350 bool
351 CSerializableFile::read_sparse_end(
352  const TSGDataType* type, const char* name, const char* prefix,
353  index_t length)
354 {
355  if (!is_task_warn('r', name, prefix)) return false;
356 
357  if (!m_reader->read_sparse_end_wrapped(type, length))
358  return false_warn(prefix, name);
359 
360  return true;
361 }
362 
363 bool
364 CSerializableFile::write_sparseentry_begin(
365  const TSGDataType* type, const char* name, const char* prefix,
366  const SGSparseVectorEntry<char>* first_entry, index_t feat_index,
367  index_t y)
368 {
369  if (!is_task_warn('w', name, prefix)) return false;
370 
371  if (!write_sparseentry_begin_wrapped(type, first_entry,
372  feat_index, y))
373  return false_warn(prefix, name);
374 
375  return true;
376 }
377 
378 bool
379 CSerializableFile::read_sparseentry_begin(
380  const TSGDataType* type, const char* name, const char* prefix,
381  SGSparseVectorEntry<char>* first_entry, index_t* feat_index, index_t y)
382 {
383  if (!is_task_warn('r', name, prefix)) return false;
384 
385  if (!m_reader->read_sparseentry_begin_wrapped(type, first_entry,
386  feat_index, y))
387  return false_warn(prefix, name);
388 
389  return true;
390 }
391 
392 bool
393 CSerializableFile::write_sparseentry_end(
394  const TSGDataType* type, const char* name, const char* prefix,
395  const SGSparseVectorEntry<char>* first_entry, index_t feat_index,
396  index_t y)
397 {
398  if (!is_task_warn('w', name, prefix)) return false;
399 
400  if (!write_sparseentry_end_wrapped(type, first_entry, feat_index,
401  y))
402  return false_warn(prefix, name);
403 
404  return true;
405 }
406 
407 bool
408 CSerializableFile::read_sparseentry_end(
409  const TSGDataType* type, const char* name, const char* prefix,
410  SGSparseVectorEntry<char>* first_entry, index_t* feat_index,
411  index_t y)
412 {
413  if (!is_task_warn('r', name, prefix)) return false;
414 
415  if (!m_reader->read_sparseentry_end_wrapped(type, first_entry,
416  feat_index, y))
417  return false_warn(prefix, name);
418 
419  return true;
420 }
421 
422 bool
423 CSerializableFile::write_item_begin(
424  const TSGDataType* type, const char* name, const char* prefix,
425  index_t y, index_t x)
426 {
427  if (!is_task_warn('w', name, prefix)) return false;
428 
429  if (!write_item_begin_wrapped(type, y, x))
430  return false_warn(prefix, name);
431 
432  return true;
433 }
434 
435 bool
436 CSerializableFile::read_item_begin(
437  const TSGDataType* type, const char* name, const char* prefix,
438  index_t y, index_t x)
439 {
440  if (!is_task_warn('r', name, prefix)) return false;
441 
442  if (!m_reader->read_item_begin_wrapped(type, y, x))
443  return false_warn(prefix, name);
444 
445  return true;
446 }
447 
448 bool
449 CSerializableFile::write_item_end(
450  const TSGDataType* type, const char* name, const char* prefix,
451  index_t y, index_t x)
452 {
453  if (!is_task_warn('w', name, prefix)) return false;
454 
455  if (!write_item_end_wrapped(type, y, x))
456  return false_warn(prefix, name);
457 
458  return true;
459 }
460 
461 bool
462 CSerializableFile::read_item_end(
463  const TSGDataType* type, const char* name, const char* prefix,
464  index_t y, index_t x)
465 {
466  if (!is_task_warn('r', name, prefix)) return false;
467 
468  if (!m_reader->read_item_end_wrapped(type, y, x))
469  return false_warn(prefix, name);
470 
471  return true;
472 }
473 
474 bool
475 CSerializableFile::write_sgserializable_begin(
476  const TSGDataType* type, const char* name, const char* prefix,
477  const char* sgserializable_name, EPrimitiveType generic)
478 {
479  if (!is_task_warn('w', name, prefix)) return false;
480 
481  if (!write_sgserializable_begin_wrapped(type, sgserializable_name,
482  generic))
483  return false_warn(prefix, name);
484 
485  return true;
486 }
487 
488 bool
489 CSerializableFile::read_sgserializable_begin(
490  const TSGDataType* type, const char* name, const char* prefix,
491  char* sgserializable_name, EPrimitiveType* generic)
492 {
493  if (!is_task_warn('r', name, prefix)) return false;
494 
495  if (!m_reader->read_sgserializable_begin_wrapped(
496  type, sgserializable_name, generic))
497  return false_warn(prefix, name);
498 
499  return true;
500 }
501 
502 bool
503 CSerializableFile::write_sgserializable_end(
504  const TSGDataType* type, const char* name, const char* prefix,
505  const char* sgserializable_name, EPrimitiveType generic)
506 {
507  if (!is_task_warn('w', name, prefix)) return false;
508 
509  if (!write_sgserializable_end_wrapped(type, sgserializable_name,
510  generic))
511  return false_warn(prefix, name);
512 
513  return true;
514 }
515 
516 bool
517 CSerializableFile::read_sgserializable_end(
518  const TSGDataType* type, const char* name, const char* prefix,
519  const char* sgserializable_name, EPrimitiveType generic)
520 {
521  if (!is_task_warn('r', name, prefix)) return false;
522 
523  if (!m_reader->read_sgserializable_end_wrapped(
524  type, sgserializable_name, generic))
525  return false_warn(prefix, name);
526 
527  return true;
528 }
529 
530 bool
531 CSerializableFile::write_type_begin(
532  const TSGDataType* type, const char* name, const char* prefix)
533 {
534  if (!is_task_warn('w', name, prefix)) return false;
535 
536  if (!write_type_begin_wrapped(type, name, prefix))
537  return false_warn(prefix, name);
538 
539  return true;
540 }
541 
542 bool
543 CSerializableFile::read_type_begin(
544  const TSGDataType* type, const char* name, const char* prefix)
545 {
546  if (!is_task_warn('r', name, prefix)) return false;
547 
548  if (!m_reader->read_type_begin_wrapped(type, name, prefix))
549  return false_warn(prefix, name);
550 
551  return true;
552 }
553 
554 bool
555 CSerializableFile::write_type_end(
556  const TSGDataType* type, const char* name, const char* prefix)
557 {
558  if (!is_task_warn('w', name, prefix)) return false;
559 
560  if (!write_type_end_wrapped(type, name, prefix))
561  return false_warn(prefix, name);
562 
563  return true;
564 }
565 
566 bool
567 CSerializableFile::read_type_end(
568  const TSGDataType* type, const char* name, const char* prefix)
569 {
570  if (!is_task_warn('r', name, prefix)) return false;
571 
572  if (!m_reader->read_type_end_wrapped(type, name, prefix))
573  return false_warn(prefix, name);
574 
575  return true;
576 }

SHOGUN Machine Learning Toolbox - Documentation