]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/preprocessor/doc/examples/linear_fib.c
1 # /* Copyright (C) 2002
3 # * http://www.housemarque.com
5 # * Distributed under the Boost Software License, Version 1.0. (See
6 # * accompanying file LICENSE_1_0.txt or copy at
7 # * http://www.boost.org/LICENSE_1_0.txt)
10 # /* Revised by Paul Mensonides (2002) */
12 # /* See http://www.boost.org for most recent version. */
14 # /* This example shows how BOOST_PP_WHILE() can be used for implementing macros. */
18 # include <boost/preprocessor/arithmetic/add.hpp>
19 # include <boost/preprocessor/arithmetic/sub.hpp>
20 # include <boost/preprocessor/comparison/less_equal.hpp>
21 # include <boost/preprocessor/control/while.hpp>
22 # include <boost/preprocessor/list/adt.hpp>
23 # include <boost/preprocessor/tuple/elem.hpp>
25 # /* First consider the following C implementation of Fibonacci. */
27 typedef struct linear_fib_state
{
31 static int linear_fib_c(linear_fib_state p
) {
35 static linear_fib_state
linear_fib_f(linear_fib_state p
) {
36 linear_fib_state r
= { p
.a1
, p
.a0
+ p
.a1
, p
.n
- 1 };
40 static int linear_fib(int n
) {
41 linear_fib_state p
= { 0, 1, n
};
42 while (linear_fib_c(p
)) {
48 # /* Then consider the following preprocessor implementation of Fibonacci. */
50 # define LINEAR_FIB(n) LINEAR_FIB_D(1, n)
51 # /* Since the macro is implemented using BOOST_PP_WHILE, the actual
52 # * implementation takes a depth as a parameters so that it can be called
53 # * inside a BOOST_PP_WHILE. The above easy-to-use version simply uses 1
54 # * as the depth and cannot be called inside a BOOST_PP_WHILE.
57 # define LINEAR_FIB_D(d, n) \
58 BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_WHILE_ ## d(LINEAR_FIB_C, LINEAR_FIB_F, (0, 1, n)))
59 # /* ^^^^ ^^^^^ ^^ ^^ ^^^^^^^
62 # * 1) The state is a 3-element tuple. After the iteration is finished, the first
63 # * element of the tuple is the result.
65 # * 2) The WHILE primitive is "invoked" directly. BOOST_PP_WHILE(D, ...)
66 # * can't be used because it would not be expanded by the preprocessor.
68 # * 3) ???_C is the condition and ???_F is the iteration macro.
71 # define LINEAR_FIB_C(d, p) \
72 /* p.n */ BOOST_PP_TUPLE_ELEM(3, 2, p) \
75 # define LINEAR_FIB_F(d, p) \
77 /* p.a1 */ BOOST_PP_TUPLE_ELEM(3, 1, p), \
78 /* p.a0 + p.a1 */ BOOST_PP_ADD_D(d, BOOST_PP_TUPLE_ELEM(3, 0, p), BOOST_PP_TUPLE_ELEM(3, 1, p)), \
80 * BOOST_PP_ADD() uses BOOST_PP_WHILE(). Therefore we \
81 * pass the recursion depth explicitly to BOOST_PP_ADD_D(). \
83 /* p.n - 1 */ BOOST_PP_DEC(BOOST_PP_TUPLE_ELEM(3, 2, p)) \
88 printf("linear_fib(10) = %d\n", linear_fib(10));
89 printf("LINEAR_FIB(10) = %d\n", LINEAR_FIB(10));