// -*- C++ -*-
/***************************************************************************
 *
 * exception - declarations for the Standard Library exception class
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Copyright (c) 1994-2005 Quovadx,  Inc., acting through its  Rogue Wave
 * Software division. Licensed 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.
 * 
 **************************************************************************/

#ifndef _RWSTD_EXCEPTION_INCLUDED
#define _RWSTD_EXCEPTION_INCLUDED

#include <rw/_defs.h>
#include <rw/_error.h>


#if 0 // def __HP_aCC
// HP aCC on HP-UX has <exception.h> whose contents HP prefers to ours
// #  include </opt/aCC/include/exception.h>
#  include <exception.h>
#else   // if defined (__HP_aCC)


#if    !defined (_RWSTD_NO_STD_EXCEPTION) \
    || !defined (_RWSTD_NO_RUNTIME_IN_STD)

_RWSTD_NAMESPACE (std) {

#endif   // _RWSTD_NO_STD_EXCEPTION || !_RWSTD_NO_RUNTIME_IN_STD


// 18.6.1
class _RWSTD_EXPORT exception     
{
public:
    // 18.6.1, p2
    exception () _THROWS (());

    // 18.6.1, p4
    exception (const exception&) _THROWS (());

    // 18.6.1, p4
    exception& operator= (const exception&) _THROWS (());

    // 18.6.1, p6
    virtual ~exception () _THROWS (());

    // 18.6.1, p8
    virtual const char* what () const _THROWS (());


#if defined (__INTEL_COMPILER) && !defined (_MSC_VER)

private:

    const char *_C_name;

#elif defined (_MSC_VER)

private:

    const char *_C_name;
    int         _C_flag;

#endif   // _MSC_VER
};


#if    !defined (_RWSTD_NO_STD_EXCEPTION) \
    || !defined (_RWSTD_NO_RUNTIME_IN_STD)

}   // namespace std

#else   // if _RWSTD_NO_STD_EXCEPTION && _RWSTD_NO_RUNTIME_IN_STD

#  ifndef _RWSTD_NO_NAMESPACE

namespace std {

using ::exception;


}   // namespace std

#  endif   // _RWSTD_NO_NAMESPACE

#endif   // _RWSTD_NO_STD_EXCEPTION, _RWSTD_NO_RUNTIME_IN_STD



#if    !defined (_RWSTD_NO_STD_BAD_EXCEPTION) \
    || !defined (_RWSTD_NO_RUNTIME_IN_STD)

_RWSTD_NAMESPACE (std) {

#endif   // _RWSTD_NO_STD_BAD_EXCEPTION || _RWSTD_NO_RUNTIME_IN_STD


// 18.6.2.1
class _RWSTD_EXPORT bad_exception: public _STD::exception
{
public:
    // 18.6.2.1, p2
    bad_exception () _THROWS (());

    // 18.6.2.1, p4
    bad_exception (const bad_exception&) _THROWS (());

    // 18.6.2.1, p4
    bad_exception& operator= (const bad_exception&) _THROWS (());

    // 18.6.2.1, p5
    virtual const char* what () const _THROWS (());

    virtual ~bad_exception () _THROWS (());
};

#if    !defined (_RWSTD_NO_STD_BAD_EXCEPTION) \
    || !defined (_RWSTD_NO_RUNTIME_IN_STD)

}   // namespace std

#else   // if _RWSTD_NO_STD_BAD_EXCEPTION && _RWSTD_NO_RUNTIME_IN_STD

#  ifndef _RWSTD_NO_NAMESPACE

namespace std {

using ::bad_exception;


}   // namespace std

#  endif   // _RWSTD_NO_NAMESPACE

#endif   // _RWSTD_NO_STD_BAD_EXCEPTION, _RWSTD_NO_RUNTIME_IN_STD


_RWSTD_NAMESPACE (std) {

// 18.6.2.2
typedef void (*unexpected_handler) ();

// 18.6.2.3
_RWSTD_EXPORT extern unexpected_handler
set_unexpected (unexpected_handler) _THROWS (());

// 18.6.2.4
_RWSTD_EXPORT extern void
unexpected () _RWSTD_GNUC_ATTRIBUTE ((__noreturn__));

// 18.6.3.1
typedef void (*terminate_handler) ();

// 18.6.3.2
_RWSTD_EXPORT extern terminate_handler
set_terminate (terminate_handler) _THROWS (());

// 18.6.3.3
_RWSTD_EXPORT extern void
terminate () _RWSTD_GNUC_ATTRIBUTE ((__noreturn__));

// 18.6.4
_RWSTD_EXPORT extern bool
uncaught_exception () _THROWS (());

}   // namespace std

#endif   // __HP_aCC

#endif   // _RWSTD_EXCEPTION_INCLUDED
