Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5134 serge 1
// TR1 type_traits -*- C++ -*-
2
 
3
// Copyright (C) 2004-2013 Free Software Foundation, Inc.
4
//
5
// This file is part of the GNU ISO C++ Library.  This library is free
6
// software; you can redistribute it and/or modify it under the
7
// terms of the GNU General Public License as published by the
8
// Free Software Foundation; either version 3, or (at your option)
9
// any later version.
10
 
11
// This library is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
// GNU General Public License for more details.
15
 
16
// Under Section 7 of GPL version 3, you are granted additional
17
// permissions described in the GCC Runtime Library Exception, version
18
// 3.1, as published by the Free Software Foundation.
19
 
20
// You should have received a copy of the GNU General Public License and
21
// a copy of the GCC Runtime Library Exception along with this program;
22
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23
// .
24
 
25
/** @file tr1/type_traits
26
 *  This is a TR1 C++ Library header.
27
 */
28
 
29
#ifndef _GLIBCXX_TR1_TYPE_TRAITS
30
#define _GLIBCXX_TR1_TYPE_TRAITS 1
31
 
32
#pragma GCC system_header
33
 
34
#include 
35
 
36
namespace std _GLIBCXX_VISIBILITY(default)
37
{
38
namespace tr1
39
{
40
_GLIBCXX_BEGIN_NAMESPACE_VERSION
41
 
42
  /**
43
   * @addtogroup metaprogramming
44
   * @{
45
   */
46
 
47
  struct __sfinae_types
48
  {
49
    typedef char __one;
50
    typedef struct { char __arr[2]; } __two;
51
  };
52
 
53
#define _DEFINE_SPEC_0_HELPER                          \
54
  template<>
55
 
56
#define _DEFINE_SPEC_1_HELPER                          \
57
  template
58
 
59
#define _DEFINE_SPEC_2_HELPER                          \
60
  template
61
 
62
#define _DEFINE_SPEC(_Order, _Trait, _Type, _Value)    \
63
  _DEFINE_SPEC_##_Order##_HELPER                       \
64
    struct _Trait<_Type>                               \
65
    : public integral_constant { };
66
 
67
  // helper classes [4.3].
68
 
69
  /// integral_constant
70
  template
71
    struct integral_constant
72
    {
73
      static const _Tp                      value = __v;
74
      typedef _Tp                           value_type;
75
      typedef integral_constant<_Tp, __v>   type;
76
    };
77
 
78
  /// typedef for true_type
79
  typedef integral_constant     true_type;
80
 
81
  /// typedef for false_type
82
  typedef integral_constant    false_type;
83
 
84
  template
85
    const _Tp integral_constant<_Tp, __v>::value;
86
 
87
  /// remove_cv
88
  template
89
    struct remove_cv;
90
 
91
  template
92
    struct __is_void_helper
93
    : public false_type { };
94
  _DEFINE_SPEC(0, __is_void_helper, void, true)
95
 
96
  // primary type categories [4.5.1].
97
 
98
  /// is_void
99
  template
100
    struct is_void
101
    : public integral_constant
102
				      remove_cv<_Tp>::type>::value)>
103
    { };
104
 
105
  template
106
    struct __is_integral_helper
107
    : public false_type { };
108
  _DEFINE_SPEC(0, __is_integral_helper, bool, true)
109
  _DEFINE_SPEC(0, __is_integral_helper, char, true)
110
  _DEFINE_SPEC(0, __is_integral_helper, signed char, true)
111
  _DEFINE_SPEC(0, __is_integral_helper, unsigned char, true)
112
#ifdef _GLIBCXX_USE_WCHAR_T
113
  _DEFINE_SPEC(0, __is_integral_helper, wchar_t, true)
114
#endif
115
  _DEFINE_SPEC(0, __is_integral_helper, short, true)
116
  _DEFINE_SPEC(0, __is_integral_helper, unsigned short, true)
117
  _DEFINE_SPEC(0, __is_integral_helper, int, true)
118
  _DEFINE_SPEC(0, __is_integral_helper, unsigned int, true)
119
  _DEFINE_SPEC(0, __is_integral_helper, long, true)
120
  _DEFINE_SPEC(0, __is_integral_helper, unsigned long, true)
121
  _DEFINE_SPEC(0, __is_integral_helper, long long, true)
122
  _DEFINE_SPEC(0, __is_integral_helper, unsigned long long, true)
123
 
124
  /// is_integral
125
  template
126
    struct is_integral
127
    : public integral_constant
128
				      remove_cv<_Tp>::type>::value)>
129
    { };
130
 
131
  template
132
    struct __is_floating_point_helper
133
    : public false_type { };
134
  _DEFINE_SPEC(0, __is_floating_point_helper, float, true)
135
  _DEFINE_SPEC(0, __is_floating_point_helper, double, true)
136
  _DEFINE_SPEC(0, __is_floating_point_helper, long double, true)
137
 
138
  /// is_floating_point
139
  template
140
    struct is_floating_point
141
    : public integral_constant
142
				      remove_cv<_Tp>::type>::value)>
143
    { };
144
 
145
  /// is_array
146
  template
147
    struct is_array
148
    : public false_type { };
149
 
150
  template
151
    struct is_array<_Tp[_Size]>
152
    : public true_type { };
153
 
154
  template
155
    struct is_array<_Tp[]>
156
    : public true_type { };
157
 
158
  template
159
    struct __is_pointer_helper
160
    : public false_type { };
161
  _DEFINE_SPEC(1, __is_pointer_helper, _Tp*, true)
162
 
163
  /// is_pointer
164
  template
165
    struct is_pointer
166
    : public integral_constant
167
				      remove_cv<_Tp>::type>::value)>
168
    { };
169
 
170
  /// is_reference
171
  template
172
    struct is_reference;
173
 
174
  /// is_function
175
  template
176
    struct is_function;
177
 
178
  template
179
    struct __is_member_object_pointer_helper
180
    : public false_type { };
181
  _DEFINE_SPEC(2, __is_member_object_pointer_helper, _Tp _Cp::*,
182
	       !is_function<_Tp>::value)
183
 
184
  /// is_member_object_pointer
185
  template
186
    struct is_member_object_pointer
187
    : public integral_constant
188
				      typename remove_cv<_Tp>::type>::value)>
189
    { };
190
 
191
  template
192
    struct __is_member_function_pointer_helper
193
    : public false_type { };
194
  _DEFINE_SPEC(2, __is_member_function_pointer_helper, _Tp _Cp::*,
195
	       is_function<_Tp>::value)
196
 
197
  /// is_member_function_pointer
198
  template
199
    struct is_member_function_pointer
200
    : public integral_constant
201
				      typename remove_cv<_Tp>::type>::value)>
202
    { };
203
 
204
  /// is_enum
205
  template
206
    struct is_enum
207
    : public integral_constant
208
    { };
209
 
210
  /// is_union
211
  template
212
    struct is_union
213
    : public integral_constant
214
    { };
215
 
216
  /// is_class
217
  template
218
    struct is_class
219
    : public integral_constant
220
    { };
221
 
222
  /// is_function
223
  template
224
    struct is_function
225
    : public false_type { };
226
  template
227
    struct is_function<_Res(_ArgTypes...)>
228
    : public true_type { };
229
  template
230
    struct is_function<_Res(_ArgTypes......)>
231
    : public true_type { };
232
  template
233
    struct is_function<_Res(_ArgTypes...) const>
234
    : public true_type { };
235
  template
236
    struct is_function<_Res(_ArgTypes......) const>
237
    : public true_type { };
238
  template
239
    struct is_function<_Res(_ArgTypes...) volatile>
240
    : public true_type { };
241
  template
242
    struct is_function<_Res(_ArgTypes......) volatile>
243
    : public true_type { };
244
  template
245
    struct is_function<_Res(_ArgTypes...) const volatile>
246
    : public true_type { };
247
  template
248
    struct is_function<_Res(_ArgTypes......) const volatile>
249
    : public true_type { };
250
 
251
  // composite type traits [4.5.2].
252
 
253
  /// is_arithmetic
254
  template
255
    struct is_arithmetic
256
    : public integral_constant::value
257
				      || is_floating_point<_Tp>::value)>
258
    { };
259
 
260
  /// is_fundamental
261
  template
262
    struct is_fundamental
263
    : public integral_constant::value
264
				      || is_void<_Tp>::value)>
265
    { };
266
 
267
  /// is_object
268
  template
269
    struct is_object
270
    : public integral_constant::value
271
				       || is_reference<_Tp>::value
272
				       || is_void<_Tp>::value)>
273
    { };
274
 
275
  /// is_member_pointer
276
  template
277
    struct is_member_pointer;
278
 
279
  /// is_scalar
280
  template
281
    struct is_scalar
282
    : public integral_constant::value
283
				      || is_enum<_Tp>::value
284
				      || is_pointer<_Tp>::value
285
				      || is_member_pointer<_Tp>::value)>
286
    { };
287
 
288
  /// is_compound
289
  template
290
    struct is_compound
291
    : public integral_constant::value> { };
292
 
293
  /// is_member_pointer
294
  template
295
    struct __is_member_pointer_helper
296
    : public false_type { };
297
  _DEFINE_SPEC(2, __is_member_pointer_helper, _Tp _Cp::*, true)
298
 
299
  template
300
  struct is_member_pointer
301
    : public integral_constant
302
				      typename remove_cv<_Tp>::type>::value)>
303
    { };
304
 
305
  // type properties [4.5.3].
306
  /// is_const
307
  template
308
    struct is_const
309
    : public false_type { };
310
 
311
  template
312
    struct is_const<_Tp const>
313
    : public true_type { };
314
 
315
  /// is_volatile
316
  template
317
    struct is_volatile
318
    : public false_type { };
319
 
320
  template
321
    struct is_volatile<_Tp volatile>
322
    : public true_type { };
323
 
324
  /// is_empty
325
  template
326
    struct is_empty
327
    : public integral_constant
328
    { };
329
 
330
  /// is_polymorphic
331
  template
332
    struct is_polymorphic
333
    : public integral_constant
334
    { };
335
 
336
  /// is_abstract
337
  template
338
    struct is_abstract
339
    : public integral_constant
340
    { };
341
 
342
  /// has_virtual_destructor
343
  template
344
    struct has_virtual_destructor
345
    : public integral_constant
346
    { };
347
 
348
  /// alignment_of
349
  template
350
    struct alignment_of
351
    : public integral_constant { };
352
 
353
  /// rank
354
  template
355
    struct rank
356
    : public integral_constant { };
357
 
358
  template
359
    struct rank<_Tp[_Size]>
360
    : public integral_constant::value> { };
361
 
362
  template
363
    struct rank<_Tp[]>
364
    : public integral_constant::value> { };
365
 
366
  /// extent
367
  template
368
    struct extent
369
    : public integral_constant { };
370
 
371
  template
372
    struct extent<_Tp[_Size], _Uint>
373
    : public integral_constant
374
			       _Uint == 0 ? _Size : extent<_Tp,
375
							   _Uint - 1>::value>
376
    { };
377
 
378
  template
379
    struct extent<_Tp[], _Uint>
380
    : public integral_constant
381
			       _Uint == 0 ? 0 : extent<_Tp,
382
						       _Uint - 1>::value>
383
    { };
384
 
385
  // relationships between types [4.6].
386
 
387
  /// is_same
388
  template
389
    struct is_same
390
    : public false_type { };
391
 
392
  template
393
    struct is_same<_Tp, _Tp>
394
    : public true_type { };
395
 
396
  // const-volatile modifications [4.7.1].
397
 
398
  /// remove_const
399
  template
400
    struct remove_const
401
    { typedef _Tp     type; };
402
 
403
  template
404
    struct remove_const<_Tp const>
405
    { typedef _Tp     type; };
406
 
407
  /// remove_volatile
408
  template
409
    struct remove_volatile
410
    { typedef _Tp     type; };
411
 
412
  template
413
    struct remove_volatile<_Tp volatile>
414
    { typedef _Tp     type; };
415
 
416
  /// remove_cv
417
  template
418
    struct remove_cv
419
    {
420
      typedef typename
421
      remove_const::type>::type     type;
422
    };
423
 
424
  /// add_const
425
  template
426
    struct add_const
427
    { typedef _Tp const     type; };
428
 
429
  /// add_volatile
430
  template
431
    struct add_volatile
432
    { typedef _Tp volatile     type; };
433
 
434
  /// add_cv
435
  template
436
    struct add_cv
437
    {
438
      typedef typename
439
      add_const::type>::type     type;
440
    };
441
 
442
  // array modifications [4.7.3].
443
 
444
  /// remove_extent
445
  template
446
    struct remove_extent
447
    { typedef _Tp     type; };
448
 
449
  template
450
    struct remove_extent<_Tp[_Size]>
451
    { typedef _Tp     type; };
452
 
453
  template
454
    struct remove_extent<_Tp[]>
455
    { typedef _Tp     type; };
456
 
457
  /// remove_all_extents
458
  template
459
    struct remove_all_extents
460
    { typedef _Tp     type; };
461
 
462
  template
463
    struct remove_all_extents<_Tp[_Size]>
464
    { typedef typename remove_all_extents<_Tp>::type     type; };
465
 
466
  template
467
    struct remove_all_extents<_Tp[]>
468
    { typedef typename remove_all_extents<_Tp>::type     type; };
469
 
470
  // pointer modifications [4.7.4].
471
 
472
  template
473
    struct __remove_pointer_helper
474
    { typedef _Tp     type; };
475
 
476
  template
477
    struct __remove_pointer_helper<_Tp, _Up*>
478
    { typedef _Up     type; };
479
 
480
  /// remove_pointer
481
  template
482
    struct remove_pointer
483
    : public __remove_pointer_helper<_Tp, typename remove_cv<_Tp>::type>
484
    { };
485
 
486
  template
487
    struct remove_reference;
488
 
489
  /// add_pointer
490
  template
491
    struct add_pointer
492
    { typedef typename remove_reference<_Tp>::type*     type; };
493
 
494
  template
495
    struct is_reference
496
    : public false_type { };
497
 
498
  template
499
    struct is_reference<_Tp&>
500
    : public true_type { };
501
 
502
  template
503
    struct is_pod
504
    : public integral_constant::value>
505
    { };
506
 
507
  template
508
    struct has_trivial_constructor
509
    : public integral_constant::value>
510
    { };
511
 
512
  template
513
    struct has_trivial_copy
514
    : public integral_constant::value>
515
    { };
516
 
517
  template
518
    struct has_trivial_assign
519
    : public integral_constant::value>
520
    { };
521
 
522
  template
523
    struct has_trivial_destructor
524
    : public integral_constant::value>
525
    { };
526
 
527
  template
528
    struct has_nothrow_constructor
529
    : public integral_constant::value>
530
    { };
531
 
532
  template
533
    struct has_nothrow_copy
534
    : public integral_constant::value>
535
    { };
536
 
537
  template
538
    struct has_nothrow_assign
539
    : public integral_constant::value>
540
    { };
541
 
542
  template
543
    struct __is_signed_helper
544
    : public false_type { };
545
  _DEFINE_SPEC(0, __is_signed_helper, signed char, true)
546
  _DEFINE_SPEC(0, __is_signed_helper, short, true)
547
  _DEFINE_SPEC(0, __is_signed_helper, int, true)
548
  _DEFINE_SPEC(0, __is_signed_helper, long, true)
549
  _DEFINE_SPEC(0, __is_signed_helper, long long, true)
550
 
551
  template
552
    struct is_signed
553
    : public integral_constant
554
				      remove_cv<_Tp>::type>::value)>
555
    { };
556
 
557
  template
558
    struct __is_unsigned_helper
559
    : public false_type { };
560
  _DEFINE_SPEC(0, __is_unsigned_helper, unsigned char, true)
561
  _DEFINE_SPEC(0, __is_unsigned_helper, unsigned short, true)
562
  _DEFINE_SPEC(0, __is_unsigned_helper, unsigned int, true)
563
  _DEFINE_SPEC(0, __is_unsigned_helper, unsigned long, true)
564
  _DEFINE_SPEC(0, __is_unsigned_helper, unsigned long long, true)
565
 
566
  template
567
    struct is_unsigned
568
    : public integral_constant
569
				      remove_cv<_Tp>::type>::value)>
570
    { };
571
 
572
  template
573
    struct __is_base_of_helper
574
    {
575
      typedef typename remove_cv<_Base>::type    _NoCv_Base;
576
      typedef typename remove_cv<_Derived>::type _NoCv_Derived;
577
      static const bool __value = (is_same<_Base, _Derived>::value
578
				   || (__is_base_of(_Base, _Derived)
579
				       && !is_same<_NoCv_Base,
580
				                   _NoCv_Derived>::value));
581
    };
582
 
583
  template
584
    struct is_base_of
585
    : public integral_constant
586
			       __is_base_of_helper<_Base, _Derived>::__value>
587
    { };
588
 
589
  template
590
    struct __is_convertible_simple
591
    : public __sfinae_types
592
    {
593
    private:
594
      static __one __test(_To);
595
      static __two __test(...);
596
      static _From __makeFrom();
597
 
598
    public:
599
      static const bool __value = sizeof(__test(__makeFrom())) == 1;
600
    };
601
 
602
  template
603
    struct add_reference;
604
 
605
  template
606
    struct __is_int_or_cref
607
    {
608
      typedef typename remove_reference<_Tp>::type __rr_Tp;
609
      static const bool __value = (is_integral<_Tp>::value
610
				   || (is_integral<__rr_Tp>::value
611
				       && is_const<__rr_Tp>::value
612
				       && !is_volatile<__rr_Tp>::value));
613
    };
614
 
615
  template
616
	   bool = (is_void<_From>::value || is_void<_To>::value
617
		   || is_function<_To>::value || is_array<_To>::value
618
		   // This special case is here only to avoid warnings.
619
		   || (is_floating_point
620
		       remove_reference<_From>::type>::value
621
		       && __is_int_or_cref<_To>::__value))>
622
    struct __is_convertible_helper
623
    {
624
      // "An imaginary lvalue of type From...".
625
      static const bool __value = (__is_convertible_simple
626
				   add_reference<_From>::type, _To>::__value);
627
    };
628
 
629
  template
630
    struct __is_convertible_helper<_From, _To, true>
631
    { static const bool __value = (is_void<_To>::value
632
				   || (__is_int_or_cref<_To>::__value
633
				       && !is_void<_From>::value)); };
634
 
635
  template
636
    struct is_convertible
637
    : public integral_constant
638
			       __is_convertible_helper<_From, _To>::__value>
639
    { };
640
 
641
  // reference modifications [4.7.2].
642
  template
643
    struct remove_reference
644
    { typedef _Tp     type; };
645
 
646
  template
647
    struct remove_reference<_Tp&>
648
    { typedef _Tp     type; };
649
 
650
  // NB: Careful with reference to void.
651
  template::value
652
				 || is_reference<_Tp>::value)>
653
    struct __add_reference_helper
654
    { typedef _Tp&    type; };
655
 
656
  template
657
    struct __add_reference_helper<_Tp, true>
658
    { typedef _Tp     type; };
659
 
660
  template
661
    struct add_reference
662
    : public __add_reference_helper<_Tp>
663
    { };
664
 
665
  // other transformations [4.8].
666
  template
667
    struct aligned_storage
668
    {
669
      union type
670
      {
671
	unsigned char __data[_Len];
672
	struct __attribute__((__aligned__((_Align)))) { } __align;
673
      };
674
    };
675
 
676
#undef _DEFINE_SPEC_0_HELPER
677
#undef _DEFINE_SPEC_1_HELPER
678
#undef _DEFINE_SPEC_2_HELPER
679
#undef _DEFINE_SPEC
680
 
681
  /// @} group metaprogramming
682
 
683
_GLIBCXX_END_NAMESPACE_VERSION
684
}
685
}
686
 
687
#endif // _GLIBCXX_TR1_TYPE_TRAITS