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

DarkSerj

Старожилы
  • Зарегистрирован

  • Посещение

Весь контент DarkSerj

  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 Я знаю, что это не совершенство, надеюсь на разумную критику...
  4. Vermilion Ну так и было написанно, очередной флуд :blink: Ну и по тематике, еще как говаривал один из героев нашей мультипликации: "Люби себя, чихай на всех, и в жизни ждет тебя успех!"
  5. Шагающий Экскаватор Отличный развернуты комментарий :) Если честно, то я не понял смысла твоей истории про Трагическую Любовь... Ну да ладно. Мне кажеться что для данной темы это не критично. И, эээ... , ну я эти вопросы поднимал не для того, что бы мне на них отвечали, а для того, что бы каждый нашел ответы для себя. Существует такой способ проведения диспута, своими вопросами подталкивать оппонента к нужным тебе выводам...
  6. Chudo Ты когда пишешь слово "бог" с большой буквы подразумеваешь кого-то конкретного ;) или убирай скобки или большую букву ;) а то как-то странно выглядит :) Отвечая на поставленный вопрос, я могу верить в бога и не любить его, а на пример бояться.
  7. Chudo Это ж, простите, чем это они взаимосвязанны? А если, как Nabbe говорит, это все оторвать от контекста... то получится замечательный разговор ни о чем, и главное все участники будут уверенны, что прекрасно понимают друг друга ;) Ну так, для примера: Можешь ли ты верить человеку и при этом не любить его? Верить в бога(любого) и не любить его? Можно ли любить сказки и не верить в них? ну вобщем вариантов масса, в которых даже с семантической точки зрения прослеживается некоторая не адекватность темы ;)
  8. Как-то оно странно звучит, тебе не кажется что на вкус и цвет фломастер разный? Мне кажется что от перемены мест слагаемых здесь сумма меняется очень сильно? ;) Хм.. чем больше я задумываюсь над такой постановкой вопроса, тем обсурднее он мне кажется, но это сугубо мое мнение...
  9. "Слово «ведьма» происходит от «ведать» – знать и обозначало женщину, знающую больше других, да еще вооруженную чисто женской интуицией. Ведовство – понимание скрытых чувств и мотивов поступков у людей, качество, вызванное тесной и многогранной связью с природой. Это вовсе не злое и безумное начало в женщине, а проницательность. Наши предки изменили это понимание благодаря влиянию Запада в средневековье и христианской религии, взявшей у еврейской дикое, я сказал бы – безумное, расщепление мира на небо и ад и поместившей женщину на адской стороне! А я всегда готов, образно говоря, поднять бокал за ведьм, проницательных, веселых, сильных духом женщин, равноценных мужчинам! " (с) Иван Ефремов "Лезвие Бритвы" И я почему-то с ним полностью солидарен :unsure:
  10. А у меня сегодня последний зачет! И все! Первый курс с успехом закончен. Осталось дождаться зачета :)
  11. На сколько верно сказанно, готов подписаться под каждым словом :lol: Недавно попробовал сырых креветок, не понравилось, но с голодухи... должно быть очень даже ничего :lol:
  12. Йору безусловно, я буду нежен и аккуратен :lol: Multyashka это была модификация обобщенного закона Ньютона-Архимеда :lol:
  13. Тело сохраняет равномерную координацию, до тех пор, пока жидкость погруженная в это тело не выведет его из этого состояния. Так что действительно, я очень извиняюсь за свою не доработку, и обещаю в следующий раз закинуть тебя на плече без эксцессов ;)
  14. Так просто не отделаешься, я буду требовать сатисфакции :) Дракат и Крыс, фотки получились замечательные, прям радостно их рассматривать :)
  15. Ну что я могу сказать, это было замечательно, сегодня с утра проснулся с улыбкой на лице. Жизнь прекрасна. Ра, тебе отдельное спасибо за содержимое твоего рюкзачка :P это было как раз то чего не хватало :)
  16. Жизнь прекрасна!
  17. А просто по неосторожности? ;)
  18. Жизнь удалась.... только болят все мышцы. Я давно так не развлекался. Всем участникам большое человеческое спасибо! Даже не знаю, что еще прокомментировать, разве свое недоумение по поводу того, что никого не искупали ;)
  19. Хм, Лиса, ты это о чем... а то мне в голову чего-то из твоих недостатков не приходит, из тех которые подходят под данные критерии ;)
  20. Ну например, наглость - второе счастье ;)
  21. Как бы нибыло плохо...
  22. Эээ... не читал, не знаю.... Но если ты себе трезво отдаешь отчет в том, что это недостатки, то чего их любить?
  23. Лиса Недостатки не надо любить, с ними надо бороться :wub:
  24. "Люби себя, чихай на всех и в жизни ждет тебя успех!" и - Чертенок №13, кого должен любить черт? - Её... обе цитаты из старого мультфильма... Я люблю тебя жизнь, И похоже что это взаимно...
  25. Жизнь удалась, сначала офф, потом шашлыки, и сейчас опять уйду пить текилу :) На роликах покатался, чего-то правда мало колес на всех было... Еджи, ты молодец! Ра ты просто не подражаем, впрочем как и всегда. Джей а тебе надо больше кататься, одназначна -_- Вобщем ЖИЗНЬ УДАЛАСЬ!

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

Мы разместили 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.