111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1996,1997 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Silicon Graphics Computer Systems, Inc. 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1997 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Moscow Center for SPARC Technology 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1999 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Boris Fomitchev 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This material is provided "as is", with absolutely no warranty expressed 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * or implied. Any use is at your own risk. 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use or copy this software for any purpose is hereby granted 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * without fee, provided the above notices are retained on all copies. 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to modify the code and to distribute modified code is granted, 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided the above notices are retained, and a notice that the code was 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modified is included with the above copyright notice. 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_TYPE_TRAITS_H 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_TYPE_TRAITS_H 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* 2711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertThis header file provides a framework for allowing compile time dispatch 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbased on type attributes. This is useful when writing template code. 2911cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertFor example, when making a copy of an array of an unknown type, it helps 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertto know if the type has a trivial copy constructor or not, to help decide 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertif a memcpy can be used. 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3311cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertThe class template __type_traits provides a series of typedefs each of 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertwhich is either __true_type or __false_type. The argument to 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__type_traits can be any type. The typedefs within this template will 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertattain their correct values by one of these means: 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1. The general instantiation contain conservative values which work 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for all types. 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2. Specializations may be declared to make distinctions between types. 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3. Some compilers (such as the Silicon Graphics N32 and N64 compilers) 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert will automatically provide the appropriate specializations for all 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert types. 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4411cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertEXAMPLE: 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//Copy an array of elements which have non-trivial copy constructors 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T> void copy(T* source, T* destination, int n, __false_type); 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//Copy an array of elements which have trivial copy constructors. Use memcpy. 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T> void copy(T* source, T* destination, int n, __true_type); 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//Copy an array of any type by using the most efficient copy mechanism 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T> inline void copy(T* source,T* destination,int n) { 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert copy(source, destination, n, 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename __type_traits<T>::has_trivial_copy_constructor()); 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert*/ 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef __WATCOMC__ 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# include <stl/_cwchar.h> 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_TYPE_MANIPS_H 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# include <stl/type_manips.h> 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _STLP_USE_BOOST_SUPPORT 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# include <stl/boost_type_traits.h> 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# include <boost/type_traits/add_reference.hpp> 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# include <boost/type_traits/add_const.hpp> 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_USE_BOOST_SUPPORT */ 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_BEGIN_NAMESPACE 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_USE_BOOST_SUPPORT) 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The following could be written in terms of numeric_limits. 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// We're doing it separately to reduce the number of dependencies. 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> struct _IsIntegral 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __false_type _Ret; }; 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# ifndef _STLP_NO_BOOL 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<bool> 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif /* _STLP_NO_BOOL */ 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<char> 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# ifndef _STLP_NO_SIGNED_BUILTINS 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<signed char> 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<unsigned char> 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if defined ( _STLP_HAS_WCHAR_T ) && ! defined (_STLP_WCHAR_T_IS_USHORT) 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<wchar_t> 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif /* _STLP_HAS_WCHAR_T */ 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<short> 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<unsigned short> 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<int> 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<unsigned int> 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<long> 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<unsigned long> 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# ifdef _STLP_LONG_LONG 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<_STLP_LONG_LONG> 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsIntegral<unsigned _STLP_LONG_LONG> 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif /* _STLP_LONG_LONG */ 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> struct _IsRational 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __false_type _Ret; }; 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsRational<float> 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsRational<double> 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if !defined ( _STLP_NO_LONG_DOUBLE ) 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct _IsRational<long double> 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Forward declarations. 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> struct __type_traits; 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _IsPOD> struct __type_traits_aux { 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type has_trivial_default_constructor; 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type has_trivial_copy_constructor; 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type has_trivial_assignment_operator; 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type has_trivial_destructor; 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type is_POD_type; 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __type_traits_aux<__false_type> { 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type has_trivial_default_constructor; 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type has_trivial_copy_constructor; 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type has_trivial_assignment_operator; 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type has_trivial_destructor; 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type is_POD_type; 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __type_traits_aux<__true_type> { 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __true_type has_trivial_default_constructor; 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __true_type has_trivial_copy_constructor; 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __true_type has_trivial_assignment_operator; 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __true_type has_trivial_destructor; 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __true_type is_POD_type; 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsRef { 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type _Ret; 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if defined (_STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS) 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Boris : simulation technique is used here according to Adobe Open Source License Version 1.0. 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright 2000 Adobe Systems Incorporated and others. All rights reserved. 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Authors: Mat Marcus and Jesse Jones 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The original version of this source code may be found at 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * http://opensource.adobe.com. 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _PointerShim { 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Since the compiler only allows at most one non-trivial 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * implicit conversion we can make use of a shim class to 18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * be sure that IsPtr below doesn't accept classes with 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * implicit pointer conversion operators 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _PointerShim(const volatile void*); // no implementation 19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// These are the discriminating functions 19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertchar _STLP_CALL _IsP(bool, _PointerShim); // no implementation is required 19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertchar* _STLP_CALL _IsP(bool, ...); // no implementation is required 19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsPtr { 20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* 20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This template meta function takes a type T 20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * and returns true exactly when T is a pointer. 20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * One can imagine meta-functions discriminating on 20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * other criteria. 20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static _Tp& __null_rep(); 20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert enum { _Ptr = (sizeof(_IsP(false,__null_rep())) == sizeof(char)) }; 20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __bool2type<_Ptr>::_Ret _Ret; 21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// we make general case dependant on the fact the type is actually a pointer. 21411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __type_traits : __type_traits_aux<typename _IsPtr<_Tp>::_Ret> {}; 21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# else /* _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS */ 21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> struct _IsPtr { 22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type _Ret; 22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 22311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __type_traits { 22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __true_type this_dummy_member_must_be_first; 22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* Do not remove this member. It informs a compiler which 22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert automatically specializes __type_traits that this 22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __type_traits template is special. It just makes sure that 22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert things work if an implementation is using a template 23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert called __type_traits for something unrelated. */ 23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /* The following restrictions should be observed for the sake of 23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert compilers which automatically produce type specific specializations 23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert of this class: 23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert - You may reorder the members below if you wish 23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert - You may remove any of the members below if you wish 23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert - You must not rename members without making the corresponding 23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert name change in the compiler 23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert - Members you add will be treated like regular members unless 24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert you add the appropriate support in the compiler. */ 24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if !defined (_STLP_HAS_TYPE_TRAITS_INTRINSICS) 24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type has_trivial_default_constructor; 24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type has_trivial_copy_constructor; 24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type has_trivial_assignment_operator; 24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type has_trivial_destructor; 24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type is_POD_type; 24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# else 24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __bool2type<_STLP_HAS_TRIVIAL_CONSTRUCTOR(_Tp)>::_Ret has_trivial_default_constructor; 25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __bool2type<_STLP_HAS_TRIVIAL_COPY(_Tp)>::_Ret has_trivial_copy_constructor; 25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __bool2type<_STLP_HAS_TRIVIAL_ASSIGN(_Tp)>::_Ret has_trivial_assignment_operator; 25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __bool2type<_STLP_HAS_TRIVIAL_DESTRUCTOR(_Tp)>::_Ret has_trivial_destructor; 25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __bool2type<_STLP_IS_POD(_Tp)>::_Ret is_POD_type; 25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 25811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> struct _IsPtr<_Tp*> 25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 26011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> struct _IsRef<_Tp&> 26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __true_type _Ret; }; 26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> struct __type_traits<_Tp*> : __type_traits_aux<__true_type> 26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{}; 26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */ 26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif /* _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS */ 26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Provide some specializations. This is harmless for compilers that 27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// have built-in __types_traits support, and essential for compilers 27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// that don't. 27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if !defined (_STLP_QUALIFIED_SPECIALIZATION_BUG) 27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define _STLP_DEFINE_TYPE_TRAITS_FOR(Type) \ 27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct __type_traits< Type > : __type_traits_aux<__true_type> {}; \ 27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct __type_traits< const Type > : __type_traits_aux<__true_type> {}; \ 27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct __type_traits< volatile Type > : __type_traits_aux<__true_type> {}; \ 27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct __type_traits< const volatile Type > : __type_traits_aux<__true_type> {} 27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# else 27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define _STLP_DEFINE_TYPE_TRAITS_FOR(Type) \ 28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL struct __type_traits< Type > : __type_traits_aux<__true_type> {}; 28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# ifndef _STLP_NO_BOOL 28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(bool); 28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif /* _STLP_NO_BOOL */ 28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(char); 28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# ifndef _STLP_NO_SIGNED_BUILTINS 28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(signed char); 28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(unsigned char); 29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if defined ( _STLP_HAS_WCHAR_T ) && ! defined (_STLP_WCHAR_T_IS_USHORT) 29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(wchar_t); 29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif /* _STLP_HAS_WCHAR_T */ 29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(short); 29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(unsigned short); 29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(int); 29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(unsigned int); 29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(long); 30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(unsigned long); 30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# ifdef _STLP_LONG_LONG 30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(_STLP_LONG_LONG); 30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(unsigned _STLP_LONG_LONG); 30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif /* _STLP_LONG_LONG */ 30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(float); 30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(double); 30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if !defined ( _STLP_NO_LONG_DOUBLE ) 31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_DEFINE_TYPE_TRAITS_FOR(long double); 31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 31511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _ArePtrs, class _Src, class _Dst> 31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsCVConvertibleIf 31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef typename _IsCVConvertible<_Src, _Dst>::_Ret _Ret; }; 31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Src, class _Dst> 32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsCVConvertibleIf<__false_type, _Src, _Dst> 32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __false_type _Ret; }; 32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# else 32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) 32411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _ArePtrs> 32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsCVConvertibleIfAux { 32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template <class _Src, class _Dst> 32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct _In 32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { typedef typename _IsCVConvertible<_Src, _Dst>::_Ret _Ret; }; 32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_TEMPLATE_NULL 33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsCVConvertibleIfAux<__false_type> { 33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template <class _Src, class _Dst> 33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct _In 33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { typedef __false_type _Ret; }; 33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 33811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _ArePtrs, class _Src, class _Dst> 33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsCVConvertibleIf { 34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsCVConvertibleIfAux<_ArePtrs>::_STLP_TEMPLATE _In<_Src, _Dst>::_Ret _Ret; 34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# else 34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* default behavior: we prefer to miss an optimization rather than taking the risk of 34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * a compilation error if playing with types with exotic memory alignment. 34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 34611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _ArePtrs, class _Src, class _Dst> 34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsCVConvertibleIf 34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef __false_type _Ret; }; 34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 35211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Src, class _Dst> 35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _TrivialNativeTypeCopy { 35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsPtr<_Src>::_Ret _Ptr1; 35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsPtr<_Dst>::_Ret _Ptr2; 35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Land2<_Ptr1, _Ptr2>::_Ret _BothPtrs; 35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsCVConvertibleIf<_BothPtrs, _Src, _Dst>::_Ret _Convertible; 35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Land2<_BothPtrs, _Convertible>::_Ret _Trivial1; 35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __bool2type<(sizeof(_Src) == sizeof(_Dst))>::_Ret _SameSize; 36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (__BORLANDC__) || (__BORLANDC__ < 0x564) 36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsIntegral<_Src>::_Ret _Int1; 36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else 36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _UnQual<_Src>::_Type _UnQuSrc; 36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsIntegral<_UnQuSrc>::_Ret _Int1; 36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsIntegral<_Dst>::_Ret _Int2; 36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Land2<_Int1, _Int2>::_Ret _BothInts; 37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsRational<_Src>::_Ret _Rat1; 37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsRational<_Dst>::_Ret _Rat2; 37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Land2<_Rat1, _Rat2>::_Ret _BothRats; 37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Lor2<_BothInts, _BothRats>::_Ret _BothNatives; 37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (__BORLANDC__) || (__BORLANDC__ >= 0x564) 37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Land2<_BothNatives, _SameSize>::_Ret _Trivial2; 37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else 37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsUnQual<_Dst>::_Ret _UnQualDst; 38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Land3<_BothNatives, _SameSize, _UnQualDst>::_Ret _Trivial2; 38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Lor2<_Trivial1, _Trivial2>::_Ret _Ret; 38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 38511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Src, class _Dst> 38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _TrivialCopy { 38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TrivialNativeTypeCopy<_Src, _Dst>::_Ret _NativeRet; 38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if !defined (__BORLANDC__) || (__BORLANDC__ != 0x560) 38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __type_traits<_Src>::has_trivial_assignment_operator _Tr1; 39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# else 39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _UnConstPtr<_Src*>::_Type _UnConstSrc; 39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __type_traits<_UnConstSrc>::has_trivial_assignment_operator _Tr1; 39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _AreCopyable<_Src, _Dst>::_Ret _Tr2; 39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Land2<_Tr1, _Tr2>::_Ret _UserRet; 39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Lor2<_NativeRet, _UserRet>::_Ret _Ret; 39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static _Ret _Answer() { return _Ret(); } 39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 40011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Src, class _Dst> 40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _TrivialUCopy { 40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _TrivialNativeTypeCopy<_Src, _Dst>::_Ret _NativeRet; 40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if !defined (__BORLANDC__) || (__BORLANDC__ != 0x560) 40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __type_traits<_Src>::has_trivial_copy_constructor _Tr1; 40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# else 40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _UnConstPtr<_Src*>::_Type _UnConstSrc; 40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __type_traits<_UnConstSrc>::has_trivial_copy_constructor _Tr1; 40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _AreCopyable<_Src, _Dst>::_Ret _Tr2; 41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Land2<_Tr1, _Tr2>::_Ret _UserRet; 41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Lor2<_NativeRet, _UserRet>::_Ret _Ret; 41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static _Ret _Answer() { return _Ret(); } 41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 41511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _DefaultZeroValue { 41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsIntegral<_Tp>::_Ret _Tr1; 41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsRational<_Tp>::_Ret _Tr2; 41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsPtr<_Tp>::_Ret _Tr3; 42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Lor3<_Tr1, _Tr2, _Tr3>::_Ret _Ret; 42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 42311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _TrivialInit { 42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if !defined (__BORLANDC__) || (__BORLANDC__ != 0x560) 42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __type_traits<_Tp>::has_trivial_default_constructor _Tr1; 42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# else 42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _UnConstPtr<_Tp*>::_Type _Tp1; 42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __type_traits<_Tp1>::has_trivial_copy_constructor _Tr1; 43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _DefaultZeroValue<_Tp>::_Ret _Tr2; 43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Not<_Tr2>::_Ret _Tr3; 43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Land2<_Tr1, _Tr3>::_Ret _Ret; 43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static _Ret _Answer() { return _Ret(); } 43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* !_STLP_USE_BOOST_SUPPORT */ 43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 43911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsPtrType { 44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsPtr<_Tp>::_Ret _Type; 44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static _Type _Ret() { return _Type(); } 44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 44511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsRefType { 44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsRef<_Tp>::_Ret _Type; 44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static _Type _Ret() { return _Type();} 44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 45111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __call_traits { 45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_USE_BOOST_SUPPORT) && !defined (_STLP_NO_EXTENSIONS) 45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __select< ::boost::is_reference<_Tp>::value, 45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename ::boost::add_const<_Tp>::type, 45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename ::boost::add_reference< typename ::boost::add_const<_Tp>::type >::type>::_Ret const_param_type; 45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __select< ::boost::is_reference<_Tp>::value, 45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename ::boost::remove_const<_Tp>::type, 45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename ::boost::add_reference<_Tp>::type>::_Ret param_type; 46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else 46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef const _Tp& const_param_type; 46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Tp& param_type; 46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_USE_BOOST_SUPPORT) && !defined (_STLP_NO_EXTENSIONS) && defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 46711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __call_traits<_Tp&> { 46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Tp& param_type; 47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef const _Tp& const_param_type; 47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 47211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __call_traits<const _Tp&> { 47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Tp& param_type; 47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef const _Tp& const_param_type; 47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 47911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp1, class _Tp2> 48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _BothPtrType { 48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsPtr<_Tp1>::_Ret _IsPtr1; 48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsPtr<_Tp2>::_Ret _IsPtr2; 48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Land2<_IsPtr1, _IsPtr2>::_Ret _Ret; 48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static _Ret _Answer() { return _Ret(); } 48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 48811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp1, class _Tp2, class _IsRef1, class _IsRef2> 48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _OKToSwap { 49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _AreSameTypes<_Tp1, _Tp2>::_Ret _Same; 49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Land3<_Same, _IsRef1, _IsRef2>::_Ret _Type; 49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static _Type _Answer() { return _Type(); } 49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 49511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp1, class _Tp2, class _IsRef1, class _IsRef2> 49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _OKToSwap<_Tp1, _Tp2, _IsRef1, _IsRef2> 49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_IsOKToSwap(_Tp1*, _Tp2*, const _IsRef1&, const _IsRef2&) 49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _OKToSwap<_Tp1, _Tp2, _IsRef1, _IsRef2>(); } 49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 50011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Src, class _Dst> 50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _TrivialCopy<_Src, _Dst> _UseTrivialCopy(_Src*, _Dst*) 50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _TrivialCopy<_Src, _Dst>(); } 50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 50411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Src, class _Dst> 50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _TrivialUCopy<_Src, _Dst> _UseTrivialUCopy(_Src*, _Dst*) 50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _TrivialUCopy<_Src, _Dst>(); } 50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) || defined (__BORLANDC__) || \ 50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert defined (__DMC__) 51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _NegativeAnswer { 51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef __false_type _Ret; 51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static _Ret _Answer() { return _Ret(); } 51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 51511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Src, class _Dst> 51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _NegativeAnswer _UseTrivialCopy(_Src*, const _Dst*) 51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _NegativeAnswer(); } 51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 51911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Src, class _Dst> 52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _NegativeAnswer _UseTrivialCopy(_Src*, volatile _Dst*) 52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _NegativeAnswer(); } 52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 52311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Src, class _Dst> 52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _NegativeAnswer _UseTrivialCopy(_Src*, const volatile _Dst*) 52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _NegativeAnswer(); } 52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 52711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Src, class _Dst> 52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _NegativeAnswer _UseTrivialUCopy(_Src*, const _Dst*) 52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _NegativeAnswer(); } 53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 53111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Src, class _Dst> 53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _NegativeAnswer _UseTrivialUCopy(_Src*, volatile _Dst*) 53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _NegativeAnswer(); } 53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 53511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Src, class _Dst> 53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _NegativeAnswer _UseTrivialUCopy(_Src*, const volatile _Dst*) 53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _NegativeAnswer(); } 53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 54011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _TrivialInit<_Tp> _UseTrivialInit(_Tp*) 54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _TrivialInit<_Tp>(); } 54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 54411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsPOD { 54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __type_traits<_Tp>::is_POD_type _Type; 54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static _Type _Answer() { return _Type(); } 54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 55011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _IsPOD<_Tp> _Is_POD(_Tp*) 55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _IsPOD<_Tp>(); } 55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 55411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _DefaultZeroValueQuestion { 55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _DefaultZeroValue<_Tp>::_Ret _Ret; 55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static _Ret _Answer() { return _Ret(); } 55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 56011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _DefaultZeroValueQuestion<_Tp> _HasDefaultZeroValue(_Tp*) 56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ return _DefaultZeroValueQuestion<_Tp>(); } 56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* 56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Base class used: 56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * - to simulate partial template specialization 56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * - to simulate partial function ordering 56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * - to recognize STLport class from user specialized one 56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 57011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct __stlport_class 57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ typedef _Tp _Type; }; 57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 57411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsSTLportClass { 57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsConvertible<_Tp, __stlport_class<_Tp> >::_Ret _Ret; 57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (__BORLANDC__) 57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert enum { _Is = _IsConvertible<_Tp, __stlport_class<_Tp> >::value }; 57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 58311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _SwapImplemented { 58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _IsSTLportClass<_Tp>::_Ret _Ret; 58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if defined (__BORLANDC__) 58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert enum { _Is = _IsSTLportClass<_Tp>::_Is }; 58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 59211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass _TpWithState : private _Tp { 59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _TpWithState(); 59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int _state; 59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* This is an internal helper struct used to guess if we are working 59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * on a stateless class. It can only be instanciated with a class type. */ 60011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp> 60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct _IsStateless { 60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert enum { _Is = sizeof(_TpWithState<_Tp>) == sizeof(int) }; 60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __bool2type<_Is>::_Ret _Ret; 60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_END_NAMESPACE 60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 60811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION 60911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# if defined (__BORLANDC__) || \ 61011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert defined (__SUNPRO_CC) || \ 61111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (defined (__MWERKS__) && (__MWERKS__ <= 0x2303)) || \ 61211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (defined (__sgi) && defined (_COMPILER_VERSION)) || \ 61311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert defined (__DMC__) 61411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define _STLP_IS_POD_ITER(_It, _Tp) __type_traits< typename iterator_traits< _Tp >::value_type >::is_POD_type() 61511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# else 61611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define _STLP_IS_POD_ITER(_It, _Tp) typename __type_traits< typename iterator_traits< _Tp >::value_type >::is_POD_type() 61711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# endif 61811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else 61911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define _STLP_IS_POD_ITER(_It, _Tp) _Is_POD( _STLP_VALUE_TYPE( _It, _Tp ) )._Answer() 62011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 62111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 62211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_TYPE_TRAITS_H */ 62311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 62411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Local Variables: 62511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// mode:C++ 62611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// End: 627