Перейти к содержимому
Открыть в приложении

Лучший способ просмотра. Узнать больше.

АнимеФорум

Полноэкранное приложение на домашнем экране с push-уведомлениями, значками и другими функциями.

Чтобы установить это приложение на iOS и iPados
  1. Нажмите на иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите Добавить на домашний экран.
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите на меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на домашний экран или Установить приложение.
  3. Подтвердите, нажав Установить.

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

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

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

 

/*
*  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 (см. историю изменений)

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

Рекомендуемые ответы

  • Автор

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

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

Отредактировано от DarkSerj (см. историю изменений)

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

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

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

 

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

 

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

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

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

 

[Haruko Momoi Fans Team]

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

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

 

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

 

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

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

 

[Haruko Momoi Fans Team]

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

 

нэ?

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

 

[Haruko Momoi Fans Team]

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

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

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

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

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

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

 

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

[Alternative team][Drums team]

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

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

Vulpes pilum mutat, non mores

  • Автор

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

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

 

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

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

:blink:

Круто!

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

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

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

[true Sexuality Team]

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

 

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

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

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

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

  • Автор

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

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

При хорошей женщине и мужчина может стать человеком.
DarkSerj , тебе-бы моего братика сбагрить... Он мечтает стать программистом :)

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

Vulpes pilum mutat, non mores

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

как красиво *__*

здорово..х)

зззык...зззык...

или просто: ззззз... равномерное попадается ©

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

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

Гость
Ответить на эту тему...

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

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

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

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления в браузере

Chrome (Android)
  1. Нажмите на значок замка рядом с адресной строкой.
  2. Выберите Разрешения → Уведомления.
  3. Настройте предпочтения.
Chrome (Desktop)
  1. Нажмите на значок замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите пункт Уведомления и настройте параметры по своему усмотрению.