Перейти к содержанию
Обновление форума
Опубликовано
comment_384153

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

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

 

/*
*  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 (смотреть историю редактирования)

При хорошей женщине и мужчина может стать человеком.

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

Опубликовано
  • Автор
comment_384159

Ну вот, не ценят тут полет творческой мысли....

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

Изменено пользователем DarkSerj (смотреть историю редактирования)

При хорошей женщине и мужчина может стать человеком.
Опубликовано
comment_384164
Вот решил поделиться своим творчеством, не знаю, наверное надо над собой еще работать.

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

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

 

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

 

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

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

Больше качественного аниме в России - [EIKENCLUB TEAM] - анимешники для анимешников

 

[Haruko Momoi Fans Team]

Опубликовано
  • Автор
comment_384167
При хорошей женщине и мужчина может стать человеком.
Опубликовано
comment_384169

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

 

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

 

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

Больше качественного аниме в России - [EIKENCLUB TEAM] - анимешники для анимешников

 

[Haruko Momoi Fans Team]

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

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

 

нэ?

Больше качественного аниме в России - [EIKENCLUB TEAM] - анимешники для анимешников

 

[Haruko Momoi Fans Team]

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

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

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

И в глазах твоих напротив

Плёнкою стеклянной слёзы

Сверкают словно звёзды

В небе, которое не достать мне рукой

 

[Idiot team][ЖЕСТЬ!!! team]

[Alternative team][Drums team]

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

[zoomdvich team][Made in Norway Team][Dea†h No†e Team]

Vulpes pilum mutat, non mores

Опубликовано
  • Автор
comment_384345

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

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

 

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

При хорошей женщине и мужчина может стать человеком.
Опубликовано
comment_384361

:blink:

Круто!

Серж, молодца! *чмак в нос*

Если ты собираешься просто стоять там и изводить себя , то снимай одежду и ложись. (с)

мАральный уроды Придурки style

[true Sexuality Team]

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

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

 

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

Жили - были три пятачка: Них, Нах и Нунах...

[sci-Fi Hentai] team [iNdiGo] team [Глинтвейн] team

Добро пожаловать в mIRCостадо, сынок!

Опубликовано
  • Автор
comment_384466

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

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

При хорошей женщине и мужчина может стать человеком.
Опубликовано
  • Автор
comment_385467
Лиса, я не могу перебегать дорогу Норо, он на твоего братика уже давно зубы точит... ;)
При хорошей женщине и мужчина может стать человеком.

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

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

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

Последние посетители 0

  • Ни одного зарегистрированного пользователя не просматривает данную страницу

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

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.