17 #define STR_KEY_FILETYPE "filetype"
18 #define STR_FILETYPE_00 \
19 "_SHOGUN_SERIALIZABLE_JSON_FILE_V_00_"
21 using namespace shogun;
23 CSerializableJsonFile::CSerializableJsonFile()
26 CSerializableJsonFile::CSerializableJsonFile(
const char* fname,
char rw)
29 CSerializableFile::init(NULL, rw, fname);
33 CSerializableJsonFile::~CSerializableJsonFile()
39 CSerializableJsonFile::new_reader(
char* dest_version,
size_t n)
44 if ((buf = json_object_object_get(
45 m_stack_stream.back(), STR_KEY_FILETYPE)) == NULL
47 || (ftype = json_object_get_string(buf)) == NULL)
50 strncpy(dest_version, ftype, n);
52 if (strcmp(STR_FILETYPE_00, dest_version) == 0)
53 return new SerializableJsonReader00(
this);
58 void CSerializableJsonFile::push_object(json_object* o)
60 m_stack_stream.push_back(o);
64 void CSerializableJsonFile::pop_object()
66 json_object_put(m_stack_stream.back());
67 m_stack_stream.pop_back();
71 CSerializableJsonFile::get_object_any(
72 json_object** dest, json_object* src,
const char* key)
74 *dest = json_object_object_get(src, key);
76 return !is_error(*dest);
80 CSerializableJsonFile::get_object(json_object** dest, json_object* src,
81 const char* key, json_type t)
83 *dest = json_object_object_get(src, key);
85 return *dest != NULL && !is_error(*dest)
86 && json_object_is_type(*dest, t);
90 CSerializableJsonFile::init(
const char* fname)
92 if (m_filename == NULL || *m_filename ==
'\0') {
93 SG_WARNING(
"Filename not given for opening file!\n")
101 buf = json_object_from_file((
char*) fname);
103 SG_ERROR(
"Could not open file `%s' for reading!\n",
107 m_stack_stream.push_back(buf);
110 m_stack_stream.push_back(json_object_new_object());
111 buf = json_object_new_string(STR_FILETYPE_00);
112 json_object_object_add(m_stack_stream.back(),
113 STR_KEY_FILETYPE, buf);
116 SG_WARNING(
"Could not open file `%s', unknown mode!\n",
124 CSerializableJsonFile::close()
126 while (m_stack_stream.get_num_elements() > 1)
129 if (m_stack_stream.get_num_elements() == 1) {
131 && json_object_to_file(m_filename, m_stack_stream.back()))
133 SG_WARNING(
"Could not close file `%s' for writing!\n",
142 CSerializableJsonFile::is_opened()
144 return m_stack_stream.get_num_elements() > 0;
148 CSerializableJsonFile::write_scalar_wrapped(
153 push_object(json_object_new_boolean(*(
bool*) param));
156 push_object(json_object_new_int((
int) *(
char*) param));
159 push_object(json_object_new_int((
int) *(int8_t*) param));
162 push_object(json_object_new_int((
int) *(uint8_t*) param));
165 push_object(json_object_new_int((
int) *(int16_t*) param));
168 push_object(json_object_new_int((
int) *(uint16_t*) param));
171 push_object(json_object_new_int((
int) *(int32_t*) param));
174 push_object(json_object_new_int((
int) *(uint32_t*) param));
177 push_object(json_object_new_int((
int) *(int64_t*) param));
180 push_object(json_object_new_int((
int) *(uint64_t*) param));
183 push_object(json_object_new_double(
187 push_object(json_object_new_double(
191 push_object(json_object_new_double(
195 SG_ERROR(
"Not supported for complex128_t for writing into JsonFile!");
198 SG_ERROR(
"Implementation error during writing JsonFile!");
200 case PT_UNDEFINED:
default:
201 SG_ERROR(
"Implementation error: undefined primitive type\n");
206 if (is_error(m_stack_stream.back()))
213 CSerializableJsonFile::write_cont_begin_wrapped(
216 push_object(json_object_new_array());
219 json_object_array_add(m_stack_stream.back(),
220 json_object_new_array());
226 CSerializableJsonFile::write_cont_end_wrapped(
233 CSerializableJsonFile::write_string_begin_wrapped(
236 push_object(json_object_new_array());
242 CSerializableJsonFile::write_string_end_wrapped(
249 CSerializableJsonFile::write_stringentry_begin_wrapped(
256 CSerializableJsonFile::write_stringentry_end_wrapped(
259 json_object* array = m_stack_stream.get_element(
260 m_stack_stream.get_num_elements() - 2);
262 if (json_object_array_put_idx( array, y, m_stack_stream.back()))
270 CSerializableJsonFile::write_sparse_begin_wrapped(
273 push_object(json_object_new_object());
275 json_object* buf = json_object_new_array();
279 json_object_object_add(m_stack_stream.back(),
280 STR_KEY_SPARSE_FEATURES, buf);
287 CSerializableJsonFile::write_sparse_end_wrapped(
295 CSerializableJsonFile::write_sparseentry_begin_wrapped(
299 json_object* buf = json_object_new_object();
300 if (json_object_array_put_idx(m_stack_stream.back(), y, buf))
305 buf = json_object_new_int(feat_index);
309 json_object_object_add(m_stack_stream.back(),
310 STR_KEY_SPARSE_FEATINDEX, buf);
316 CSerializableJsonFile::write_sparseentry_end_wrapped(
320 json_object* o = m_stack_stream.get_element(
321 m_stack_stream.get_num_elements() - 2);
323 json_object_object_add(o, STR_KEY_SPARSE_ENTRY,
324 m_stack_stream.back());
326 pop_object(); pop_object();
331 CSerializableJsonFile::write_item_begin_wrapped(
338 CSerializableJsonFile::write_item_end_wrapped(
341 json_object* array = m_stack_stream.get_element(
342 m_stack_stream.get_num_elements() - 2);
345 array = json_object_array_get_idx(array, x);
347 json_object_array_put_idx(array, y, m_stack_stream.back());
354 CSerializableJsonFile::write_sgserializable_begin_wrapped(
355 const TSGDataType* type,
const char* sgserializable_name,
356 EPrimitiveType
generic)
358 if (*sgserializable_name ==
'\0') {
363 push_object(json_object_new_object());
366 buf = json_object_new_string(sgserializable_name);
370 json_object_object_add(m_stack_stream.back(),
371 STR_KEY_INSTANCE_NAME, buf);
376 buf = json_object_new_string(buf_str);
380 json_object_object_add(m_stack_stream.back(),
381 STR_KEY_GENERIC_NAME, buf);
384 buf = json_object_new_object();
387 json_object_object_add(m_stack_stream.back(), STR_KEY_INSTANCE,
395 CSerializableJsonFile::write_sgserializable_end_wrapped(
396 const TSGDataType* type,
const char* sgserializable_name,
397 EPrimitiveType
generic)
399 if (*sgserializable_name ==
'\0')
return true;
406 CSerializableJsonFile::write_type_begin_wrapped(
407 const TSGDataType* type,
const char* name,
const char* prefix)
409 json_object* buf = json_object_new_object();
413 json_object_object_add(m_stack_stream.back(), name, buf);
418 buf = json_object_new_string(str_buf);
422 json_object_object_add(m_stack_stream.back(), STR_KEY_TYPE, buf);
428 CSerializableJsonFile::write_type_end_wrapped(
429 const TSGDataType* type,
const char* name,
const char* prefix)
431 json_object_object_add(
432 m_stack_stream.get_element(
433 m_stack_stream.get_num_elements() - 2), STR_KEY_DATA,
434 m_stack_stream.back());