aboutsummaryrefslogtreecommitdiffstats
path: root/meowpp/oo/ObjPort.hpp
blob: d458adfe88d98fcf466217eec4421be0dad7317c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "ObjPort.h"

#include "ObjSelector.h"
#include "ObjBase.h"

#include <cstdio>

namespace meow{
  template<size_t sid>
  inline ObjPort::ObjBase* read(FILE* __f, bool __binary){
    char name[1024];
    unsigned int fg;
    if(__binary){
      size_t len;
      if(fread(&len, sizeof(size_t), 1, __f) <   1) return NULL;
      if(fread(name, sizeof(char), len, __f) < len) return NULL;
      if(fread(&fg, sizeof(unsigned int), 1, __f) < 1) return NULL;
      name[len] = '\0';
    }else{
      fscanf(__f, "%s %u", name, &fg);
    }
    ObjBase* ret = Selector<sid>(name);
    if(ret->read(__f, __binary, fg) == false){
      delete ret;
      ret = NULL;
    }
    return ret;
  }
  
  
  template<size_t sid>
  inline ObjPort::bool write(FILE* __f, bool __binary,
                             ObjBase* __obj, unsigned int __fg){
    std::string name = Selector<sid>::find(__obj);
    if(__binary){
      size_t len = name.size();
      if(fwrite(&len, sizeof(size_t), 1, __f) < 1) return false;
      if(fwrite(name.c_str(), sizeof(char), len, __f) < len) return false;
      if(fwrite(&__fg, sizeof(unsigned int), 1, __f) < len) return false;
    }else{
      if(fprintf(__f, "%s %u\n", name.c_str(), __fg) < 2) return false;
    }
    return __obj->write(__f, __binary, __fg);
  }
}

#endif // oo_ObjPort_H__