/***************************************************************************
 *
 * _select.h - Definitions of helper templates
 *
 * This is an internal header file used to implement the C++ Standard
 * Library. It should never be #included directly by a program.
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 1994-2005 Rogue Wave Software.
 * 
 **************************************************************************/

#ifndef _RWSTD_RW_SELECT_H_INCLUDED
#define _RWSTD_RW_SELECT_H_INCLUDED

#ifndef _RWSTD_RW_DEFS_H_INCLUDED
#  include <rw/_defs.h>
#endif   // _RWSTD_RW_DEFS_H_INCLUDED


_RWSTD_NAMESPACE (__rw) {

struct __rw_false_t { enum { _C_val }; };
struct __rw_true_t { enum { _C_val = 1 }; };


template <class _TypeT>
struct __rw_select_int
{
    typedef void* _SelectT;

#if defined (__SUNPRO_CC) && __SUNPRO_CC <= 0x530

    void* _C_selector;

#endif   // SunPro
};


#define _RWSTD_SPECIALIZE_IS_INT(T)    \
    _RWSTD_SPECIALIZED_CLASS           \
    struct __rw_select_int<T> {        \
        typedef int _SelectT;          \
        enum { _C_selector = 1 };      \
    }

#ifndef _RWSTD_NO_NATIVE_BOOL
_RWSTD_SPECIALIZE_IS_INT (bool);
#endif   // _RWSTD_NO_NATIVE_BOOL

_RWSTD_SPECIALIZE_IS_INT (char);
_RWSTD_SPECIALIZE_IS_INT (signed char);
_RWSTD_SPECIALIZE_IS_INT (unsigned char);
_RWSTD_SPECIALIZE_IS_INT (short);
_RWSTD_SPECIALIZE_IS_INT (unsigned short);
_RWSTD_SPECIALIZE_IS_INT (int);
_RWSTD_SPECIALIZE_IS_INT (unsigned int);
_RWSTD_SPECIALIZE_IS_INT (long);
_RWSTD_SPECIALIZE_IS_INT (unsigned long);

#ifdef _RWSTD_LONG_LONG
_RWSTD_SPECIALIZE_IS_INT (_RWSTD_LONG_LONG);
_RWSTD_SPECIALIZE_IS_INT (unsigned _RWSTD_LONG_LONG);
#endif   // _RWSTD_LONG_LONG

#ifndef _RWSTD_NO_NATIVE_WCHAR_T
_RWSTD_SPECIALIZE_IS_INT (wchar_t);
#endif   // _RWSTD_NO_NATIVE_WCHAR_T


#if !defined (__SUNPRO_CC) || __SUNPRO_CC > 0x530
#  define _RWSTD_DISPATCH(iter)   \
       (_TYPENAME _RW::__rw_select_int< iter >::_SelectT (1))

#else
   // working around a SunPro 5.3 a prior bug (PR #28739)
#  define _RWSTD_DISPATCH(iter) _RW::__rw_select_int< iter >()._C_selector
#endif


#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC

template <class _TypeT, class _TypeU>
struct __rw_is_same
{
    typedef __rw_false_t _C_type;
    enum { _C_val };
};

template <class _TypeT>
struct __rw_is_same<_TypeT, _TypeT>
{
    typedef __rw_true_t _C_type;
    enum { _C_val = 1 };
};

#else   // if defined (_RWSTD_NO_CLASS_PARTIAL_SPEC)

template <bool flag>
struct __rw_bool_t
{
    typedef __rw_false_t _C_type;
};

_RWSTD_SPECIALIZED_CLASS
struct __rw_bool_t<true>
{
    typedef __rw_true_t _C_type;
};

template <class _TypeT, class _TypeU>
struct __rw_is_same
{
    struct _C_yes {};
    struct _C_no { _C_yes no_ [2]; };
    template <class _TypeV>
    struct _C_Type {};

    static _C_yes test (_C_Type<_TypeT>, _C_Type<_TypeT>);
    static _C_no test (...);

    enum { _C_val = sizeof (test (_C_Type<_TypeT> (),
                                  _C_Type<_TypeU> ())) == sizeof (_C_yes) };

    typedef _TYPENAME __rw_bool_t<_C_val>::_C_type _C_type;
};

#endif   // _RWSTD_NO_CLASS_PARTIAL_SPEC


}   // namespace __rw


#  if defined (__IBMCPP__) && __IBMCPP__ <= 500

// working around an xlC 5.0 bug
_USING (__rw::__rw_select_int);

#  endif   // VisualAge 5.0


#endif   // _RWSTD_RW_SELECT_H_INCLUDED
