Перейти к содержанию
АнимеФорум

Рекомендуемые сообщения

Опубликовано (изменено)

Вот решил поделиться своим творчеством, не знаю, наверное надо над собой еще работать.

Вообщем, критикуйте....

 

/*
*  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

 

Я знаю, что это не совершенство, надеюсь на разумную критику...

Изменено пользователем DarkSerj (смотреть историю редактирования)
Опубликовано
Вот решил поделиться своим творчеством, не знаю, наверное надо над собой еще работать.

Вообщем, критикуйте....

Смело, остро. Не хватает пафоса

 

А я, между прочим, на это решение две недели потратил....

 

Не правда! Если память не изменяет, это болванка для COM-Сервера.

Ее VS автоматом генерит.

Опубликовано

Ой! И правда, ляпнул не подумавши :angry:

 

Ну и правда - код как код.

 

А что за варианты были на две недели? Рекурсии не было? Или другая форма описания заголовков объектов?

Опубликовано

Я слышала, программирование - тоже творчество... Но это мало кому дано оценить :) В отличие от ИЗО и музыки...

Если у человека нет вкуса, то его (вкус) надо воспитать...

 

Я подумываю, ради простоты и внятности, начать все ж с более ранних работ...

Опубликовано

Да, Пушкин атдыхает! ИМХО, сюжет надо чуть чуть подправить, и побольше реализма в отношениях Анны Карениной и Льва Толстого - слишком напоминает отношения в "любовных романах".

 

А в общем очень неплохо для первого раза. ПесшЫ есчо ^_^

Опубликовано

А вот из раннего:

/*  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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...

Важная информация