Subversion Repositories Kolibri OS

Rev

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

  1. // The  -*- C++ -*- type traits classes for internal use in libstdc++
  2.  
  3. // Copyright (C) 2000-2001 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 2, 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. // You should have received a copy of the GNU General Public License along
  17. // with this library; see the file COPYING.  If not, write to the Free
  18. // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  19. // USA.
  20.  
  21. // As a special exception, you may use this file as part of a free software
  22. // library without restriction.  Specifically, if other files instantiate
  23. // templates or use macros or inline functions from this file, or you compile
  24. // this file and link it with other files to produce an executable, this
  25. // file does not by itself cause the resulting executable to be covered by
  26. // the GNU General Public License.  This exception does not however
  27. // invalidate any other reasons why the executable file might be covered by
  28. // the GNU General Public License.
  29.  
  30. // Written by Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
  31.  
  32. #ifndef _CPP_BITS_CPP_TYPE_TRAITS_H
  33. #define _CPP_BITS_CPP_TYPE_TRAITS_H 1
  34.  
  35. #pragma GCC system_header
  36.  
  37. //
  38. // This file provides some compile-time information about various types.
  39. // These representations were designed, on purpose, to be constant-expressions
  40. // and not types as found in <stl/bits/type_traits.h>.  In particular, they
  41. // can be used in control structures and the optimizer hopefully will do
  42. // the obvious thing.
  43. //
  44. // Why integral expressions, and not functions nor types?
  45. // Firstly, these compile-time entities are used as template-arguments
  46. // so function return values won't work:  We need compile-time entities.
  47. // We're left with types and constant  integral expressions.
  48. // Secondly, from the point of view of ease of use, type-based compile-time
  49. // information is -not- *that* convenient.  On has to write lots of
  50. // overloaded functions and to hope that the compiler will select the right
  51. // one. As a net effect, the overall structure isn't very clear at first
  52. // glance.
  53. // Thirdly, partial ordering and overload resolution (of function templates)
  54. // is highly costly in terms of compiler-resource.  It is a Good Thing to
  55. // keep these resource consumption as least as possible.
  56. //
  57. // See valarray_array.h for a case use.
  58. //
  59. // -- Gaby (dosreis@cmla.ens-cachan.fr) 2000-03-06.
  60. //
  61.  
  62. namespace std
  63. {
  64.   template<typename _Tp>
  65.     struct __is_void
  66.     {
  67.       enum
  68.       {
  69.         _M_type = 0
  70.       };
  71.     };
  72.  
  73.   template<>
  74.     struct __is_void<void>
  75.     {
  76.       enum
  77.       {
  78.         _M_type = 1
  79.       };
  80.     };
  81.  
  82.   //
  83.   // Integer types
  84.   //
  85.   template<typename _Tp>
  86.     struct __is_integer
  87.     {
  88.       enum
  89.       {
  90.         _M_type = 0
  91.       };
  92.     };
  93.  
  94.   // Thirteen specializations (yes there are eleven standard integer
  95.   // types; 'long long' and 'unsigned long long' are supported as
  96.   // extensions)
  97.   template<>
  98.     struct __is_integer<bool>
  99.     {
  100.       enum
  101.       {
  102.         _M_type = 1
  103.       };
  104.     };
  105.  
  106.   template<>
  107.     struct __is_integer<char>
  108.     {
  109.       enum
  110.       {
  111.         _M_type = 1
  112.       };
  113.     };
  114.  
  115.   template<>
  116.     struct __is_integer<signed char>
  117.     {
  118.       enum
  119.       {
  120.         _M_type = 1
  121.       };
  122.     };
  123.  
  124.   template<>
  125.   struct __is_integer<unsigned char>
  126.   {
  127.     enum
  128.     {
  129.       _M_type = 1
  130.     };
  131.   };
  132.  
  133. # ifdef _GLIBCPP_USE_WCHAR_T
  134.   template<>
  135.   struct __is_integer<wchar_t>
  136.   {
  137.     enum
  138.     {
  139.       _M_type = 1
  140.     };
  141.   };
  142. # endif
  143.  
  144.   template<>
  145.   struct __is_integer<short>
  146.   {
  147.     enum
  148.     {
  149.       _M_type = 1
  150.     };
  151.   };
  152.  
  153.   template<>
  154.   struct __is_integer<unsigned short>
  155.   {
  156.     enum
  157.     {
  158.       _M_type = 1
  159.     };
  160.   };
  161.  
  162.   template<>
  163.   struct __is_integer<int>
  164.   {
  165.     enum
  166.     {
  167.       _M_type = 1
  168.     };
  169.   };
  170.  
  171.   template<>
  172.   struct __is_integer<unsigned int>
  173.   {
  174.     enum
  175.     {
  176.       _M_type = 1
  177.     };
  178.   };
  179.  
  180.   template<>
  181.   struct __is_integer<long>
  182.   {
  183.     enum
  184.     {
  185.       _M_type = 1
  186.     };
  187.   };
  188.  
  189.   template<>
  190.   struct __is_integer<unsigned long>
  191.   {
  192.     enum
  193.     {
  194.       _M_type = 1
  195.     };
  196.   };
  197.  
  198. # ifdef _GLIBCPP_USE_LONG_LONG
  199.   template<>
  200.   struct __is_integer<long long>
  201.   {
  202.     enum
  203.     {
  204.       _M_type = 1
  205.     };
  206.   };
  207.  
  208.   template<>
  209.   struct __is_integer<unsigned long long>
  210.   {
  211.     enum
  212.     {
  213.       _M_type = 1
  214.     };
  215.   };
  216. # endif
  217.  
  218.   //
  219.   // Floating point types
  220.   //
  221.   template<typename _Tp>
  222.   struct __is_floating
  223.   {
  224.     enum
  225.     {
  226.       _M_type = 0
  227.     };
  228.   };
  229.  
  230.   // three specializations (float, double and 'long double')
  231.   template<>
  232.   struct __is_floating<float>
  233.   {
  234.     enum
  235.     {
  236.       _M_type = 1
  237.     };
  238.   };
  239.  
  240.   template<>
  241.   struct __is_floating<double>
  242.   {
  243.     enum
  244.     {
  245.       _M_type = 1
  246.     };
  247.   };
  248.  
  249.   template<>
  250.   struct __is_floating<long double>
  251.   {
  252.     enum
  253.     {
  254.       _M_type = 1
  255.     };
  256.   };
  257.  
  258.   //
  259.   // An arithmetic type is an integer type or a floating point type
  260.   //
  261.   template<typename _Tp>
  262.   struct __is_arithmetic
  263.   {
  264.     enum
  265.     {
  266.       _M_type = __is_integer<_Tp>::_M_type || __is_floating<_Tp>::_M_type
  267.     };
  268.   };
  269.  
  270.   //
  271.   // A fundamental type is `void' or and arithmetic type
  272.   //
  273.   template<typename _Tp>
  274.   struct __is_fundamental
  275.   {
  276.     enum
  277.     {
  278.       _M_type = __is_void<_Tp>::_M_type || __is_arithmetic<_Tp>::_M_type
  279.     };
  280.   };
  281.  
  282.   //
  283.   // For the immediate use, the following is a good approximation
  284.   //
  285.   template<typename _Tp>
  286.   struct __is_pod
  287.   {
  288.     enum
  289.     {
  290.       _M_type = __is_fundamental<_Tp>::_M_type
  291.     };
  292.   };
  293.  
  294. } // namespace std
  295.  
  296.  
  297. #endif //_CPP_BITS_CPP_TYPE_TRAITS_H
  298.