• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 // Copyright (C) 2009-2012 Lorenzo Caminiti
3 // Distributed under the Boost Software License, Version 1.0
4 // (see accompanying file LICENSE_1_0.txt or a copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 // Home at http://www.boost.org/libs/local_function
7 
8 #include <boost/local_function.hpp>
9 #include <boost/typeof/typeof.hpp>
10 #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
11 
12 struct s;
13 BOOST_TYPEOF_REGISTER_TYPE(s); // Register before bind `this_` below.
14 
15 // Compile all local function declaration combinations.
16 struct s {
fs17     void f(double p = 1.23, double q = -1.23) {
18         { // Only params.
19             void BOOST_LOCAL_FUNCTION( (int x) (int y)(default 0) ) {
20             } BOOST_LOCAL_FUNCTION_NAME(l)
21             l(1);
22         }
23         { // Only const binds.
24             int a, b;
25 
26             const int& BOOST_LOCAL_FUNCTION( (const bind a)
27                     (const bind& b) (const bind& p) (const bind q) ) {
28                 return b;
29             } BOOST_LOCAL_FUNCTION_NAME(l)
30             l();
31 
32             const s& BOOST_LOCAL_FUNCTION( (const bind this_) ) {
33                 return *this_;
34             } BOOST_LOCAL_FUNCTION_NAME(t)
35             t();
36 
37             const int BOOST_LOCAL_FUNCTION( (const bind a)
38                     (const bind& b) (const bind& p) (const bind q)
39                     (const bind this_) ) {
40                 return a;
41             } BOOST_LOCAL_FUNCTION_NAME(lt)
42             lt();
43         }
44         { // Only plain binds.
45             int c, d;
46 
47             int& BOOST_LOCAL_FUNCTION( (bind c) (bind& d)
48                     (bind& p) (bind& q) ) {
49                 return d;
50             } BOOST_LOCAL_FUNCTION_NAME(l)
51             l();
52 
53             s& BOOST_LOCAL_FUNCTION( (bind this_) ) {
54                 return *this_;
55             } BOOST_LOCAL_FUNCTION_NAME(t)
56             t();
57 
58             int BOOST_LOCAL_FUNCTION( (bind c) (bind& d)
59                     (bind& p) (bind& q) (bind this_) ) {
60                 return c;
61             } BOOST_LOCAL_FUNCTION_NAME(lt)
62             lt();
63         }
64 
65         { // Both params and const binds.
66             int a, b;
67 
68             void BOOST_LOCAL_FUNCTION( (const bind a) (const bind& b)
69                     (const bind& p) (const bind q)
70                     (int x) (int y)(default 0) ) {
71             } BOOST_LOCAL_FUNCTION_NAME(l)
72             l(1);
73 
74             void BOOST_LOCAL_FUNCTION( (const bind this_)
75                     (int x) (int y)(default 0) ) {
76             } BOOST_LOCAL_FUNCTION_NAME(t)
77             t(1);
78 
79             void BOOST_LOCAL_FUNCTION( (const bind a) (const bind this_)
80                     (const bind& b) (const bind& p) (const bind q)
81                     (int x) (int y)(default 0) ) {
82             } BOOST_LOCAL_FUNCTION_NAME(lt)
83             lt(1);
84         }
85         { // Both params and plain binds.
86             int c, d;
87 
88             void BOOST_LOCAL_FUNCTION( (bind c) (bind& d) (bind& p) (bind q)
89                     (int x) (int y)(default 0) ) {
90             } BOOST_LOCAL_FUNCTION_NAME(l)
91             l(1);
92 
93             void BOOST_LOCAL_FUNCTION( (bind this_)
94                     (int x) (int y)(default 0) ) {
95             } BOOST_LOCAL_FUNCTION_NAME(t)
96             t(1);
97 
98             void BOOST_LOCAL_FUNCTION( (bind c) (bind& d)
99                     (bind& p) (bind this_) (bind q)
100                     (int x) (int y)(default 0) ) {
101             } BOOST_LOCAL_FUNCTION_NAME(lt)
102             lt(1);
103         }
104         { // Both const and plain binds.
105             int a, b, c, d;
106 
107             void BOOST_LOCAL_FUNCTION( (const bind a) (const bind& b)
108                     (const bind p) (bind c) (bind& d) (bind q) ) {
109             } BOOST_LOCAL_FUNCTION_NAME(l)
110             l();
111 
112             void BOOST_LOCAL_FUNCTION( (const bind this_)
113                     (bind c) (bind& d) (bind q) ) {
114             } BOOST_LOCAL_FUNCTION_NAME(ct)
115             ct();
116             void BOOST_LOCAL_FUNCTION( (const bind this_)
117                     (const bind a) (const bind& b) (const bind p)
118                     (bind c) (bind& d) (bind q) ) {
119             } BOOST_LOCAL_FUNCTION_NAME(lct)
120             lct();
121 
122             void BOOST_LOCAL_FUNCTION( (const bind a) (const bind& b)
123                     (const bind p) (bind this_) ) {
124             } BOOST_LOCAL_FUNCTION_NAME(pt)
125             pt();
126             void BOOST_LOCAL_FUNCTION( (const bind a) (const bind& b)
127                     (const bind p) (bind c) (bind this_) (bind& d) (bind q) ) {
128             } BOOST_LOCAL_FUNCTION_NAME(lpt)
129             lpt();
130         }
131 
132         { // All params, const binds, and plain binds.
133             int a, b, c, d;
134 
135             void BOOST_LOCAL_FUNCTION(
136                     (const bind a) (const bind& b) (const bind& p)
137                     (bind c) (bind& d) (bind& q) (int x) (int y)(default 0) ) {
138             } BOOST_LOCAL_FUNCTION_NAME(l)
139             l(1);
140 
141             void BOOST_LOCAL_FUNCTION( (const bind this_)
142                     (bind c) (bind& d) (bind& q)
143                     (int x) (int y)(default 0) ) {
144             } BOOST_LOCAL_FUNCTION_NAME(ct)
145             ct(1);
146             void BOOST_LOCAL_FUNCTION(
147                     (const bind a) (const bind& b) (const bind& p)
148                     (bind this_) (int x) (int y)(default 0) ) {
149             } BOOST_LOCAL_FUNCTION_NAME(pt)
150             pt(1);
151 
152             void BOOST_LOCAL_FUNCTION( (const bind a) (const bind this_)
153                     (const bind& b) (const bind& p) (bind c) (bind& d)
154                     (bind& q) (int x) (int y)(default 0) ) {
155             } BOOST_LOCAL_FUNCTION_NAME(lct)
156             lct(1);
157             void BOOST_LOCAL_FUNCTION( (const bind a) (const bind& b)
158                     (const bind& p) (bind c) (bind& d) (bind this_) (bind& q)
159                     (int x) (int y)(default 0) ) {
160             } BOOST_LOCAL_FUNCTION_NAME(lpt)
161             lpt(1);
162         }
163     }
164 };
165 
main(void)166 int main(void) {
167     s().f();
168     return 0;
169 }
170 
171