aboutsummaryrefslogtreecommitdiffstats
path: root/meowpp/oo/ObjPort.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'meowpp/oo/ObjPort.hpp')
-rw-r--r--meowpp/oo/ObjPort.hpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/meowpp/oo/ObjPort.hpp b/meowpp/oo/ObjPort.hpp
new file mode 100644
index 0000000..d458adf
--- /dev/null
+++ b/meowpp/oo/ObjPort.hpp
@@ -0,0 +1,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__