DarkSerj Опубликовано 5 июля, 2005 Жалоба Опубликовано 5 июля, 2005 (изменено) Вот решил поделиться своим творчеством, не знаю, наверное надо над собой еще работать.Вообщем, критикуйте.... /* * 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 Я знаю, что это не совершенство, надеюсь на разумную критику... Изменено 5 июля, 2005 пользователем DarkSerj (смотреть историю редактирования) Цитата
DarkSerj Опубликовано 5 июля, 2005 Автор Жалоба Опубликовано 5 июля, 2005 (изменено) Ну вот, не ценят тут полет творческой мысли....А я, между прочим, на это решение две недели потратил.... Изменено 5 июля, 2005 пользователем DarkSerj (смотреть историю редактирования) Цитата
evil Опубликовано 5 июля, 2005 Жалоба Опубликовано 5 июля, 2005 Вот решил поделиться своим творчеством, не знаю, наверное надо над собой еще работать.Вообщем, критикуйте....Смело, остро. Не хватает пафоса А я, между прочим, на это решение две недели потратил.... Не правда! Если память не изменяет, это болванка для COM-Сервера.Ее VS автоматом генерит. Цитата
DarkSerj Опубликовано 5 июля, 2005 Автор Жалоба Опубликовано 5 июля, 2005 Не правда! Если память не изменяет, это болванка для COM-Сервера.Ее VS автоматом генерит.Тебе память изменяет очень сильно, автогенеренного кода здесь только комментарий в начале...Но две недели ушло не на написание, а на придумывание и отработку разных вариантов... Цитата
evil Опубликовано 5 июля, 2005 Жалоба Опубликовано 5 июля, 2005 Ой! И правда, ляпнул не подумавши :angry: Ну и правда - код как код. А что за варианты были на две недели? Рекурсии не было? Или другая форма описания заголовков объектов? Цитата
evil Опубликовано 5 июля, 2005 Жалоба Опубликовано 5 июля, 2005 Знаю! Объекты не хотели сереализоваться, т.к. были объявлены неправильно :angry: нэ? Цитата
DarkSerj Опубликовано 5 июля, 2005 Автор Жалоба Опубликовано 5 июля, 2005 А что за варианты были на две недели? Рекурсии не было? Или другая форма описания заголовков объектов?Ну были варианты со статичной таблицей свойств, но этот вариант почему-то не работает. Предположительно ошибка в кодогенерации GCC 4.0.Далее были сложности с приведением типов из базовых классов, если сериализовать свойства самого класса, то проблем нет, а если базового, то там были некоторые сложности с вычислением смещения относительно начала производного класса.Ну это такие, крупные моменты, а так было множество неучтенных моментов, ошибки, и время потраченое на отладку... Если нравиться то могу предложить что-то из раннего.... Цитата
Vermilion Опубликовано 5 июля, 2005 Жалоба Опубликовано 5 июля, 2005 А мона я свой курсовик по C++ вылажу, любезно мне другом написанный? :angry:*тока начал забывать об инсте, так мне опять напомнили, что я ламер...* Цитата
Лиса Опубликовано 6 июля, 2005 Жалоба Опубликовано 6 июля, 2005 Подумываю о закрытии темы... Да,да... Я слышала, программирование - тоже творчество... Но это мало кому дано оценить ;) В отличие от ИЗО и музыки... Цитата
DarkSerj Опубликовано 6 июля, 2005 Автор Жалоба Опубликовано 6 июля, 2005 Я слышала, программирование - тоже творчество... Но это мало кому дано оценить :) В отличие от ИЗО и музыки...Если у человека нет вкуса, то его (вкус) надо воспитать... Я подумываю, ради простоты и внятности, начать все ж с более ранних работ... Цитата
Джеймс Опубликовано 6 июля, 2005 Жалоба Опубликовано 6 июля, 2005 :blink: Круто! Серж, молодца! *чмак в нос* Цитата
AstralTech Опубликовано 6 июля, 2005 Жалоба Опубликовано 6 июля, 2005 Да, Пушкин атдыхает! ИМХО, сюжет надо чуть чуть подправить, и побольше реализма в отношениях Анны Карениной и Льва Толстого - слишком напоминает отношения в "любовных романах". А в общем очень неплохо для первого раза. ПесшЫ есчо ^_^ Цитата
DarkSerj Опубликовано 6 июля, 2005 Автор Жалоба Опубликовано 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 Цитата
Лиса Опубликовано 6 июля, 2005 Жалоба Опубликовано 6 июля, 2005 DarkSerj , тебе-бы моего братика сбагрить... Он мечтает стать программистом :) Цитата
DarkSerj Опубликовано 7 июля, 2005 Автор Жалоба Опубликовано 7 июля, 2005 Лиса, я не могу перебегать дорогу Норо, он на твоего братика уже давно зубы точит... ;) Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.