Перейти к содержимому

Фотография
- - - - -

Мои несколько строк


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 16

#1 DarkSerj

DarkSerj
  • Старожилы
  • PipPip
  • белобрысая бестия

  • Cообщений: 159
0
Обычный

Отправлено 06 Июль 2005 - 01:00

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

/*
 *  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: 06 Июль 2005 - 01:00

  • 0

#2 Йору

Йору
  • Старожилы
  • Другие: Участники
  • PipPipPipPipPip
  • ...не придумываеццо

  • Cообщений: 1 794
0
Обычный

Отправлено 06 Июль 2005 - 01:02

афтар выйди в акно -___-
  • 0

#3 DarkSerj

DarkSerj
  • Старожилы
  • PipPip
  • белобрысая бестия

  • Cообщений: 159
0
Обычный

Отправлено 06 Июль 2005 - 01:08

Ну вот, не ценят тут полет творческой мысли....
А я, между прочим, на это решение две недели потратил....

Сообщение отредактировал DarkSerj: 06 Июль 2005 - 01:08

  • 0

#4 evil

evil
  • Старожилы
  • PipPipPip
  • Отаку

  • Cообщений: 358
0
Обычный

Отправлено 06 Июль 2005 - 01:14

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

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

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


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

#5 DarkSerj

DarkSerj
  • Старожилы
  • PipPip
  • белобрысая бестия

  • Cообщений: 159
0
Обычный

Отправлено 06 Июль 2005 - 01:17

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

[url="index.php?act=findpost&pid=384164"><{POST_SNAPBACK}>[/url]

Тебе память изменяет очень сильно, автогенеренного кода здесь только комментарий в начале...
Но две недели ушло не на написание, а на придумывание и отработку разных вариантов...
  • 0

#6 evil

evil
  • Старожилы
  • PipPipPip
  • Отаку

  • Cообщений: 358
0
Обычный

Отправлено 06 Июль 2005 - 01:24

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

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

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

#7 evil

evil
  • Старожилы
  • PipPipPip
  • Отаку

  • Cообщений: 358
0
Обычный

Отправлено 06 Июль 2005 - 01:32

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

нэ?
  • 0

#8 DarkSerj

DarkSerj
  • Старожилы
  • PipPip
  • белобрысая бестия

  • Cообщений: 159
0
Обычный

Отправлено 06 Июль 2005 - 01:33

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

[url="index.php?act=findpost&pid=384169"><{POST_SNAPBACK}>[/url]

Ну были варианты со статичной таблицей свойств, но этот вариант почему-то не работает. Предположительно ошибка в кодогенерации GCC 4.0.
Далее были сложности с приведением типов из базовых классов, если сериализовать свойства самого класса, то проблем нет, а если базового, то там были некоторые сложности с вычислением смещения относительно начала производного класса.
Ну это такие, крупные моменты, а так было множество неучтенных моментов, ошибки, и время потраченое на отладку...

Если нравиться то могу предложить что-то из раннего....
  • 0

#9 Vermilion

Vermilion
  • Старожилы
  • PipPipPipPipPip
  • Counterfeit

  • Cообщений: 1 507
0
Обычный

Отправлено 06 Июль 2005 - 01:38

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

#10 Лиса

Лиса
  • Старожилы
  • PipPipPipPipPipPip
  • Штабс-капитанъ

  • Cообщений: 3 672
14
Обычный

Отправлено 06 Июль 2005 - 07:25

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

#11 DarkSerj

DarkSerj
  • Старожилы
  • PipPip
  • белобрысая бестия

  • Cообщений: 159
0
Обычный

Отправлено 06 Июль 2005 - 10:03


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

[url="index.php?act=findpost&pid=384258"><{POST_SNAPBACK}>[/url]

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

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

#12 Джеймс

Джеймс
  • Старожилы
  • PipPipPipPipPip
  • Да,детка, я урод.

  • Cообщений: 1 315
0
Обычный

Отправлено 06 Июль 2005 - 10:22

:blink:
Круто!
Серж, молодца! *чмак в нос*
  • 0

#13 AstralTech

AstralTech
  • Старожилы
  • PipPipPipPipPipPip
  • Prototype № 540.

  • Cообщений: 3 614
0
Обычный

Отправлено 06 Июль 2005 - 12:48

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

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

#14 DarkSerj

DarkSerj
  • Старожилы
  • PipPip
  • белобрысая бестия

  • Cообщений: 159
0
Обычный

Отправлено 06 Июль 2005 - 12:57

А вот из раннего:
/*  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

  • 0

#15 Лиса

Лиса
  • Старожилы
  • PipPipPipPipPipPip
  • Штабс-капитанъ

  • Cообщений: 3 672
14
Обычный

Отправлено 06 Июль 2005 - 22:01

DarkSerj , тебе-бы моего братика сбагрить... Он мечтает стать программистом :)
  • 0

#16 DarkSerj

DarkSerj
  • Старожилы
  • PipPip
  • белобрысая бестия

  • Cообщений: 159
0
Обычный

Отправлено 07 Июль 2005 - 11:31

Лиса, я не могу перебегать дорогу Норо, он на твоего братика уже давно зубы точит... ;)
  • 0

#17 Ася

Ася
  • Старожилы
  • PipPipPipPipPip
  • бестолочь

  • Cообщений: 1 324
0
Обычный

Отправлено 09 Июль 2005 - 13:45

как красиво *__*
здорово..х)
  • 0




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных