Fix make_docs.bat
[libcds.git] / cds / opt / make_options_std.h
1 //$$CDS-header$$
2
3 #ifndef __CDS_OPT_MAKE_OPTIONS_STD_H
4 #define __CDS_OPT_MAKE_OPTIONS_STD_H
5
6 #ifndef __CDS_OPT_OPTIONS_H
7 #   error <cds/opt/options.h> must be included instead of <cds/opt/make_options_std.h>
8 #endif
9
10 #include <cds/details/void_selector.h>
11
12 // @cond
13
14 #define CDS_DECL_OPTIONS1   typename O1=cds::opt::none
15 #define CDS_DECL_OPTIONS2   CDS_DECL_OPTIONS1,typename O2=cds::opt::none
16 #define CDS_DECL_OPTIONS3   CDS_DECL_OPTIONS2,typename O3=cds::opt::none
17 #define CDS_DECL_OPTIONS4   CDS_DECL_OPTIONS3,typename O4=cds::opt::none
18 #define CDS_DECL_OPTIONS5   CDS_DECL_OPTIONS4,typename O5=cds::opt::none
19 #define CDS_DECL_OPTIONS6   CDS_DECL_OPTIONS5,typename O6=cds::opt::none
20 #define CDS_DECL_OPTIONS7   CDS_DECL_OPTIONS6,typename O7=cds::opt::none
21 #define CDS_DECL_OPTIONS8   CDS_DECL_OPTIONS7,typename O8=cds::opt::none
22 #define CDS_DECL_OPTIONS9   CDS_DECL_OPTIONS8,typename O9=cds::opt::none
23 #define CDS_DECL_OPTIONS10  CDS_DECL_OPTIONS9,typename O10=cds::opt::none
24 #define CDS_DECL_OPTIONS11  CDS_DECL_OPTIONS10,typename O11=cds::opt::none
25 #define CDS_DECL_OPTIONS12  CDS_DECL_OPTIONS11,typename O12=cds::opt::none
26 #define CDS_DECL_OPTIONS13  CDS_DECL_OPTIONS12,typename O13=cds::opt::none
27 #define CDS_DECL_OPTIONS14  CDS_DECL_OPTIONS13,typename O14=cds::opt::none
28 #define CDS_DECL_OPTIONS15  CDS_DECL_OPTIONS14,typename O15=cds::opt::none
29 #define CDS_DECL_OPTIONS16  CDS_DECL_OPTIONS15,typename O16=cds::opt::none
30
31 #define CDS_DECL_OPTIONS    CDS_DECL_OPTIONS16
32
33 #define CDS_DECL_OTHER_OPTIONS1   typename OO1=cds::opt::none
34 #define CDS_DECL_OTHER_OPTIONS2   CDS_DECL_OTHER_OPTIONS1,typename OO2=cds::opt::none
35 #define CDS_DECL_OTHER_OPTIONS3   CDS_DECL_OTHER_OPTIONS2,typename OO3=cds::opt::none
36 #define CDS_DECL_OTHER_OPTIONS4   CDS_DECL_OTHER_OPTIONS3,typename OO4=cds::opt::none
37 #define CDS_DECL_OTHER_OPTIONS5   CDS_DECL_OTHER_OPTIONS4,typename OO5=cds::opt::none
38 #define CDS_DECL_OTHER_OPTIONS6   CDS_DECL_OTHER_OPTIONS5,typename OO6=cds::opt::none
39 #define CDS_DECL_OTHER_OPTIONS7   CDS_DECL_OTHER_OPTIONS6,typename OO7=cds::opt::none
40 #define CDS_DECL_OTHER_OPTIONS8   CDS_DECL_OTHER_OPTIONS7,typename OO8=cds::opt::none
41 #define CDS_DECL_OTHER_OPTIONS9   CDS_DECL_OTHER_OPTIONS8,typename OO9=cds::opt::none
42 #define CDS_DECL_OTHER_OPTIONS10  CDS_DECL_OTHER_OPTIONS9,typename OO10=cds::opt::none
43 #define CDS_DECL_OTHER_OPTIONS11  CDS_DECL_OTHER_OPTIONS10,typename OO11=cds::opt::none
44 #define CDS_DECL_OTHER_OPTIONS12  CDS_DECL_OTHER_OPTIONS11,typename OO12=cds::opt::none
45 #define CDS_DECL_OTHER_OPTIONS13  CDS_DECL_OTHER_OPTIONS12,typename OO13=cds::opt::none
46 #define CDS_DECL_OTHER_OPTIONS14  CDS_DECL_OTHER_OPTIONS13,typename OO14=cds::opt::none
47 #define CDS_DECL_OTHER_OPTIONS15  CDS_DECL_OTHER_OPTIONS14,typename OO15=cds::opt::none
48 #define CDS_DECL_OTHER_OPTIONS16  CDS_DECL_OTHER_OPTIONS15,typename OO16=cds::opt::none
49
50 // for template specializations
51 #define CDS_SPEC_OPTIONS1   typename O1
52 #define CDS_SPEC_OPTIONS2   CDS_SPEC_OPTIONS1,typename O2
53 #define CDS_SPEC_OPTIONS3   CDS_SPEC_OPTIONS2,typename O3
54 #define CDS_SPEC_OPTIONS4   CDS_SPEC_OPTIONS3,typename O4
55 #define CDS_SPEC_OPTIONS5   CDS_SPEC_OPTIONS4,typename O5
56 #define CDS_SPEC_OPTIONS6   CDS_SPEC_OPTIONS5,typename O6
57 #define CDS_SPEC_OPTIONS7   CDS_SPEC_OPTIONS6,typename O7
58 #define CDS_SPEC_OPTIONS8   CDS_SPEC_OPTIONS7,typename O8
59 #define CDS_SPEC_OPTIONS9   CDS_SPEC_OPTIONS8,typename O9
60 #define CDS_SPEC_OPTIONS10  CDS_SPEC_OPTIONS9,typename O10
61 #define CDS_SPEC_OPTIONS11  CDS_SPEC_OPTIONS10,typename O11
62 #define CDS_SPEC_OPTIONS12  CDS_SPEC_OPTIONS11,typename O12
63 #define CDS_SPEC_OPTIONS13  CDS_SPEC_OPTIONS12,typename O13
64 #define CDS_SPEC_OPTIONS14  CDS_SPEC_OPTIONS13,typename O14
65 #define CDS_SPEC_OPTIONS15  CDS_SPEC_OPTIONS14,typename O15
66 #define CDS_SPEC_OPTIONS16  CDS_SPEC_OPTIONS15,typename O16
67
68 #define CDS_SPEC_OPTIONS    CDS_SPEC_OPTIONS16
69
70 #define CDS_OPTIONS1    O1
71 #define CDS_OPTIONS2    O1,O2
72 #define CDS_OPTIONS3    O1,O2,O3
73 #define CDS_OPTIONS4    O1,O2,O3,O4
74 #define CDS_OPTIONS5    O1,O2,O3,O4,O5
75 #define CDS_OPTIONS6    O1,O2,O3,O4,O5,O6
76 #define CDS_OPTIONS7    O1,O2,O3,O4,O5,O6,O7
77 #define CDS_OPTIONS8    O1,O2,O3,O4,O5,O6,O7,O8
78 #define CDS_OPTIONS9    O1,O2,O3,O4,O5,O6,O7,O8,O9
79 #define CDS_OPTIONS10   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10
80 #define CDS_OPTIONS11   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11
81 #define CDS_OPTIONS12   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12
82 #define CDS_OPTIONS13   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13
83 #define CDS_OPTIONS14   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14
84 #define CDS_OPTIONS15   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15
85 #define CDS_OPTIONS16   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15,O16
86 //#define CDS_OPTIONS17   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15,O16,O17
87 //#define CDS_OPTIONS18   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15,O16,O17,O18
88 //#define CDS_OPTIONS19   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15,O16,O17,O18,O19
89 //#define CDS_OPTIONS20   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15,O16,O17,O18,O19,O20
90
91 #define CDS_OPTIONS     CDS_OPTIONS16
92
93 #define CDS_OTHER_OPTIONS1    OO1
94 #define CDS_OTHER_OPTIONS2    OO1,OO2
95 #define CDS_OTHER_OPTIONS3    OO1,OO2,OO3
96 #define CDS_OTHER_OPTIONS4    OO1,OO2,OO3,OO4
97 #define CDS_OTHER_OPTIONS5    OO1,OO2,OO3,OO4,OO5
98 #define CDS_OTHER_OPTIONS6    OO1,OO2,OO3,OO4,OO5,OO6
99 #define CDS_OTHER_OPTIONS7    OO1,OO2,OO3,OO4,OO5,OO6,OO7
100 #define CDS_OTHER_OPTIONS8    OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8
101 #define CDS_OTHER_OPTIONS9    OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9
102 #define CDS_OTHER_OPTIONS10   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10
103 #define CDS_OTHER_OPTIONS11   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10,OO11
104 #define CDS_OTHER_OPTIONS12   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10,OO11,OO12
105 #define CDS_OTHER_OPTIONS13   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10,OO11,OO12,OO13
106 #define CDS_OTHER_OPTIONS14   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10,OO11,OO12,OO13,OO14
107 #define CDS_OTHER_OPTIONS15   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10,OO11,OO12,OO13,OO14,OO15
108 #define CDS_OTHER_OPTIONS16   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10,OO11,OO12,OO13,OO14,OO15,OO16
109
110 namespace cds { namespace opt {
111
112     template<typename OptionList, typename Option>
113     struct do_pack
114     {
115         // Use "pack" member template to pack options
116         typedef typename Option::template pack<OptionList> type;
117     };
118
119     template <
120         typename DefaultOptions
121         ,typename O1 = none
122         ,typename O2 = none
123         ,typename O3 = none
124         ,typename O4 = none
125         ,typename O5 = none
126         ,typename O6 = none
127         ,typename O7 = none
128         ,typename O8 = none
129         ,typename O9 = none
130         ,typename O10 = none
131         ,typename O11 = none
132         ,typename O12 = none
133         ,typename O13 = none
134         ,typename O14 = none
135         ,typename O15 = none
136         ,typename O16 = none
137     >
138     struct make_options {
139         /*
140         typedef
141             typename do_pack<
142                 typename do_pack<
143                     typename do_pack<
144                         typename do_pack<
145                             typename do_pack<
146                                 typename do_pack<
147                                     typename do_pack<
148                                         typename do_pack<
149                                             typename do_pack<
150                                                 typename do_pack<
151                                                     typename do_pack<
152                                                         typename do_pack<
153                                                             typename do_pack<
154                                                                 typename do_pack<
155                                                                     typename do_pack<
156                                                                         typename do_pack<
157                                                                             DefaultOptions
158                                                                             ,O16
159                                                                         >::type
160                                                                         ,O15
161                                                                     >::type
162                                                                     ,O14
163                                                                 >::type
164                                                                 ,O13
165                                                             >::type
166                                                             ,O12
167                                                         >::type
168                                                         ,O11
169                                                     >::type
170                                                     ,O10
171                                                 >::type
172                                                 ,O9
173                                             >::type
174                                             ,O8
175                                         >::type
176                                         ,O7
177                                     >::type
178                                     ,O6
179                                 >::type
180                                 ,O5
181                             >::type
182                             ,O4
183                         >::type
184                         ,O3
185                     >::type
186                     ,O2
187                 >::type
188                 ,O1
189             >::type
190         type;
191         */
192         struct type: public
193             do_pack<
194                 typename do_pack<
195                     typename do_pack<
196                         typename do_pack<
197                             typename do_pack<
198                                 typename do_pack<
199                                     typename do_pack<
200                                         typename do_pack<
201                                             typename do_pack<
202                                                 typename do_pack<
203                                                     typename do_pack<
204                                                         typename do_pack<
205                                                             typename do_pack<
206                                                                 typename do_pack<
207                                                                     typename do_pack<
208                                                                         typename do_pack<
209                                                                             DefaultOptions
210                                                                             ,O16
211                                                                         >::type
212                                                                         ,O15
213                                                                     >::type
214                                                                     ,O14
215                                                                 >::type
216                                                                 ,O13
217                                                             >::type
218                                                             ,O12
219                                                         >::type
220                                                         ,O11
221                                                     >::type
222                                                     ,O10
223                                                 >::type
224                                                 ,O9
225                                             >::type
226                                             ,O8
227                                         >::type
228                                         ,O7
229                                     >::type
230                                     ,O6
231                                 >::type
232                                 ,O5
233                             >::type
234                             ,O4
235                         >::type
236                         ,O3
237                     >::type
238                     ,O2
239                 >::type
240                 ,O1
241             >::type
242         {};
243     };
244
245
246     // *****************************************************************
247     // find_type_traits metafunction
248     // *****************************************************************
249
250     namespace details {
251         template <typename T, typename DefaultOptions>
252         struct find_type_traits_option {
253             typedef DefaultOptions type;
254         };
255
256         template <typename T, typename DefaultOptions>
257         struct find_type_traits_option< cds::opt::type_traits<T>, DefaultOptions> {
258             typedef T  type;
259         };
260     }
261
262     template <
263         typename DefaultOptions
264         ,typename O1 = none
265         ,typename O2 = none
266         ,typename O3 = none
267         ,typename O4 = none
268         ,typename O5 = none
269         ,typename O6 = none
270         ,typename O7 = none
271         ,typename O8 = none
272         ,typename O9 = none
273         ,typename O10 = none
274         ,typename O11 = none
275         ,typename O12 = none
276         ,typename O13 = none
277         ,typename O14 = none
278         ,typename O15 = none
279         ,typename O16 = none
280     >
281     struct find_type_traits {
282         /*
283         typedef typename details::find_type_traits_option< O1,
284             typename details::find_type_traits_option< O2,
285                 typename details::find_type_traits_option< O3,
286                     typename details::find_type_traits_option< O4,
287                         typename details::find_type_traits_option< O5,
288                             typename details::find_type_traits_option< O6,
289                                 typename details::find_type_traits_option< O7,
290                                     typename details::find_type_traits_option< O8,
291                                         typename details::find_type_traits_option< O9,
292                                             typename details::find_type_traits_option< O10,
293                                                 typename details::find_type_traits_option< O11,
294                                                     typename details::find_type_traits_option< O12,
295                                                         typename details::find_type_traits_option< O13,
296                                                             typename details::find_type_traits_option< O14,
297                                                                 typename details::find_type_traits_option< O15,
298                                                                     typename details::find_type_traits_option< O16, DefaultOptions>::type
299                                                                 >::type
300                                                             >::type
301                                                         >::type
302                                                     >::type
303                                                 >::type
304                                             >::type
305                                         >::type
306                                     >::type
307                                 >::type
308                             >::type
309                         >::type
310                     >::type
311                 >::type
312             >::type
313         >::type type;
314         */
315         struct type: public details::find_type_traits_option< O1,
316             typename details::find_type_traits_option< O2,
317                 typename details::find_type_traits_option< O3,
318                     typename details::find_type_traits_option< O4,
319                         typename details::find_type_traits_option< O5,
320                             typename details::find_type_traits_option< O6,
321                                 typename details::find_type_traits_option< O7,
322                                     typename details::find_type_traits_option< O8,
323                                         typename details::find_type_traits_option< O9,
324                                             typename details::find_type_traits_option< O10,
325                                                 typename details::find_type_traits_option< O11,
326                                                     typename details::find_type_traits_option< O12,
327                                                         typename details::find_type_traits_option< O13,
328                                                             typename details::find_type_traits_option< O14,
329                                                                 typename details::find_type_traits_option< O15,
330                                                                     typename details::find_type_traits_option< O16, DefaultOptions>::type
331                                                                 >::type
332                                                             >::type
333                                                         >::type
334                                                     >::type
335                                                 >::type
336                                             >::type
337                                         >::type
338                                     >::type
339                                 >::type
340                             >::type
341                         >::type
342                     >::type
343                 >::type
344             >::type
345         >::type
346         {};
347     };
348
349
350     // *****************************************************************
351     // find_option metafunction
352     // *****************************************************************
353     namespace details {
354
355         template <typename A, typename B>
356         struct select_option
357         {
358             typedef void type;
359         };
360
361         template <template <typename> class What, typename Option, typename Default>
362         struct select_option< What<Option>, What<Default> >
363         {
364             typedef What<Option>   type;
365         };
366
367         // Specializations for integral type of option
368 #define _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION( _type ) template <template <_type> class What, _type Option, _type Default> \
369         struct select_option< What<Option>, What<Default> > { typedef What<Option>   type    ; };
370
371 // For user-defined enum types
372 #define CDS_DECLARE_FIND_OPTION_INTEGRAL_SPECIALIZATION( _type ) namespace cds { namespace opt { namespace details { _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(_type ) }}}
373
374         _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(bool)
375         _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(char)
376         _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned char)
377         _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(signed char)
378         _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(short int)
379         _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned short int)
380         _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(int)
381         _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned int)
382         _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(long)
383         _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned long)
384         _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(long long)
385         _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned long long)
386
387
388         template <typename What, typename Opt, typename Result>
389         struct find_option
390         {
391             typedef typename cds::details::void_selector< typename select_option< Opt, What >::type, Result >::type type;
392         };
393
394         template <typename What, typename Opt>
395         struct find_option< What, Opt, void>
396         {
397             typedef typename select_option< Opt, What >::type  type;
398         };
399
400         template <typename What, typename Result>
401         struct find_option_decision
402         {
403             typedef Result type;
404         };
405
406         template <typename What>
407         struct find_option_decision<What, void>
408         {
409             typedef What type;
410         };
411
412
413     } // namespace details
414
415     template <
416         typename What
417         ,typename O1 = none
418         ,typename O2 = none
419         ,typename O3 = none
420         ,typename O4 = none
421         ,typename O5 = none
422         ,typename O6 = none
423         ,typename O7 = none
424         ,typename O8 = none
425         ,typename O9 = none
426         ,typename O10 = none
427         ,typename O11 = none
428         ,typename O12 = none
429         ,typename O13 = none
430         ,typename O14 = none
431         ,typename O15 = none
432         ,typename O16 = none
433     >
434     struct find_option {
435         typedef typename details::find_option_decision< What,
436              typename details::find_option< What, O1,
437                 typename details::find_option< What, O2,
438                     typename details::find_option< What, O3,
439                         typename details::find_option< What, O4,
440                             typename details::find_option< What, O5,
441                                 typename details::find_option< What, O6,
442                                     typename details::find_option< What, O7,
443                                         typename details::find_option< What, O8,
444                                             typename details::find_option< What, O9,
445                                                 typename details::find_option< What, O10,
446                                                     typename details::find_option< What, O11,
447                                                         typename details::find_option< What, O12,
448                                                             typename details::find_option< What, O13,
449                                                                 typename details::find_option< What, O14,
450                                                                     typename details::find_option< What, O15,
451                                                                         typename details::find_option< What, O16, void >::type
452                                                                     >::type
453                                                                 >::type
454                                                             >::type
455                                                         >::type
456                                                     >::type
457                                                 >::type
458                                             >::type
459                                         >::type
460                                     >::type
461                                 >::type
462                             >::type
463                         >::type
464                     >::type
465                 >::type
466             >::type
467         >::type type;
468     };
469
470
471     // *****************************************************************
472     // select metafunction
473     // *****************************************************************
474
475     namespace details {
476
477         template <typename What, typename Tag, typename Value, typename Others>
478         struct select
479         {
480             typedef typename Others   type;
481         };
482
483         template <typename What, typename Value, typename Others>
484         struct select< What, What, Value, Others>
485         {
486             typedef Value   type;
487         };
488
489         template <typename What, typename Tag, typename Value>
490         struct select< What, Tag, Value, void>
491         {
492             typedef What    type;
493         };
494
495         template <typename What, typename Value>
496         struct select< What, What, Value, void>
497         {
498             typedef Value    type;
499         };
500     }   // namespace details
501
502     template <typename What,
503         typename Tag1, typename Value1,
504         typename Tag2 = none, typename Value2 = none,
505         typename Tag3 = none, typename Value3 = none,
506         typename Tag4 = none, typename Value4 = none,
507         typename Tag5 = none, typename Value5 = none,
508         typename Tag6 = none, typename Value6 = none,
509         typename Tag7 = none, typename Value7 = none,
510         typename Tag8 = none, typename Value8 = none
511     >
512     struct select {
513         typedef typename details::select< What, Tag1, Value1,
514             typename details::select< What, Tag2, Value2,
515                 typename details::select< What, Tag3, Value3,
516                     typename details::select< What, Tag4, Value4,
517                         typename details::select< What, Tag5, Value5,
518                             typename details::select< What, Tag6, Value6,
519                                 typename details::select< What, Tag7, Value7,
520                                     typename details::select< What, Tag8, Value8, void
521                                     >::type
522                                 >::type
523                             >::type
524                         >::type
525                     >::type
526                 >::type
527             >::type
528         >::type type;
529     };
530
531
532 }}  // namespace cds::opt
533 //@endcond
534
535 #endif // #ifndef __CDS_OPT_MAKE_OPTIONS_STD_H