177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1996,1997 477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc. 577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1997 777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Moscow Center for SPARC Technology 877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999 1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev 1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed 1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk. 1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted 1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies. 1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted, 1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was 1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice. 2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_TYPE_TRAITS_H 2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define _STLP_TYPE_TRAITS_H 2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' TurnerThis header file provides a framework for allowing compile time dispatch 2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbased on type attributes. This is useful when writing template code. 2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' TurnerFor example, when making a copy of an array of an unknown type, it helps 3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerto know if the type has a trivial copy constructor or not, to help decide 3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerif a memcpy can be used. 3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' TurnerThe class template __type_traits provides a series of typedefs each of 3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerwhich is either __true_type or __false_type. The argument to 3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__type_traits can be any type. The typedefs within this template will 3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerattain their correct values by one of these means: 3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 1. The general instantiation contain conservative values which work 3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for all types. 3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2. Specializations may be declared to make distinctions between types. 4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3. Some compilers (such as the Silicon Graphics N32 and N64 compilers) 4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner will automatically provide the appropriate specializations for all 4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner types. 4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' TurnerEXAMPLE: 4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//Copy an array of elements which have non-trivial copy constructors 4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class T> void copy(T* source, T* destination, int n, __false_type); 4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//Copy an array of elements which have trivial copy constructors. Use memcpy. 4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class T> void copy(T* source, T* destination, int n, __true_type); 5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//Copy an array of any type by using the most efficient copy mechanism 5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class T> inline void copy(T* source,T* destination,int n) { 5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner copy(source, destination, n, 5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typename __type_traits<T>::has_trivial_copy_constructor()); 5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner*/ 5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef __WATCOMC__ 5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_cwchar.h> 6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_TYPE_MANIPS_H 6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/type_manips.h> 6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_USE_BOOST_SUPPORT 6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/boost_type_traits.h> 6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <boost/type_traits/add_reference.hpp> 6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <boost/type_traits/add_const.hpp> 7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_USE_BOOST_SUPPORT */ 7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE 7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_USE_BOOST_SUPPORT) 7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// The following could be written in terms of numeric_limits. 7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// We're doing it separately to reduce the number of dependencies. 7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> struct _IsIntegral 8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __false_type _Ret; }; 8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_NO_BOOL 8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<bool> 8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* _STLP_NO_BOOL */ 8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<char> 8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_NO_SIGNED_BUILTINS 9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<signed char> 9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<unsigned char> 9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined ( _STLP_HAS_WCHAR_T ) && ! defined (_STLP_WCHAR_T_IS_USHORT) 9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<wchar_t> 10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* _STLP_HAS_WCHAR_T */ 10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<short> 10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<unsigned short> 10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<int> 11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<unsigned int> 11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<long> 11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<unsigned long> 11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifdef _STLP_LONG_LONG 12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<_STLP_LONG_LONG> 12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsIntegral<unsigned _STLP_LONG_LONG> 12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* _STLP_LONG_LONG */ 12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> struct _IsRational 13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __false_type _Ret; }; 13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsRational<float> 13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsRational<double> 13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if !defined ( _STLP_NO_LONG_DOUBLE ) 13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct _IsRational<long double> 14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Forward declarations. 14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> struct __type_traits; 14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _IsPOD> struct __type_traits_aux { 14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type has_trivial_default_constructor; 14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type has_trivial_copy_constructor; 14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type has_trivial_assignment_operator; 14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type has_trivial_destructor; 15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type is_POD_type; 15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL 15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits_aux<__false_type> { 15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type has_trivial_default_constructor; 15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type has_trivial_copy_constructor; 15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type has_trivial_assignment_operator; 15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type has_trivial_destructor; 15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type is_POD_type; 16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL 16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits_aux<__true_type> { 16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __true_type has_trivial_default_constructor; 16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __true_type has_trivial_copy_constructor; 16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __true_type has_trivial_assignment_operator; 16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __true_type has_trivial_destructor; 16877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __true_type is_POD_type; 16977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 17077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 17177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 17277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsRef { 17377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type _Ret; 17477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 17577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 17677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined (_STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS) 17777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 17877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris : simulation technique is used here according to Adobe Open Source License Version 1.0. 17977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright 2000 Adobe Systems Incorporated and others. All rights reserved. 18077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Authors: Mat Marcus and Jesse Jones 18177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * The original version of this source code may be found at 18277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * http://opensource.adobe.com. 18377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 18477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 18577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _PointerShim { 18677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* 18777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Since the compiler only allows at most one non-trivial 18877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * implicit conversion we can make use of a shim class to 18977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * be sure that IsPtr below doesn't accept classes with 19077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * implicit pointer conversion operators 19177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 19277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _PointerShim(const volatile void*); // no implementation 19377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 19477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 19577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// These are the discriminating functions 19677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar _STLP_CALL _IsP(bool, _PointerShim); // no implementation is required 19777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar* _STLP_CALL _IsP(bool, ...); // no implementation is required 19877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 19977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 20077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsPtr { 20177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* 20277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This template meta function takes a type T 20377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * and returns true exactly when T is a pointer. 20477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * One can imagine meta-functions discriminating on 20577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * other criteria. 20677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 20777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _Tp& __null_rep(); 20877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _Ptr = (sizeof(_IsP(false,__null_rep())) == sizeof(char)) }; 20977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __bool2type<_Ptr>::_Ret _Ret; 21077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 21177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 21277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 21377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// we make general case dependant on the fact the type is actually a pointer. 21477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 21577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits : __type_traits_aux<typename _IsPtr<_Tp>::_Ret> {}; 21677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 21777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else /* _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS */ 21877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 21977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> struct _IsPtr { 22077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type _Ret; 22177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 22277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 22377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 22477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits { 22577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __true_type this_dummy_member_must_be_first; 22677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* Do not remove this member. It informs a compiler which 22777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner automatically specializes __type_traits that this 22877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __type_traits template is special. It just makes sure that 22977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner things work if an implementation is using a template 23077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner called __type_traits for something unrelated. */ 23177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 23277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner /* The following restrictions should be observed for the sake of 23377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner compilers which automatically produce type specific specializations 23477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner of this class: 23577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner - You may reorder the members below if you wish 23677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner - You may remove any of the members below if you wish 23777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner - You must not rename members without making the corresponding 23877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner name change in the compiler 23977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner - Members you add will be treated like regular members unless 24077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 24177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner you add the appropriate support in the compiler. */ 24277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if !defined (_STLP_HAS_TYPE_TRAITS_INTRINSICS) 24377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type has_trivial_default_constructor; 24477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type has_trivial_copy_constructor; 24577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type has_trivial_assignment_operator; 24677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type has_trivial_destructor; 24777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type is_POD_type; 24877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 24977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __bool2type<_STLP_HAS_TRIVIAL_CONSTRUCTOR(_Tp)>::_Ret has_trivial_default_constructor; 25077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __bool2type<_STLP_HAS_TRIVIAL_COPY(_Tp)>::_Ret has_trivial_copy_constructor; 25177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __bool2type<_STLP_HAS_TRIVIAL_ASSIGN(_Tp)>::_Ret has_trivial_assignment_operator; 25277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __bool2type<_STLP_HAS_TRIVIAL_DESTRUCTOR(_Tp)>::_Ret has_trivial_destructor; 25377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __bool2type<_STLP_IS_POD(_Tp)>::_Ret is_POD_type; 25477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 25577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 25677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 25777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 25877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> struct _IsPtr<_Tp*> 25977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 26077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> struct _IsRef<_Tp&> 26177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __true_type _Ret; }; 26277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 26377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> struct __type_traits<_Tp*> : __type_traits_aux<__true_type> 26477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{}; 26577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */ 26677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 26777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS */ 26877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 26977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Provide some specializations. This is harmless for compilers that 27077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// have built-in __types_traits support, and essential for compilers 27177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// that don't. 27277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if !defined (_STLP_QUALIFIED_SPECIALIZATION_BUG) 27377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define _STLP_DEFINE_TYPE_TRAITS_FOR(Type) \ 27477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct __type_traits< Type > : __type_traits_aux<__true_type> {}; \ 27577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct __type_traits< const Type > : __type_traits_aux<__true_type> {}; \ 27677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct __type_traits< volatile Type > : __type_traits_aux<__true_type> {}; \ 27777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct __type_traits< const volatile Type > : __type_traits_aux<__true_type> {} 27877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 27977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define _STLP_DEFINE_TYPE_TRAITS_FOR(Type) \ 28077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL struct __type_traits< Type > : __type_traits_aux<__true_type> {}; 28177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 28277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 28377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_NO_BOOL 28477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(bool); 28577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* _STLP_NO_BOOL */ 28677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(char); 28777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_NO_SIGNED_BUILTINS 28877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(signed char); 28977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 29077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(unsigned char); 29177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined ( _STLP_HAS_WCHAR_T ) && ! defined (_STLP_WCHAR_T_IS_USHORT) 29277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(wchar_t); 29377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* _STLP_HAS_WCHAR_T */ 29477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 29577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(short); 29677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(unsigned short); 29777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(int); 29877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(unsigned int); 29977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(long); 30077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(unsigned long); 30177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 30277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifdef _STLP_LONG_LONG 30377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(_STLP_LONG_LONG); 30477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(unsigned _STLP_LONG_LONG); 30577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* _STLP_LONG_LONG */ 30677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 30777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(float); 30877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(double); 30977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 31077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if !defined ( _STLP_NO_LONG_DOUBLE ) 31177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DEFINE_TYPE_TRAITS_FOR(long double); 31277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 31377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 31477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 31577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _ArePtrs, class _Src, class _Dst> 31677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsCVConvertibleIf 31777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef typename _IsCVConvertible<_Src, _Dst>::_Ret _Ret; }; 31877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 31977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Src, class _Dst> 32077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsCVConvertibleIf<__false_type, _Src, _Dst> 32177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __false_type _Ret; }; 32277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 32377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) 32477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _ArePtrs> 32577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsCVConvertibleIfAux { 32677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner template <class _Src, class _Dst> 32777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner struct _In 32877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { typedef typename _IsCVConvertible<_Src, _Dst>::_Ret _Ret; }; 32977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 33077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 33177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL 33277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsCVConvertibleIfAux<__false_type> { 33377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner template <class _Src, class _Dst> 33477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner struct _In 33577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { typedef __false_type _Ret; }; 33677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 33777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 33877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _ArePtrs, class _Src, class _Dst> 33977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsCVConvertibleIf { 34077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsCVConvertibleIfAux<_ArePtrs>::_STLP_TEMPLATE _In<_Src, _Dst>::_Ret _Ret; 34177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 34277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 34377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* default behavior: we prefer to miss an optimization rather than taking the risk of 34477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * a compilation error if playing with types with exotic memory alignment. 34577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 34677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _ArePtrs, class _Src, class _Dst> 34777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsCVConvertibleIf 34877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef __false_type _Ret; }; 34977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 35077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 35177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 35277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Src, class _Dst> 35377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _TrivialNativeTypeCopy { 35477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsPtr<_Src>::_Ret _Ptr1; 35577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsPtr<_Dst>::_Ret _Ptr2; 35677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Land2<_Ptr1, _Ptr2>::_Ret _BothPtrs; 35777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsCVConvertibleIf<_BothPtrs, _Src, _Dst>::_Ret _Convertible; 35877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Land2<_BothPtrs, _Convertible>::_Ret _Trivial1; 35977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 36077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __bool2type<(sizeof(_Src) == sizeof(_Dst))>::_Ret _SameSize; 36177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 36277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (__BORLANDC__) || (__BORLANDC__ < 0x564) 36377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsIntegral<_Src>::_Ret _Int1; 36477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 36577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _UnQual<_Src>::_Type _UnQuSrc; 36677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsIntegral<_UnQuSrc>::_Ret _Int1; 36777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 36877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsIntegral<_Dst>::_Ret _Int2; 36977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Land2<_Int1, _Int2>::_Ret _BothInts; 37077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 37177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsRational<_Src>::_Ret _Rat1; 37277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsRational<_Dst>::_Ret _Rat2; 37377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Land2<_Rat1, _Rat2>::_Ret _BothRats; 37477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 37577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Lor2<_BothInts, _BothRats>::_Ret _BothNatives; 37677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (__BORLANDC__) || (__BORLANDC__ >= 0x564) 37777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Land2<_BothNatives, _SameSize>::_Ret _Trivial2; 37877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 37977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsUnQual<_Dst>::_Ret _UnQualDst; 38077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Land3<_BothNatives, _SameSize, _UnQualDst>::_Ret _Trivial2; 38177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 38277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Lor2<_Trivial1, _Trivial2>::_Ret _Ret; 38377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 38477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 38577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Src, class _Dst> 38677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _TrivialCopy { 38777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _TrivialNativeTypeCopy<_Src, _Dst>::_Ret _NativeRet; 38877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if !defined (__BORLANDC__) || (__BORLANDC__ != 0x560) 38977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __type_traits<_Src>::has_trivial_assignment_operator _Tr1; 39077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 39177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _UnConstPtr<_Src*>::_Type _UnConstSrc; 39277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __type_traits<_UnConstSrc>::has_trivial_assignment_operator _Tr1; 39377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 39477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _AreCopyable<_Src, _Dst>::_Ret _Tr2; 39577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Land2<_Tr1, _Tr2>::_Ret _UserRet; 39677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Lor2<_NativeRet, _UserRet>::_Ret _Ret; 39777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _Ret _Answer() { return _Ret(); } 39877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 39977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 40077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Src, class _Dst> 40177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _TrivialUCopy { 40277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _TrivialNativeTypeCopy<_Src, _Dst>::_Ret _NativeRet; 40377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if !defined (__BORLANDC__) || (__BORLANDC__ != 0x560) 40477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __type_traits<_Src>::has_trivial_copy_constructor _Tr1; 40577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 40677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _UnConstPtr<_Src*>::_Type _UnConstSrc; 40777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __type_traits<_UnConstSrc>::has_trivial_copy_constructor _Tr1; 40877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 40977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _AreCopyable<_Src, _Dst>::_Ret _Tr2; 41077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Land2<_Tr1, _Tr2>::_Ret _UserRet; 41177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Lor2<_NativeRet, _UserRet>::_Ret _Ret; 41277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _Ret _Answer() { return _Ret(); } 41377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 41477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 41577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 41677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _DefaultZeroValue { 41777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsIntegral<_Tp>::_Ret _Tr1; 41877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsRational<_Tp>::_Ret _Tr2; 41977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsPtr<_Tp>::_Ret _Tr3; 42077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Lor3<_Tr1, _Tr2, _Tr3>::_Ret _Ret; 42177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 42277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 42377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 42477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _TrivialInit { 42577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if !defined (__BORLANDC__) || (__BORLANDC__ != 0x560) 42677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __type_traits<_Tp>::has_trivial_default_constructor _Tr1; 42777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 42877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _UnConstPtr<_Tp*>::_Type _Tp1; 42977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __type_traits<_Tp1>::has_trivial_copy_constructor _Tr1; 43077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 43177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _DefaultZeroValue<_Tp>::_Ret _Tr2; 43277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Not<_Tr2>::_Ret _Tr3; 43377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Land2<_Tr1, _Tr3>::_Ret _Ret; 43477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _Ret _Answer() { return _Ret(); } 43577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 43677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 43777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* !_STLP_USE_BOOST_SUPPORT */ 43877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 43977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 44077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsPtrType { 44177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsPtr<_Tp>::_Ret _Type; 44277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _Type _Ret() { return _Type(); } 44377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 44477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 44577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 44677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsRefType { 44777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsRef<_Tp>::_Ret _Type; 44877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _Type _Ret() { return _Type();} 44977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 45077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 45177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 45277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __call_traits { 45377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_BOOST_SUPPORT) && !defined (_STLP_NO_EXTENSIONS) 45477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __select< ::boost::is_reference<_Tp>::value, 45577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typename ::boost::add_const<_Tp>::type, 45677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typename ::boost::add_reference< typename ::boost::add_const<_Tp>::type >::type>::_Ret const_param_type; 45777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __select< ::boost::is_reference<_Tp>::value, 45877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typename ::boost::remove_const<_Tp>::type, 45977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typename ::boost::add_reference<_Tp>::type>::_Ret param_type; 46077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 46177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef const _Tp& const_param_type; 46277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Tp& param_type; 46377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 46477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 46577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 46677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_USE_BOOST_SUPPORT) && !defined (_STLP_NO_EXTENSIONS) && defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 46777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 46877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __call_traits<_Tp&> { 46977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Tp& param_type; 47077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef const _Tp& const_param_type; 47177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 47277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 47377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __call_traits<const _Tp&> { 47477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef _Tp& param_type; 47577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef const _Tp& const_param_type; 47677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 47777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 47877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 47977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp1, class _Tp2> 48077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _BothPtrType { 48177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsPtr<_Tp1>::_Ret _IsPtr1; 48277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsPtr<_Tp2>::_Ret _IsPtr2; 48377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 48477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Land2<_IsPtr1, _IsPtr2>::_Ret _Ret; 48577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _Ret _Answer() { return _Ret(); } 48677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 48777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 48877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp1, class _Tp2, class _IsRef1, class _IsRef2> 48977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _OKToSwap { 49077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _AreSameTypes<_Tp1, _Tp2>::_Ret _Same; 49177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _Land3<_Same, _IsRef1, _IsRef2>::_Ret _Type; 49277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _Type _Answer() { return _Type(); } 49377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 49477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 49577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp1, class _Tp2, class _IsRef1, class _IsRef2> 49677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _OKToSwap<_Tp1, _Tp2, _IsRef1, _IsRef2> 49777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_IsOKToSwap(_Tp1*, _Tp2*, const _IsRef1&, const _IsRef2&) 49877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _OKToSwap<_Tp1, _Tp2, _IsRef1, _IsRef2>(); } 49977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 50077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Src, class _Dst> 50177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _TrivialCopy<_Src, _Dst> _UseTrivialCopy(_Src*, _Dst*) 50277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _TrivialCopy<_Src, _Dst>(); } 50377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 50477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Src, class _Dst> 50577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _TrivialUCopy<_Src, _Dst> _UseTrivialUCopy(_Src*, _Dst*) 50677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _TrivialUCopy<_Src, _Dst>(); } 50777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 50877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) || defined (__BORLANDC__) || \ 50977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner defined (__DMC__) 51077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _NegativeAnswer { 51177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef __false_type _Ret; 51277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _Ret _Answer() { return _Ret(); } 51377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 51477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 51577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Src, class _Dst> 51677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _NegativeAnswer _UseTrivialCopy(_Src*, const _Dst*) 51777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _NegativeAnswer(); } 51877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 51977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Src, class _Dst> 52077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _NegativeAnswer _UseTrivialCopy(_Src*, volatile _Dst*) 52177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _NegativeAnswer(); } 52277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 52377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Src, class _Dst> 52477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _NegativeAnswer _UseTrivialCopy(_Src*, const volatile _Dst*) 52577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _NegativeAnswer(); } 52677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 52777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Src, class _Dst> 52877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _NegativeAnswer _UseTrivialUCopy(_Src*, const _Dst*) 52977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _NegativeAnswer(); } 53077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 53177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Src, class _Dst> 53277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _NegativeAnswer _UseTrivialUCopy(_Src*, volatile _Dst*) 53377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _NegativeAnswer(); } 53477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 53577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Src, class _Dst> 53677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _NegativeAnswer _UseTrivialUCopy(_Src*, const volatile _Dst*) 53777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _NegativeAnswer(); } 53877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 53977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 54077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 54177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _TrivialInit<_Tp> _UseTrivialInit(_Tp*) 54277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _TrivialInit<_Tp>(); } 54377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 54477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 54577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsPOD { 54677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __type_traits<_Tp>::is_POD_type _Type; 54777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _Type _Answer() { return _Type(); } 54877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 54977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 55077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 55177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _IsPOD<_Tp> _Is_POD(_Tp*) 55277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _IsPOD<_Tp>(); } 55377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 55477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 55577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _DefaultZeroValueQuestion { 55677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _DefaultZeroValue<_Tp>::_Ret _Ret; 55777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner static _Ret _Answer() { return _Ret(); } 55877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 55977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 56077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 56177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _DefaultZeroValueQuestion<_Tp> _HasDefaultZeroValue(_Tp*) 56277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _DefaultZeroValueQuestion<_Tp>(); } 56377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 56477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 56577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Base class used: 56677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * - to simulate partial template specialization 56777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * - to simulate partial function ordering 56877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * - to recognize STLport class from user specialized one 56977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 57077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 57177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __stlport_class 57277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef _Tp _Type; }; 57377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 57477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 57577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsSTLportClass { 57677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsConvertible<_Tp, __stlport_class<_Tp> >::_Ret _Ret; 57777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__BORLANDC__) 57877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _Is = _IsConvertible<_Tp, __stlport_class<_Tp> >::value }; 57977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 58077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 58177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 58277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 58377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 58477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _SwapImplemented { 58577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename _IsSTLportClass<_Tp>::_Ret _Ret; 58677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined (__BORLANDC__) 58777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _Is = _IsSTLportClass<_Tp>::_Is }; 58877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 58977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 59077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 59177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 59277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 59377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _TpWithState : private _Tp { 59477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _TpWithState(); 59577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int _state; 59677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 59777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 59877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* This is an internal helper struct used to guess if we are working 59977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * on a stateless class. It can only be instanciated with a class type. */ 60077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 60177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _IsStateless { 60277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner enum { _Is = sizeof(_TpWithState<_Tp>) == sizeof(int) }; 60377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __bool2type<_Is>::_Ret _Ret; 60477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 60577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 60677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE 60777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 60877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION 60977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined (__BORLANDC__) || \ 61077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner defined (__SUNPRO_CC) || \ 61177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner (defined (__MWERKS__) && (__MWERKS__ <= 0x2303)) || \ 61277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner (defined (__sgi) && defined (_COMPILER_VERSION)) || \ 61377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner defined (__DMC__) 61477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define _STLP_IS_POD_ITER(_It, _Tp) __type_traits< typename iterator_traits< _Tp >::value_type >::is_POD_type() 61577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 61677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define _STLP_IS_POD_ITER(_It, _Tp) typename __type_traits< typename iterator_traits< _Tp >::value_type >::is_POD_type() 61777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 61877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 61977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# define _STLP_IS_POD_ITER(_It, _Tp) _Is_POD( _STLP_VALUE_TYPE( _It, _Tp ) )._Answer() 62077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 62177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 62277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_TYPE_TRAITS_H */ 62377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 62477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Local Variables: 62577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// mode:C++ 62677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// End: 627