3 #ifndef __CDS_OPT_MAKE_OPTIONS_STD_H
4 #define __CDS_OPT_MAKE_OPTIONS_STD_H
6 #ifndef __CDS_OPT_OPTIONS_H
7 # error <cds/opt/options.h> must be included instead of <cds/opt/make_options_std.h>
10 #include <cds/details/void_selector.h>
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
31 #define CDS_DECL_OPTIONS CDS_DECL_OPTIONS16
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
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
68 #define CDS_SPEC_OPTIONS CDS_SPEC_OPTIONS16
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
91 #define CDS_OPTIONS CDS_OPTIONS16
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
110 namespace cds { namespace opt {
112 template<typename OptionList, typename Option>
115 // Use "pack" member template to pack options
116 typedef typename Option::template pack<OptionList> type;
120 typename DefaultOptions
138 struct make_options {
246 // *****************************************************************
247 // find_type_traits metafunction
248 // *****************************************************************
251 template <typename T, typename DefaultOptions>
252 struct find_type_traits_option {
253 typedef DefaultOptions type;
256 template <typename T, typename DefaultOptions>
257 struct find_type_traits_option< cds::opt::type_traits<T>, DefaultOptions> {
263 typename DefaultOptions
281 struct find_type_traits {
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
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
350 // *****************************************************************
351 // find_option metafunction
352 // *****************************************************************
355 template <typename A, typename B>
361 template <template <typename> class What, typename Option, typename Default>
362 struct select_option< What<Option>, What<Default> >
364 typedef What<Option> type;
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 ; };
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 ) }}}
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)
388 template <typename What, typename Opt, typename Result>
391 typedef typename cds::details::void_selector< typename select_option< Opt, What >::type, Result >::type type;
394 template <typename What, typename Opt>
395 struct find_option< What, Opt, void>
397 typedef typename select_option< Opt, What >::type type;
400 template <typename What, typename Result>
401 struct find_option_decision
406 template <typename What>
407 struct find_option_decision<What, void>
413 } // namespace details
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
471 // *****************************************************************
472 // select metafunction
473 // *****************************************************************
477 template <typename What, typename Tag, typename Value, typename Others>
480 typedef typename Others type;
483 template <typename What, typename Value, typename Others>
484 struct select< What, What, Value, Others>
489 template <typename What, typename Tag, typename Value>
490 struct select< What, Tag, Value, void>
495 template <typename What, typename Value>
496 struct select< What, What, Value, void>
500 } // namespace details
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
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
532 }} // namespace cds::opt
535 #endif // #ifndef __CDS_OPT_MAKE_OPTIONS_STD_H