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