boost preprocessor - need help
От: nen777w  
Дата: 13.01.11 12:23
Оценка:
Застрял на такой задачи не могу придумать решение:
Имеется макрос который возвращает сиквенс состоящий из 0 и 1 например (0)(1)(0)
Нужно сделать между всеми элементами сиквенса операцию BOOST_PP_OR.
т.е.

BOOST_PP_OR(0,BOOST_PP_OR(1,0)) -> это должно в результате раскрыться в 1


Написал вот такой код:
#define _HBDB_SYNC_OPARENTHNESS() (
#define _HBDB_SYNC_CPARENTHNESS() )

#define MACRO_S( z, n, data ) \
    BOOST_PP_CAT(BOOST_PP_CAT(foo, BOOST_PP_CAT(_HBDB_SYNC_OPARENTHNESS(), BOOST_PP_SEQ_ELEM(n, data))),BOOST_PP_COMMA())

#define MACRO_F( z, n, data ) \
    _HBDB_SYNC_CPARENTHNESS()

#define _HBDB_SYNC_OR( seq ) \
    BOOST_PP_REPEAT( BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), MACRO_S, seq ) \
    BOOST_PP_SEQ_ELEM(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)),seq) \
    BOOST_PP_REPEAT( BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), MACRO_F, seq )


пока там написано foo (для тестирования макроса), раскрывается всё как нужно:

foo(0, foo(1, 0 ) )


если вместо foo написать BOOST_PP_OR получается такое:

BOOST_PP_BITOR_0BOOST_PP_BOOL(BOOST_PP_OR(0,)00 BOOST_PP_BITOR_1BOOST_PP_BOOL(BOOST_PP_OR(1,)11 0 ) )

Re: boost preprocessor - need help
От: jazzer Россия Skype: enerjazzer
Дата: 13.01.11 12:44
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Застрял на такой задачи не могу придумать решение:

N>Имеется макрос который возвращает сиквенс состоящий из 0 и 1 например (0)(1)(0)
N>Нужно сделать между всеми элементами сиквенса операцию BOOST_PP_OR.
N>т.е.
Я твой код не прогонял, но такое чувство, что ты делаешь что-то не то, простого FOLD должно быть достаточно.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: boost preprocessor - need help
От: nen777w  
Дата: 13.01.11 12:55
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, nen777w, Вы писали:


N>>Застрял на такой задачи не могу придумать решение:

N>>Имеется макрос который возвращает сиквенс состоящий из 0 и 1 например (0)(1)(0)
N>>Нужно сделать между всеми элементами сиквенса операцию BOOST_PP_OR.
N>>т.е.
J>Я твой код не прогонял, но такое чувство, что ты делаешь что-то не то, простого FOLD должно быть достаточно.

Проблему решил!!

#define MACRO_S( z, n, data ) \
    BOOST_PP_BITOR _HBDB_SYNC_OPARENTHNESS() BOOST_PP_SEQ_ELEM(n, data) BOOST_PP_COMMA()


Про FOLD не знал. Спасибо! Как то раньше не замечал его.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.