您的位置:首页 > 其它

BOOST_PP_LOCAL_ITERATE() (局部迭代) 源码分析

2009-06-20 12:41 417 查看
该宏位于目录

boost/preprocessor/iteration/local.hpp


文档说它的作用是:

该宏将用户自定义宏 BOOST_PP_LOCAL_MACRO
BOOST_PP_LOCAL_LIMITS


所指定的区间中的值垂直展开。

还给出了一个例子:

#include <boost/preprocessor/iteration/local.hpp>
template<int> struct sample;
#define BOOST_PP_LOCAL_MACRO(n) /  
 template<> struct sample<n> { /     
 enum { value = n }; /   }; /   
/**/
#define BOOST_PP_LOCAL_LIMITS (1, 5)
#include BOOST_PP_LOCAL_ITERATE()



它将展开为:

template<> struct sample<1> { enum { value = 1 };
 template<> struct sample<2> { enum { value = 2 };
 template<> struct sample<3> { enum { value = 3 };
 template<> struct sample<4> { enum { value = 4 };
 template<> struct sample<5> { enum { value = 5 };



上面的代码在VC2008不能通过编译,但是这只需要一点修改,上面的代码修改为:

#include <boost/preprocessor/iteration/local.hpp>
template<int n> struct sample;
#define BOOST_PP_LOCAL_MACRO(n) template<> struct sample<n> {   enum { value = n }; };  //需要成为一行。  
#define BOOST_PP_LOCAL_LIMITS (1, 5)
#include BOOST_PP_LOCAL_ITERATE()



BOOST_PP_LOCAL_MACRO宏和BOOST_PP_LOCAL_LIMITS宏都是用户自定定义代码。

其中BOOST_PP_LOCAL_LIMITS的定义后面需要一个空格(至少)。像上面的

#define BOOST_PP_LOCAL_LIMITS (1,5)。这意味着(1,5)并不是宏的参数,或是一个整体。

而BOOST_PP_LOCAL_LIMITS本身就代表 (1,5)



BOOST_PP_LOCAL_ITERATE宏代码定义如下:

# define BOOST_PP_LOCAL_ITERATE() <boost/preprocessor/iteration/detail/local.hpp>
//这显然代表包括一个头文件,使用当然需要#include BOOST_PP_LOCAL_ITERATE()
//扩展为:
//#include <boost/preprocessor/iteration/detail/local.hpp>



local.hpp 的代码如下:

# if !defined(BOOST_PP_LOCAL_LIMITS)//用户自定义的范围,形如:(3,9)
#    error BOOST_PP_ERROR:  local iteration boundaries are not defined //没定义出错
# elif !defined(BOOST_PP_LOCAL_MACRO)//用户自定义的生成代码,像上面的举例
#    error BOOST_PP_ERROR:  local iteration target macro is not defined //没定义就要报错
# else
#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
         //BOOST_PP_TUPLE_ELEM(size, i, tuple) 宏参数第一个是tuple的大小
         //假如tuple为(2,3),这样size =2, i是索引,从0开始。如果 i =0结果就是2,
         //如果是i = 1,结果就是3
#        define BOOST_PP_LOCAL_S BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_LOCAL_LIMITS)
#        define BOOST_PP_LOCAL_F BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_LOCAL_LIMITS)
#    else
#        define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_LOCAL_LIMITS)
#        include <boost/preprocessor/iteration/detail/start.hpp>
#        define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_LOCAL_LIMITS)
#        include <boost/preprocessor/iteration/detail/finish.hpp>
#        define BOOST_PP_LOCAL_S BOOST_PP_LOCAL_SE()
#        define BOOST_PP_LOCAL_F BOOST_PP_LOCAL_FE()
#    endif
# endif
#
# if (BOOST_PP_LOCAL_S) > (BOOST_PP_LOCAL_F)//如果第一个元素只小于第二个
#    include <boost/preprocessor/iteration/detail/rlocal.hpp>
# else//否则执行
#    if BOOST_PP_LOCAL_C(0)  //# define BOOST_PP_LOCAL_C(n) (BOOST_PP_LOCAL_S) <= n && (BOOST_PP_LOCAL_F) >= n,这是判断是否在这个范围内
        BOOST_PP_LOCAL_MACRO(0) //用户自己写的代码。
#    endif
#    if BOOST_PP_LOCAL_C(1)
        BOOST_PP_LOCAL_MACRO(1)
#    endif
#    if BOOST_PP_LOCAL_C(2)
        BOOST_PP_LOCAL_MACRO(2)
#    endif
#    if BOOST_PP_LOCAL_C(3)
        BOOST_PP_LOCAL_MACRO(3)
#    endif
#    if BOOST_PP_LOCAL_C(4)
        BOOST_PP_LOCAL_MACRO(4)
#    endif
#    if BOOST_PP_LOCAL_C(5)
        BOOST_PP_LOCAL_MACRO(5)
#    endif
#    if BOOST_PP_LOCAL_C(6)
        BOOST_PP_LOCAL_MACRO(6)
#    endif
#    if BOOST_PP_LOCAL_C(7)
        BOOST_PP_LOCAL_MACRO(7)
#    endif
#    if BOOST_PP_LOCAL_C(8)
        BOOST_PP_LOCAL_MACRO(8)
#    endif
#    if BOOST_PP_LOCAL_C(9)
        BOOST_PP_LOCAL_MACRO(9)
#    endif
#    if BOOST_PP_LOCAL_C(10)
        BOOST_PP_LOCAL_MACRO(10)
#    endif
#    if BOOST_PP_LOCAL_C(11)
        BOOST_PP_LOCAL_MACRO(11)
#    endif
#    if BOOST_PP_LOCAL_C(12)
        BOOST_PP_LOCAL_MACRO(12)
#    endif
#    if BOOST_PP_LOCAL_C(13)
        BOOST_PP_LOCAL_MACRO(13)
#    endif
#    if BOOST_PP_LOCAL_C(14)
        BOOST_PP_LOCAL_MACRO(14)
#    endif
#    if BOOST_PP_LOCAL_C(15)
        BOOST_PP_LOCAL_MACRO(15)
#    endif
#    if BOOST_PP_LOCAL_C(16)
        BOOST_PP_LOCAL_MACRO(16)
#    endif
#    if BOOST_PP_LOCAL_C(17)
        BOOST_PP_LOCAL_MACRO(17)
#    endif
#    if BOOST_PP_LOCAL_C(18)
        BOOST_PP_LOCAL_MACRO(18)
#    endif
#    if BOOST_PP_LOCAL_C(19)
        BOOST_PP_LOCAL_MACRO(19)
#    endif
#    if BOOST_PP_LOCAL_C(20)
        BOOST_PP_LOCAL_MACRO(20)
#    endif
#    if BOOST_PP_LOCAL_C(21)
        BOOST_PP_LOCAL_MACRO(21)
#    endif
#    if BOOST_PP_LOCAL_C(22)
        BOOST_PP_LOCAL_MACRO(22)
#    endif
#    if BOOST_PP_LOCAL_C(23)
        BOOST_PP_LOCAL_MACRO(23)
#    endif
#    if BOOST_PP_LOCAL_C(24)
        BOOST_PP_LOCAL_MACRO(24)
#    endif
#    if BOOST_PP_LOCAL_C(25)
        BOOST_PP_LOCAL_MACRO(25)
#    endif
#    if BOOST_PP_LOCAL_C(26)
        BOOST_PP_LOCAL_MACRO(26)
#    endif
#    if BOOST_PP_LOCAL_C(27)
        BOOST_PP_LOCAL_MACRO(27)
#    endif
....... 内容省略掉
.......
#    if BOOST_PP_LOCAL_C(252)
        BOOST_PP_LOCAL_MACRO(252)
#    endif
#    if BOOST_PP_LOCAL_C(253)
        BOOST_PP_LOCAL_MACRO(253)
#    endif
#    if BOOST_PP_LOCAL_C(254)
        BOOST_PP_LOCAL_MACRO(254)
#    endif
#    if BOOST_PP_LOCAL_C(255)
        BOOST_PP_LOCAL_MACRO(255)
#    endif
#    if BOOST_PP_LOCAL_C(256)
        BOOST_PP_LOCAL_MACRO(256)//从0开始一直到256
#    endif
# endif
#
# undef BOOST_PP_LOCAL_LIMITS
#
# undef BOOST_PP_LOCAL_S
# undef BOOST_PP_LOCAL_F
#
# undef BOOST_PP_LOCAL_MACRO



上面的索引范围还可以倒着写:

如(3,9)写成(9,3)

其它剩下的代码也是倒着写:

# if BOOST_PP_LOCAL_R(256)
    BOOST_PP_LOCAL_MACRO(256)
# endif
# if BOOST_PP_LOCAL_R(255)
    BOOST_PP_LOCAL_MACRO(255)
# endif
# if BOOST_PP_LOCAL_R(254)
    BOOST_PP_LOCAL_MACRO(254)
# endif
# if BOOST_PP_LOCAL_R(253)
    BOOST_PP_LOCAL_MACRO(253)
# endif
.............
.............



其中BOOST_PP_LOCAL_R代码:

# define BOOST_PP_LOCAL_R(n) (BOOST_PP_LOCAL_F) <= n && (BOOST_PP_LOCAL_S) >= n



这就是BOOST_PP_LOCAL_ITERATE() 宏的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: