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