Jump to content
АнимеФорум

Recommended Posts

Posted (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 by DarkSerj (see edit history)
Posted
Вот решил поделиться своим творчеством, не знаю, наверное надо над собой еще работать.

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

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

 

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

 

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

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

Posted

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

 

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

 

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

Posted

Знаю! Объекты не хотели сереализоваться, т.к. были объявлены неправильно :angry:

 

нэ?

Posted

А мона я свой курсовик по C++ вылажу, любезно мне другом написанный? :angry:

*тока начал забывать об инсте, так мне опять напомнили, что я ламер...*

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

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

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

 

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

Posted

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

 

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

Posted

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

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...

Important Information