Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удаленный вызов. детали, реализация, архитектура, у темы новое название! 
:(
    Опции темы
mes
Дата 22.12.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

Добавлено через 5 минут и 55 секунд
если объединять то код непоротливо выглядить начинает.. как надо оформить, еще надо подумать.. 



--------------------
PM MAIL WWW   Вверх
mes
Дата 22.12.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



еще раз приведу таблицу, пока она выглядит так :
Код


template < typename That
         , typename Im
         >
struct cls_method
{
  typedef void type (int const&); // !! todo
};

template < typename Seq  
         , typename That  
         , template <typename> class Storage 
         >
struct cls_table 

 : mpl::inherit_linearly< Seq,     
     mpl::inherit< 
       Storage< 
         typename cls_method<That, mpl::_2>::type     
       > , mpl::_1   
     > 
  >::type
{
    
    template <typename Im> 
    Storage<typename cls_method<That, Im>::type >&
    at () { 
       return Storage<typename cls_method<That, Im>::type >(); 
    }
};



Это сообщение отредактировал(а) mes - 22.12.2010, 13:58


--------------------
PM MAIL WWW   Вверх
mes
Дата 22.12.2010, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(mes @  22.12.2010,  12:42 Найти цитируемый пост)
typedef void type (int const&); // !! todo

примерно так :
Код

template < typename T
         , typename Im>
struct cls_method
{
   typedef
     typename mpl::push_front <
       typename mpl::push_front < 
         typename Im::args_invoked_t ,  T*
       >::type, void
     >::type 
   type;
};



--------------------
PM MAIL WWW   Вверх
mes
Дата 22.12.2010, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



что то lws опять капризничает :
Цитата

 Cannot create temporary directory


Это сообщение отредактировал(а) mes - 22.12.2010, 19:42


--------------------
PM MAIL WWW   Вверх
mes
Дата 22.12.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



запихнул таблицу в файл, подправил импульс и закоммител.. 

переходим к invoke...


--------------------
PM MAIL WWW   Вверх
mes
Дата 22.12.2010, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



какие виды инвокинга нам нужны ?
1. -> указатель на метод
2. -> функтор
3. -> выбор в таблице
пока достаточно..

для простоты пока допустим, что That передается как указатель..

тогда выглядеть будет где то так :
Код

template < typename Im
         , typename F
         , typename That >
void invoke ( F f
            , That * obj
            , Im const& im)
{
   fusion::invoke (f, 
     fusion::push_front(im._args_fused, obj) 
   );
}

template < typename Im
         , typename That >
void invoke ( typename cls_method<That, Im>::type
            , T* obj
            , Im const& im)
{
   invoke (boost::mem_fn(mtd), obj, im);
}


template < typename Im
         , typename That 
         , typename Seq  
         , template <typename> class Storage >
         
void invoke ( cls_table<Seq, That, Storage> const & tbl // *
            , T* obj
            , Im const& im)
{
   invoke (tbl.at<Im>(), obj, im);
}


* тогда в таблицу надо добавить константный метод at()..

Добавлено через 13 минут
Цитата(mes @  22.12.2010,  19:58 Найти цитируемый пост)
тогда в таблицу надо добавить константный метод at()..

добавил.. закоммител..

boostcoder, доводку инвокеров пока оставляю Вам..  
пока посмотрю, как дела на другом фронте.. 




Это сообщение отредактировал(а) mes - 22.12.2010, 21:00


--------------------
PM MAIL WWW   Вверх
mes
Дата 22.12.2010, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



немного теории:
для типонезависимой передачи используем migranta в качестве носителя,
полиморфное connection для доставки по сети,
sender - конвертация импульса в мигранта
responder - конвертация (свитч по ид) мигранта в импульс и передача его на  инвокинг..

для сендера и респондера задается область обрабатываемых импульсов (интерфейс)
т.е. для каждого класса импульсов (шаблоно-)генерируется  сендер и респондер..

на одном соединение может "висеть" сколь угодно "разнотипных" сендеров и респондеров.. 

Это сообщение отредактировал(а) mes - 22.12.2010, 22:08


--------------------
PM MAIL WWW   Вверх
mes
Дата 23.12.2010, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



продолжим..

вот набросок, чтоб видно было куда крутить педали :
Код

template <typename Seq  >
struct sender 
{
   template <typename Im>
   void send(Im const& im)
   {
     // MPL_ASSERT // Seq contain an Im
       _conn.send ( convert::to_migrant(im) );
   }
   sender (connection & c) 
     :_conn(c) 
   {
   }
   
   connection & _conn;
};

template < typename Table
         , typename That >             
struct dispatcher
{
    template <typename Im>
    void operator (Im const& im)
    { 
       invoke (_table, _that, im);
    }
    dispather (..) {}
    Table const & _table
    That          _that;
}

template <typename Seq, typename Dispatcher>
struct responder
{
    void response (migrant const& m)
    {
        do_switch<Seq>(m.id, _d);
    }    
    
    responder (..) {}
    
    Dispatcher _d;
   
};




--------------------
PM MAIL WWW   Вверх
mes
Дата 23.12.2010, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



sender предоставляет для пользователя шаблонный интерфейс, принимающий методы указанной последовательности,
конвертирующий в мигранта и отправляющий в соединение..  (*1)

респондер, получает мигранта, по свитчу вызывает соответсвующий шаблонный оператор () диспетчера., который происводит инвокинг  (*2)

(*1) соединение сендер должен получать не по ссылке , а связывать по подобию сигнал /слот..
т.е фактически можно связать сендер с респондером напрямую.. 

(*2) в предыдущем коде отражено не совсем правильно.. свитч должен получать не диспетчер, а хелпер, который преобразует мигранта в импульс и передаст диспетчеру.. 

Это сообщение отредактировал(а) mes - 23.12.2010, 01:15


--------------------
PM MAIL WWW   Вверх
mes
Дата 23.12.2010, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  22.12.2010,  21:14 Найти цитируемый пост)
Цитата

для сендера и респондера задается область обрабатываемых импульсов (интерфейс)
т.е. для каждого класса импульсов (шаблоно-)генерируется  сендер и респондер..

не могли бы Вы пояснить, буквально все ;)

для простых случаев : шаблонный класс инициализированный последовательностью, с шаблонной функций,
 в которой перед выполнением проверяется наличие  конкретизирующего типа в той последовательности.. (sender)
в более сложных, генерация на основе наследования, как cls_table.. 

Цитата(boostcoder @  22.12.2010,  21:14 Найти цитируемый пост)
Цитата

на одном соединение может "висеть" сколь угодно "разнотипных" сендеров и респондеров.. 

в теории понимаю, а как это реализовывается и применяться - нет.

у сендера вход шаблоногенируеммый, а выход функция , которою биндом можно связать со входом в соединение.. 
а у респондера наоборот выход шаблоногенерируемый, а вход постоянен, и также биндом.. 
Код

void on_send (migrant const& ); // sender 
void response (migrant const&); // responder

 


--------------------
PM MAIL WWW   Вверх
mes
Дата 23.12.2010, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вот этот код респондера точнее отражает суть
Код

template < typename Seq
         , typename D >
struct responder {
  void response (migrant const& m)
  {
     do_switch ( helper(_d, m) )
  }
  
  D _d;
  
  struct helper
  {
     template <typename Im>
     void operator ()
     {
        _d( convert::to_impulse<Im>(_migrant) );
     }
     helper(..) {}
     
     D _d;
     migrant const& _migrant;
  };  
};

смущает шаблонный оператор() без аргументов в хелпере..
если для респондера эта внуренняя структура, то для самого свитча подобное использование не очень естественно..
ему удобнее и логичнее использовать перегрузку..  в противном случае возникает проблема лишней прослойки..
по идеи можно добаить враппер каждому элементу Seq, но пока надо подумать, как что именно.. 




--------------------
PM MAIL WWW   Вверх
mes
Дата 26.12.2010, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вот пример инвокинга импульса по таблице нужному объекту :
 http://liveworkspace.org/code/e30be1fd1339...6fd016770f08a0a
компил-тайм выбор..

осталось респондер достряпать (для рантайм связки ), и можно переходить в режим рефакторинга.. 
 smile 


Это сообщение отредактировал(а) mes - 26.12.2010, 02:37


--------------------
PM MAIL WWW   Вверх
mes
Дата 26.12.2010, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(mes @  26.12.2010,  01:35 Найти цитируемый пост)
вот пример инвокинга импульса по таблице нужному объекту :
 http://liveworkspace.org/code/e30be1fd1339...6fd016770f08a0a

"по просьбам трудящихся" подправлено :
http://liveworkspace.org/code/7402bf06f1b4...8d47fb078ba6247
или так :
http://liveworkspace.org/code/84c56d9a6b7f...3202c82bffba623

с условным использованием потока вывода:
http://liveworkspace.org/code/6c62757ca271...098191913f88e31

Это сообщение отредактировал(а) mes - 26.12.2010, 16:23


--------------------
PM MAIL WWW   Вверх
mes
Дата 26.12.2010, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(mes @  26.12.2010,  01:35 Найти цитируемый пост)
осталось респондер достряпать

отказался от респондера в пользу свитчера.. 
http://liveworkspace.org/code/78491985c7c1...a4f2c397bf8e85f

Добавлено через 2 минуты и 19 секунд
теперь надо разрефакторить все, что есть.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 27.12.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



меня из бана выпустили
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1214 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.