DarkSerj Posted July 5, 2005 Report Posted July 5, 2005 (edited) Вот решил поделиться своим творчеством, не знаю, наверное надо над собой еще работать.Вообщем, критикуйте.... /* * mserializer.h * iAtlasCtl * * Created by __OwnerName__ on 01.02.05. * Copyright 2005 __MyCompanyName__. All rights reserved. * */ #ifndef __MSERIALIZER_H__ #define __MSERIALIZER_H__ #include <common/mstring.h> #include <common/marray.h> #include <common/mhash.h> #include <common/mexception.h> #include <string.h> #include <errno.h> #define BEGIN_SERIALIZER(name) \ struct DefaultSerializer: public BaseSerializer<name> { \ DefaultSerializer():BaseSerializer<name>(#name) { #define END_SERIALIZER }}; #define PROPERTY(Class,Var) Simple(#Var,(&Class::Var)); #define BASE_PROPERTY(Type,Class,Var) Simple(#Var,reinterpret_cast<Type Class::*>(&Class::Var)); #define COLLECTION(Class,Var) Array(#Var,&Class::Var); #define BASE_COLLECTION(Type,Class,Var) Array(#Var,reinterpret_cast<Type Class::*>(&Class::Var)); template <typename StructType> struct FieldAttrubute { MString Name; FieldAttrubute() {} FieldAttrubute(const char *name):Name(name) {} virtual int Read(StructType &data,const MString &s, int start=0) const {return 0;} virtual void Write(StructType &data,MString &s) const {} }; template<typename StructType, typename FieldType> struct FieldBaseAttribute: public FieldAttrubute<StructType> { FieldType StructType::* Ptr; FieldBaseAttribute() {} FieldBaseAttribute(const char *n,FieldType StructType::* p):FieldAttrubute<StructType>(n),Ptr(p) {} virtual void Write(StructType &data,MString &s) const { Serialize(data.*Ptr,s); } virtual int Read(StructType &data,const MString &s, int start=0) const { return Unserialize(data.*Ptr,s,start); } }; template<typename StructType, typename FieldType> struct ArrayAttribute: public FieldAttrubute<StructType> { FieldType StructType::* Ptr; ArrayAttribute() {} ArrayAttribute(const char *n,FieldType StructType::* p):FieldAttrubute<StructType>(n),Ptr(p) {} virtual void Write(StructType &data,MString &s) const { (data.*Ptr).Serialize(s); } virtual int Read(StructType &data,const MString &s, int start=0) const { return (data.*Ptr).Unserialize(s,start); } }; template<typename DataObject> struct BaseSerializer { MArray<FieldAttrubute<DataObject>*,FieldAttrubute<DataObject> *> attr; MString objectname; BaseSerializer(const char* name):objectname(name) {} BaseSerializer(){} ~BaseSerializer() { for(int i=0;i<attr.GetSize();i++) delete attr[i]; } template<typename T> void Simple(const char *name,T DataObject::* ptr) { attr.Add(new FieldBaseAttribute<DataObject,T>(name,ptr)); } template<typename T> void Array(const char *name,T DataObject::* ptr) { attr.Add(new ArrayAttribute<DataObject,T>(name,ptr)); } }; template<typename T> int Unserialize( T &data , const MString &s, int start = 0) { static typename T::DefaultSerializer layout; MString &objectname = layout.BaseSerializer<T>::objectname; MArray<FieldAttrubute<T>*,FieldAttrubute<T> *> &attr = layout.BaseSerializer<T>::attr; int sz; //check type if(s[start] != 'O') throw MException(__FILE__,__LINE__,"Trying to unserialize non-object"); start += 2; MString classname; sz = strtol(&s[start],NULL,0); if(!sz && errno == EINVAL) throw MException(__FILE__,__LINE__,"Invalid classname size representation at position %d [%s]",start,s.CStr()); start = s.Find(':',start); classname = s.Substr(start+2,start+2+sz); if(strncasecmp(classname.CStr(),objectname.CStr(),classname.GetSize()) != 0) throw MException(__FILE__,__LINE__,"Trying to unserialize object [%s] from object [%s]",objectname.CStr(),classname.CStr()); start=s.Find(':',start+2+sz)+1; sz = strtol(&s[start],NULL,0); start = s.Find('{',start)+1; while(sz-- && s[start] != '}') { int i; MString varname; start = Unserialize(varname,s,start); for(i=0;(i < attr.GetSize()) && (strncasecmp(varname.CStr(),attr[i]->Name.CStr(),varname.GetSize()) != 0);i++); if(i == attr.GetSize()) throw MException(__FILE__,__LINE__,"Property [%s] for object not supported",varname.CStr(),classname.CStr()); if(s[start] == 'N') start += 2; else start = attr[i]->Read(data,s,start); } return start+1; } template<typename T> void Serialize(T &data,MString &s) { static typename T::DefaultSerializer layout; MString &objectname = layout.BaseSerializer<T>::objectname; MArray<FieldAttrubute<T>*,FieldAttrubute<T> *> &attr = layout.BaseSerializer<T>::attr; objectname.ToLower(); s += MString("O:%d:\"%s\":%d:{", objectname.GetSize(),objectname.CStr(),attr.GetSize()); for(int i=0;i<attr.GetSize();i++) { MString &varname = attr[i]->Name; s += MString("s:%d:\"%s\";",varname.GetSize(),varname.CStr()); attr[i]->Write(data,s); } s += "}"; } template<> void Serialize(int &value,MString &s); template<> void Serialize(bool &value,MString &s); template<> void Serialize(double &value,MString &s); template<> void Serialize(MString &value,MString &s); template<> int Unserialize<int>(int &value,const MString &s, int start); template<> int Unserialize(bool &value,const MString &s, int start); template<> int Unserialize(double &value,const MString &s, int start); template<> int Unserialize(MString &value,const MString &s, int start); #endif Я знаю, что это не совершенство, надеюсь на разумную критику... Edited July 5, 2005 by DarkSerj (see edit history) Quote
DarkSerj Posted July 5, 2005 Author Report Posted July 5, 2005 (edited) Ну вот, не ценят тут полет творческой мысли....А я, между прочим, на это решение две недели потратил.... Edited July 5, 2005 by DarkSerj (see edit history) Quote
evil Posted July 5, 2005 Report Posted July 5, 2005 Вот решил поделиться своим творчеством, не знаю, наверное надо над собой еще работать.Вообщем, критикуйте....Смело, остро. Не хватает пафоса А я, между прочим, на это решение две недели потратил.... Не правда! Если память не изменяет, это болванка для COM-Сервера.Ее VS автоматом генерит. Quote
DarkSerj Posted July 5, 2005 Author Report Posted July 5, 2005 Не правда! Если память не изменяет, это болванка для COM-Сервера.Ее VS автоматом генерит.Тебе память изменяет очень сильно, автогенеренного кода здесь только комментарий в начале...Но две недели ушло не на написание, а на придумывание и отработку разных вариантов... Quote
evil Posted July 5, 2005 Report Posted July 5, 2005 Ой! И правда, ляпнул не подумавши :angry: Ну и правда - код как код. А что за варианты были на две недели? Рекурсии не было? Или другая форма описания заголовков объектов? Quote
evil Posted July 5, 2005 Report Posted July 5, 2005 Знаю! Объекты не хотели сереализоваться, т.к. были объявлены неправильно :angry: нэ? Quote
DarkSerj Posted July 5, 2005 Author Report Posted July 5, 2005 А что за варианты были на две недели? Рекурсии не было? Или другая форма описания заголовков объектов?Ну были варианты со статичной таблицей свойств, но этот вариант почему-то не работает. Предположительно ошибка в кодогенерации GCC 4.0.Далее были сложности с приведением типов из базовых классов, если сериализовать свойства самого класса, то проблем нет, а если базового, то там были некоторые сложности с вычислением смещения относительно начала производного класса.Ну это такие, крупные моменты, а так было множество неучтенных моментов, ошибки, и время потраченое на отладку... Если нравиться то могу предложить что-то из раннего.... Quote
Vermilion Posted July 5, 2005 Report Posted July 5, 2005 А мона я свой курсовик по C++ вылажу, любезно мне другом написанный? :angry:*тока начал забывать об инсте, так мне опять напомнили, что я ламер...* Quote
Лиса Posted July 6, 2005 Report Posted July 6, 2005 Подумываю о закрытии темы... Да,да... Я слышала, программирование - тоже творчество... Но это мало кому дано оценить ;) В отличие от ИЗО и музыки... Quote
DarkSerj Posted July 6, 2005 Author Report Posted July 6, 2005 Я слышала, программирование - тоже творчество... Но это мало кому дано оценить :) В отличие от ИЗО и музыки...Если у человека нет вкуса, то его (вкус) надо воспитать... Я подумываю, ради простоты и внятности, начать все ж с более ранних работ... Quote
Джеймс Posted July 6, 2005 Report Posted July 6, 2005 :blink: Круто! Серж, молодца! *чмак в нос* Quote
AstralTech Posted July 6, 2005 Report Posted July 6, 2005 Да, Пушкин атдыхает! ИМХО, сюжет надо чуть чуть подправить, и побольше реализма в отношениях Анны Карениной и Льва Толстого - слишком напоминает отношения в "любовных романах". А в общем очень неплохо для первого раза. ПесшЫ есчо ^_^ Quote
DarkSerj Posted July 6, 2005 Author Report Posted July 6, 2005 А вот из раннего:/* STR.H - Header by Fantastic Constructions Group (FCG) 24.Oct.1995 * Used in STRING.CPP, DATETIME.H * * PLATFORM: None * CONTENTS: * Composed of class String declaration: * String - base class for string storage classes * Overload operators ( =, ==, >, <, ... ) can be used and very * comfortable. */ #if !defined(_MSTRING_H_) #define CP_1251 1 #define CP_KOI8 2 class MString { protected: char *data; int size; int total; int growsize; public: char operator == (const MString&); char operator == (const char*); char eq(const char*); // compare ignore case char operator != (const MString&); char operator != (const char*); friend char operator == (const char*, const MString&); friend char operator > (const MString&, const MString&); friend char operator > (const char *, const MString&); friend char operator > (const MString&, const char*); friend char operator < (const MString&, const MString&); friend char operator < (const char *, const MString&); friend char operator < (const MString&, const char*); MString Substr(int from,int to) const; int Find(char ch, int from=0) const; public: void ToLower(int cp=0); int IsBeginWith(MString &what); int IsBeginWith(const char *what, int len); const char *Format(char *format, ...); MString(); MString(const MString&); MString(const char *format, ... ); ~MString(); //memory managment void SetSize(int newsize,int growby=-1); inline int GetSize() const {return size;} void InsertAt(int dest,const char *src, int len); void RemoveAt(int pos,int len); inline operator char * () {return data;}; inline operator const char * () const {return data;}; inline const char * CStr() const {return (const char*)data;}; MString& operator = (const char*); MString& operator = (const MString&); MString& operator += (const MString&); MString& operator += (const char*); MString& operator += (const char); char& operator [] (int); void Remove(); void Serialize(MString &s); int Unserialize(const MString &s,int start = 0); }; MString operator + (const MString&, const MString&); MString operator + (const char *, const MString&); MString operator + (const MString&, const char*); #define _MSTRING_H_ #endif Quote
Лиса Posted July 6, 2005 Report Posted July 6, 2005 DarkSerj , тебе-бы моего братика сбагрить... Он мечтает стать программистом :) Quote
DarkSerj Posted July 7, 2005 Author Report Posted July 7, 2005 Лиса, я не могу перебегать дорогу Норо, он на твоего братика уже давно зубы точит... ;) Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.