]> git.lyx.org Git - lyx.git/blob - boost/boost/signal.hpp
update
[lyx.git] / boost / boost / signal.hpp
1 // Boost.Signals library
2 //
3 // Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
4 //
5 // Permission to copy, use, sell and distribute this software is granted
6 // provided this copyright notice appears in all copies.
7 // Permission to modify the code and to distribute modified code is granted
8 // provided this copyright notice appears in all copies, and a notice
9 // that the code was modified is included with the copyright notice.
10 //
11 // This software is provided "as is" without express or implied warranty,
12 // and with no claim as to its suitability for any purpose.
13  
14 // For more information, see http://www.boost.org
15
16 #ifndef BOOST_SIGNAL_HPP
17 #define BOOST_SIGNAL_HPP
18
19 #define BOOST_SIGNALS_MAX_ARGS 10
20
21 #include <boost/config.hpp>
22 #include <boost/signals/signal0.hpp>
23 #include <boost/signals/signal1.hpp>
24 #include <boost/signals/signal2.hpp>
25 #include <boost/signals/signal3.hpp>
26 #include <boost/signals/signal4.hpp>
27 #include <boost/signals/signal5.hpp>
28 #include <boost/signals/signal6.hpp>
29 #include <boost/signals/signal7.hpp>
30 #include <boost/signals/signal8.hpp>
31 #include <boost/signals/signal9.hpp>
32 #include <boost/signals/signal10.hpp>
33
34 namespace boost {
35   namespace BOOST_SIGNALS_NAMESPACE {
36     namespace detail {
37       // The unusable class is a placeholder for unused function arguments.
38       struct unused {};
39
40       // value=1 if the given type is not "unused"
41       template<typename T>
42       struct count_if_used
43       {
44         BOOST_STATIC_CONSTANT(int, value = 1);
45       };
46     
47       // value=0 for unused types
48       template<>
49       struct count_if_used<unused>
50       {
51         BOOST_STATIC_CONSTANT(int, value = 0);
52       };
53     
54       // Count the number of arguments (from the given set) which are not 
55       // "unused" (therefore, count those arguments that are used).
56       template<typename T1, typename T2, typename T3, typename T4, 
57                typename T5, typename T6, typename T7, typename T8, 
58                typename T9, typename T10>
59       struct count_used_args
60       {
61         BOOST_STATIC_CONSTANT(int, value = 
62                               (count_if_used<T1>::value + 
63                                count_if_used<T2>::value +
64                                count_if_used<T3>::value + 
65                                count_if_used<T4>::value +
66                                count_if_used<T5>::value + 
67                                count_if_used<T6>::value +
68                                count_if_used<T7>::value + 
69                                count_if_used<T8>::value +
70                                count_if_used<T9>::value +
71                                count_if_used<T10>::value));
72       };
73
74       // Choose the appropriate underlying implementation
75       template<int Args> struct real_get_signal_impl {};
76
77       template<>
78       struct real_get_signal_impl<0>
79       {
80         template<
81           typename R,
82           typename T1,
83           typename T2,
84           typename T3,
85           typename T4,
86           typename T5,
87           typename T6,
88           typename T7,
89           typename T8,
90           typename T9,
91           typename T10,
92           typename Combiner
93         >
94         struct params
95         {
96           typedef signal0<R, Combiner> type;
97         };
98       };
99
100       template<>
101       struct real_get_signal_impl<1>
102       {
103         template<
104           typename R, 
105           typename T1,
106           typename T2,
107           typename T3,
108           typename T4,
109           typename T5,
110           typename T6,
111           typename T7,
112           typename T8,
113           typename T9,
114           typename T10,
115           typename Combiner
116         >
117         struct params
118         {
119           typedef signal1<R, T1, Combiner> type;
120         };
121       };
122
123       template<>
124       struct real_get_signal_impl<2>
125       {
126         template<
127           typename R, 
128           typename T1,
129           typename T2,
130           typename T3,
131           typename T4,
132           typename T5,
133           typename T6,
134           typename T7,
135           typename T8,
136           typename T9,
137           typename T10,
138           typename Combiner
139         >
140         struct params
141         {
142           typedef signal2<R, T1, T2, Combiner> type;
143         };
144       };
145
146       template<>
147       struct real_get_signal_impl<3>
148       {
149         template<
150           typename R, 
151           typename T1,
152           typename T2,
153           typename T3,
154           typename T4,
155           typename T5,
156           typename T6,
157           typename T7,
158           typename T8,
159           typename T9,
160           typename T10,
161           typename Combiner
162         >
163         struct params
164         {
165           typedef signal3<R, T1, T2, T3, Combiner> type;
166         };
167       };
168
169       template<>
170       struct real_get_signal_impl<4>
171       {
172         template<
173           typename R, 
174           typename T1,
175           typename T2,
176           typename T3,
177           typename T4,
178           typename T5,
179           typename T6,
180           typename T7,
181           typename T8,
182           typename T9,
183           typename T10,
184           typename Combiner
185         >
186         struct params
187         {
188           typedef signal4<R, T1, T2, T3, T4, Combiner> type;
189         };
190       };
191
192       template<>
193       struct real_get_signal_impl<5>
194       {
195         template<
196           typename R, 
197           typename T1,
198           typename T2,
199           typename T3,
200           typename T4,
201           typename T5,
202           typename T6,
203           typename T7,
204           typename T8,
205           typename T9,
206           typename T10,
207           typename Combiner
208         >
209         struct params
210         {
211           typedef signal5<R, T1, T2, T3, T4, T5, Combiner> 
212           type;
213         };
214       };
215
216       template<>
217       struct real_get_signal_impl<6>
218       {
219         template<
220           typename R, 
221           typename T1,
222           typename T2,
223           typename T3,
224           typename T4,
225           typename T5,
226           typename T6,
227           typename T7,
228           typename T8,
229           typename T9,
230           typename T10,
231           typename Combiner
232         >
233         struct params
234         {
235           typedef signal6<R, T1, T2, T3, T4, T5, T6, Combiner> type;
236         };
237       };
238
239       template<>
240       struct real_get_signal_impl<7>
241       {
242         template<
243           typename R, 
244           typename T1,
245           typename T2,
246           typename T3,
247           typename T4,
248           typename T5,
249           typename T6,
250           typename T7,
251           typename T8,
252           typename T9,
253           typename T10,
254           typename Combiner
255         >
256         struct params
257         {
258           typedef signal7<R, T1, T2, T3, T4, T5, T6, T7, Combiner> type;
259         };
260       };
261
262       template<>
263       struct real_get_signal_impl<8>
264       {
265         template<
266           typename R, 
267           typename T1,
268           typename T2,
269           typename T3,
270           typename T4,
271           typename T5,
272           typename T6,
273           typename T7,
274           typename T8,
275           typename T9,
276           typename T10,
277           typename Combiner
278         >
279         struct params
280         {
281           typedef signal8<R, T1, T2, T3, T4, T5, T6, T7, T8, Combiner> type;
282         };
283       };
284
285       template<>
286       struct real_get_signal_impl<9>
287       {
288         template<
289           typename R, 
290           typename T1,
291           typename T2,
292           typename T3,
293           typename T4,
294           typename T5,
295           typename T6,
296           typename T7,
297           typename T8,
298           typename T9,
299           typename T10,
300           typename Combiner
301         >
302         struct params
303         {
304           typedef signal9<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, Combiner> type;
305         };
306       };
307
308       template<>
309       struct real_get_signal_impl<10>
310       {
311         template<
312           typename R, 
313           typename T1,
314           typename T2,
315           typename T3,
316           typename T4,
317           typename T5,
318           typename T6,
319           typename T7,
320           typename T8,
321           typename T9,
322           typename T10,
323           typename Combiner
324         >
325         struct params
326         {
327           typedef signal10<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, 
328                            Combiner> type;
329         };
330       };
331
332       template<
333         typename R, 
334         typename T1, 
335         typename T2, 
336         typename T3, 
337         typename T4,
338         typename T5, 
339         typename T6, 
340         typename T7, 
341         typename T8, 
342         typename T9,
343         typename T10,
344         typename Combiner
345       >
346       struct get_signal_impl
347       {
348       private:
349         typedef real_get_signal_impl<
350           (::boost::BOOST_SIGNALS_NAMESPACE::detail::count_used_args<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::value)> t1;
351         typedef typename t1::template params<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
352                              Combiner> t2;
353       public:
354         typedef typename t2::type type;
355       };
356     } // end namespace detail
357   } // end namespace BOOST_SIGNALS_NAMESPACE
358
359   // Very lightweight wrapper around the signalN classes that allows signals to
360   // be created where the number of arguments does not need to be part of the
361   // class name.
362   template<
363     typename R, 
364     typename T1  = BOOST_SIGNALS_NAMESPACE::detail::unused, 
365     typename T2  = BOOST_SIGNALS_NAMESPACE::detail::unused,
366     typename T3  = BOOST_SIGNALS_NAMESPACE::detail::unused,
367     typename T4  = BOOST_SIGNALS_NAMESPACE::detail::unused,
368     typename T5  = BOOST_SIGNALS_NAMESPACE::detail::unused,
369     typename T6  = BOOST_SIGNALS_NAMESPACE::detail::unused,
370     typename T7  = BOOST_SIGNALS_NAMESPACE::detail::unused,
371     typename T8  = BOOST_SIGNALS_NAMESPACE::detail::unused,
372     typename T9  = BOOST_SIGNALS_NAMESPACE::detail::unused,
373     typename T10 = BOOST_SIGNALS_NAMESPACE::detail::unused
374   >
375   class signal :
376     public BOOST_SIGNALS_NAMESPACE::detail::get_signal_impl<R, T1, T2, T3, T4, T5, T6, T7,
377                                                             T8, T9, T10, boost::last_value<R> >::type
378   {
379   public:
380     template<typename Combiner>
381     struct combiner {
382     private:
383       typedef BOOST_SIGNALS_NAMESPACE::detail::get_signal_impl<R, T1, T2, T3, T4, T5,
384                                                                T6, T7, T8, T9, T10, Combiner> t1;
385     public:
386       typedef typename t1::type type;
387     };
388   };
389 } // end namespace boost
390
391 #endif // BOOST_SIGNAL_HPP