X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=libstdc%2B%2B-v3%2Finclude%2Fbits%2Fcpp_type_traits.h;fp=libstdc%2B%2B-v3%2Finclude%2Fbits%2Fcpp_type_traits.h;h=afb0049b554edf68db32bc15be645b65f87d1edb;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=d66fe7638410f14c0dc52a147834bbf6434cdc94;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/libstdc++-v3/include/bits/cpp_type_traits.h b/libstdc++-v3/include/bits/cpp_type_traits.h index d66fe763..afb0049b 100644 --- a/libstdc++-v3/include/bits/cpp_type_traits.h +++ b/libstdc++-v3/include/bits/cpp_type_traits.h @@ -1,11 +1,12 @@ // The -*- C++ -*- type traits classes for internal use in libstdc++ -// Copyright (C) 2000, 2001 Free Software Foundation, Inc. +// Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 +// Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the -// Free Software Foundation; either version 2, or (at your option) +// Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, @@ -13,36 +14,33 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING. If not, write to the Free -// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. -// As a special exception, you may use this file as part of a free software -// library without restriction. Specifically, if other files instantiate -// templates or use macros or inline functions from this file, or you compile -// this file and link it with other files to produce an executable, this -// file does not by itself cause the resulting executable to be covered by -// the GNU General Public License. This exception does not however -// invalidate any other reasons why the executable file might be covered by -// the GNU General Public License. - -// Written by Gabriel Dos Reis +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . /** @file cpp_type_traits.h * This is an internal header file, included by other library headers. * You should not attempt to use it directly. */ -#ifndef _CPP_BITS_CPP_TYPE_TRAITS_H -#define _CPP_BITS_CPP_TYPE_TRAITS_H 1 +// Written by Gabriel Dos Reis + +#ifndef _CPP_TYPE_TRAITS_H +#define _CPP_TYPE_TRAITS_H 1 #pragma GCC system_header +#include + // // This file provides some compile-time information about various types. // These representations were designed, on purpose, to be constant-expressions -// and not types as found in . In particular, they +// and not types as found in . In particular, they // can be used in control structures and the optimizer hopefully will do // the obvious thing. // @@ -63,25 +61,68 @@ // // -- Gaby (dosreis@cmla.ens-cachan.fr) 2000-03-06. // +// Update 2005: types are also provided and has been +// removed. +// + +// Forward declaration hack, should really include this from somewhere. +_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) + + template + class __normal_iterator; + +_GLIBCXX_END_NAMESPACE + +_GLIBCXX_BEGIN_NAMESPACE(std) + + struct __true_type { }; + struct __false_type { }; + + template + struct __truth_type + { typedef __false_type __type; }; + + template<> + struct __truth_type + { typedef __true_type __type; }; + + // N.B. The conversions to bool are needed due to the issue + // explained in c++/19404. + template + struct __traitor + { + enum { __value = bool(_Sp::__value) || bool(_Tp::__value) }; + typedef typename __truth_type<__value>::__type __type; + }; + + // Compare for equality of types. + template + struct __are_same + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + template + struct __are_same<_Tp, _Tp> + { + enum { __value = 1 }; + typedef __true_type __type; + }; -namespace std -{ + // Holds if the template-argument is a void type. template struct __is_void { - enum - { - _M_type = 0 - }; + enum { __value = 0 }; + typedef __false_type __type; }; template<> struct __is_void { - enum - { - _M_type = 1 - }; + enum { __value = 1 }; + typedef __true_type __type; }; // @@ -90,10 +131,8 @@ namespace std template struct __is_integer { - enum - { - _M_type = 0 - }; + enum { __value = 0 }; + typedef __false_type __type; }; // Thirteen specializations (yes there are eleven standard integer @@ -102,199 +141,279 @@ namespace std template<> struct __is_integer { - enum - { - _M_type = 1 - }; + enum { __value = 1 }; + typedef __true_type __type; }; - + template<> struct __is_integer { - enum - { - _M_type = 1 - }; + enum { __value = 1 }; + typedef __true_type __type; }; template<> struct __is_integer { - enum - { - _M_type = 1 - }; + enum { __value = 1 }; + typedef __true_type __type; }; - + template<> - struct __is_integer - { - enum + struct __is_integer { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; -# ifdef _GLIBCPP_USE_WCHAR_T +# ifdef _GLIBCXX_USE_WCHAR_T template<> - struct __is_integer - { - enum + struct __is_integer { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; # endif - + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_integer + { + enum { __value = 1 }; + typedef __true_type __type; + }; +#endif + template<> - struct __is_integer - { - enum + struct __is_integer { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; template<> - struct __is_integer - { - enum + struct __is_integer { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; template<> - struct __is_integer - { - enum + struct __is_integer { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; template<> - struct __is_integer - { - enum + struct __is_integer { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; template<> - struct __is_integer - { - enum + struct __is_integer { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; template<> - struct __is_integer - { - enum + struct __is_integer { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; template<> - struct __is_integer - { - enum + struct __is_integer { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; template<> - struct __is_integer - { - enum + struct __is_integer { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; // // Floating point types // template - struct __is_floating - { - enum + struct __is_floating { - _M_type = 0 + enum { __value = 0 }; + typedef __false_type __type; }; - }; // three specializations (float, double and 'long double') template<> - struct __is_floating - { - enum + struct __is_floating { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; template<> - struct __is_floating - { - enum + struct __is_floating { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; template<> - struct __is_floating - { - enum + struct __is_floating { - _M_type = 1 + enum { __value = 1 }; + typedef __true_type __type; }; - }; // - // An arithmetic type is an integer type or a floating point type + // Pointer types + // + template + struct __is_pointer + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + template + struct __is_pointer<_Tp*> + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + // + // Normal iterator type // template - struct __is_arithmetic - { - enum + struct __is_normal_iterator + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + template + struct __is_normal_iterator< __gnu_cxx::__normal_iterator<_Iterator, + _Container> > { - _M_type = __is_integer<_Tp>::_M_type || __is_floating<_Tp>::_M_type + enum { __value = 1 }; + typedef __true_type __type; }; - }; + + // + // An arithmetic type is an integer type or a floating point type + // + template + struct __is_arithmetic + : public __traitor<__is_integer<_Tp>, __is_floating<_Tp> > + { }; // // A fundamental type is `void' or and arithmetic type // template - struct __is_fundamental - { - enum + struct __is_fundamental + : public __traitor<__is_void<_Tp>, __is_arithmetic<_Tp> > + { }; + + // + // A scalar type is an arithmetic type or a pointer type + // + template + struct __is_scalar + : public __traitor<__is_arithmetic<_Tp>, __is_pointer<_Tp> > + { }; + + // + // For use in std::copy and std::find overloads for streambuf iterators. + // + template + struct __is_char + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + template<> + struct __is_char + { + enum { __value = 1 }; + typedef __true_type __type; + }; + +#ifdef _GLIBCXX_USE_WCHAR_T + template<> + struct __is_char + { + enum { __value = 1 }; + typedef __true_type __type; + }; +#endif + + template + struct __is_byte + { + enum { __value = 0 }; + typedef __false_type __type; + }; + + template<> + struct __is_byte { - _M_type = __is_void<_Tp>::_M_type || __is_arithmetic<_Tp>::_M_type + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_byte + { + enum { __value = 1 }; + typedef __true_type __type; + }; + + template<> + struct __is_byte + { + enum { __value = 1 }; + typedef __true_type __type; }; - }; // - // For the immediate use, the following is a good approximation + // Move iterator type // template - struct __is_pod - { - enum + struct __is_move_iterator { - _M_type = __is_fundamental<_Tp>::_M_type + enum { __value = 0 }; + typedef __false_type __type; }; - }; -} // namespace std +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + template + class move_iterator; + + template + struct __is_move_iterator< move_iterator<_Iterator> > + { + enum { __value = 1 }; + typedef __true_type __type; + }; +#endif +_GLIBCXX_END_NAMESPACE -#endif //_CPP_BITS_CPP_TYPE_TRAITS_H +#endif //_CPP_TYPE_TRAITS_H