Re[3]: Динамическое определение типа?
От: Кодт Россия  
Дата: 22.08.06 17:51
Оценка: 3 (1)
Здравствуйте, CheckiSt, Вы писали:

CS>Вот такое решение я имею на данный момент:

CS>  if ( m_CanvasBPP == 3 )
CS>  {
CS>    pixf24.reset(new aggpxfmt24((agg::rendering_buffer &)*rbuf.get()));
CS>    ren_aa24.reset(new RenderBase24((aggpxfmt24 &)*pixf24.get()));
CS>    ren_oaa24.reset(new RenderOAA24((RenderBase24 &)*ren_aa24.get(), (LineProfAA &)*prof.get()));
CS>    ras_oaa24.reset(new RasterOAA24((RenderOAA24 &)*ren_oaa24.get()));
CS>  }
CS>  else if ( m_CanvasBPP == 4 )
CS>  {
CS>    pixf32.reset(new aggpxfmt32((agg::rendering_buffer &)*rbuf.get()));
CS>    ren_aa32.reset(new RenderBase32((aggpxfmt32 &)*pixf32.get()));
CS>    ren_oaa32.reset(new RenderOAA32((RenderBase32 &)*ren_aa32.get(), (LineProfAA &)*prof.get()));
CS>    ras_oaa32.reset(new RasterOAA32((RenderOAA32 &)*ren_oaa32.get()));  
CS>  }
      
CS>  m_blIsLockDraw = true;

CS>  if ( ras_oaa24 )
CS>    ras_oaa24->add_path(*this);
CS>  else if ( ras_oaa32 )
CS>    ras_oaa32->add_path(*this);


Во-первых, шаблоны вместо копипаста.
template<class AggPxFormat, RenderBase, RenderOAA, RasterOAA>
struct canvas_traits_base
{
    typedef AggPxFormat aggpxfmt;
    .....
};
template<int BPP> struct canvas_traits {};
template<> struct canvas_traits<3> : canvas_traits_base<aggpxfmt24, RenderBase24, RenderOAA24, RasterOAA24> {};
template<> struct canvas_traits<4> : canvas_traits_base<aggpxfmt32, RenderBase32, RenderOAA32, RasterOAA32> {};
.....

Во-вторых, полиморфизм времени компиляции
// алгоритм, относящийся только к одному значению BPP выделяем в шаблон функции
template<int BPP> void YourClass::foo_impl(int2type<BPP> tag, SomePtr rbuf)
{
    typedef canvas_traits<BPP> ct;
    typedef typename ct::aggpxfmt aggpxfmt;
    .....
    // возможно, что вместо auto_ptr / shared_ptr достаточно scoped_ptr
    scoped_ptr<aggpxfmt> pixf( new aggpxfmt((agg::rendering_buffer&)*rbuf.get()) );
    scoped_ptr<renderbase> ren_aa( new renderbase(*pixf) );
    scoped_ptr<renderoaa> ren_oaa( new renderoaa(*ren_aa) );
    scoped_ptr<rasteroaa> ras_oaa( new rasteroaa(*ren_oaa) );
    
    ras_oaa->add_path(*this);
    .....
}

В-третьих, полиморфизм времени исполнения
// все ветвления сделаем единожды в функции-диспетчере
void YourClass::foo(SomePtr rbuf)
{
    switch(m_CanvasBPP)
    {
    case 3: foo_impl(int2type<3>, rbuf); break;
    case 4: foo_impl(int2type<4>, rbuf); break;
    }
}

Вместо switch можно завести массив указателей на функции или объекты с виртуальными методами — но это уже по желанию.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Динамическое определение типа?
От: ArtDenis Россия  
Дата: 22.08.06 13:44
Оценка: 2 (1)
Э-э.... Может я что-то не понимаю, но разве полиморфизм на основе виртуальных функций не позволяет решить эту задачу?
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[5]: Динамическое определение типа?
От: ArtDenis Россия  
Дата: 22.08.06 13:53
Оценка: +1
Здравствуйте, CheckiSt, Вы писали:
AD>> разве полиморфизм на основе виртуальных функций не позволяет решить эту задачу?

CS>Ммм... Получается лишний вызов функции против создания четырёх указателей. Вы считаете, это оправдано?


Если учесть, что я до сих пор не понял о чём речь (в частности, сбивает с толку назвние топика: "Динамическое определение типа?"), то отвечу честно: не знаю
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Динамическое определение типа?
От: CheckiSt Россия  
Дата: 22.08.06 10:11
Оценка:
Возникла следующая задача:
1. На отрисовку приходит буфер в формате rgb24 или rgba32 (заранее неизвестно).
2. Для отрисовки пользуемся набором средств, привязанных к формату (типом каждого объекта).

Пока решил дублированием typedef и объектов для разных режимов:
...
  typedef pixfmt_rgb24                        pxfmt24;
  typedef renderer_base<pxfmt24>              RenderBase24;
...
  typedef pixfmt_rgba32                       pxfmt32;
  typedef renderer_base<pxfmt32>              RenderBase32;
...


Подскажите, пожалуйста, решение разумнее
Re: Динамическое определение типа?
От: ArtDenis Россия  
Дата: 22.08.06 10:57
Оценка:
CheckiSt пишет:
> ...
> Пока решил дублированием typedef и объектов для разных режимов:
> ...
Я не особо понял, как это помогает в решении твоей задачи...
Posted via RSDN NNTP Server 2.0
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: Динамическое определение типа?
От: CheckiSt Россия  
Дата: 22.08.06 13:04
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Я не особо понял, как это помогает в решении твоей задачи...


Вот такое решение я имею на данный момент:
  if ( m_CanvasBPP == 3 )
  {
    pixf24.reset(new aggpxfmt24((agg::rendering_buffer &)*rbuf.get()));
    ren_aa24.reset(new RenderBase24((aggpxfmt24 &)*pixf24.get()));
    ren_oaa24.reset(new RenderOAA24((RenderBase24 &)*ren_aa24.get(), (LineProfAA &)*prof.get()));
    ras_oaa24.reset(new RasterOAA24((RenderOAA24 &)*ren_oaa24.get()));
  }
  else if ( m_CanvasBPP == 4 )
  {
    pixf32.reset(new aggpxfmt32((agg::rendering_buffer &)*rbuf.get()));
    ren_aa32.reset(new RenderBase32((aggpxfmt32 &)*pixf32.get()));
    ren_oaa32.reset(new RenderOAA32((RenderBase32 &)*ren_aa32.get(), (LineProfAA &)*prof.get()));
    ras_oaa32.reset(new RasterOAA32((RenderOAA32 &)*ren_oaa32.get()));  
  }
      
  m_blIsLockDraw = true;

  if ( ras_oaa24 )
    ras_oaa24->add_path(*this);
  else if ( ras_oaa32 )
    ras_oaa32->add_path(*this);


Все переменные объявлены как boost::shared_ptr, поэтому фактически память я выделяю только под то, подо что мне нужно. Теперь меня интересует, есть ли более разумное решение.
Re[4]: Динамическое определение типа?
От: CheckiSt Россия  
Дата: 22.08.06 13:50
Оценка:
AD> разве полиморфизм на основе виртуальных функций не позволяет решить эту задачу?

Ммм... Получается лишний вызов функции против создания четырёх указателей. Вы считаете, это оправдано?
Re[6]: Динамическое определение типа?
От: CheckiSt Россия  
Дата: 22.08.06 13:56
Оценка:
AD>Если учесть, что я до сих пор не понял о чём речь (в частности, сбивает с толку назвние топика: "Динамическое определение типа?"), то отвечу честно: не знаю

Это всё потому что кто-то бестолково сформулировал тему... Но возможный ход решения Вы подсказали, спасибо
Re[4]: Динамическое определение типа?
От: Vain Россия google.ru
Дата: 22.08.06 18:32
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Во-вторых, полиморфизм времени компиляции

К>
К>// алгоритм, относящийся только к одному значению BPP выделяем в шаблон функции
К>template<int BPP> void YourClass::foo_impl(int2type<BPP> tag, SomePtr rbuf)
К>{
К>    .....
К>}
К>

Можно красивее:
template<int PTTN> struct pattern_holder { enum { val = PTTN }; };
void YourClass::foo_impl(SomePtr rbuf,pattern_holder<0> Pttn = pattern_holder<0>());
void YourClass::foo_impl(SomePtr rbuf,pattern_holder<1> Pttn);

получаем алгоритм по умолчанию, можно вбить для rgba32
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.