// -*- C++ -*-
/***************************************************************************
 *
 * <stdexcept> - definitions of the exception classes
 *
 * $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-2006 Rogue Wave Software.
 * 
 **************************************************************************/

#ifndef _RWSTD_STDEXCEPT_INCLUDED
#define _RWSTD_STDEXCEPT_INCLUDED


#include <rw/_exception.h>   // for __rw_exception and string
#include <rw/_defs.h>


_RWSTD_NAMESPACE (std) {


// classes below are _RWSTD_EXPORT'ed to prevent
// MSVC warnings issued when they are derived from


// 19.1.1
struct _RWSTD_EXPORT logic_error: _RW::__rw_exception
{
    _EXPLICIT logic_error (const string& __str)
        : _RW::__rw_exception (__str) { }

    // extension
    _EXPLICIT logic_error (const char *__s = 0)
        : _RW::__rw_exception (__s) { }

    virtual ~logic_error () _THROWS (());
};


// 19.1.2
struct _RWSTD_EXPORT domain_error: logic_error
{
    _EXPLICIT domain_error (const string &__str)
        : logic_error (__str) { }

    // extension
    _EXPLICIT domain_error (const char *__s = 0)
        : logic_error (__s) { }
};


// 19.1.3
struct _RWSTD_EXPORT invalid_argument: logic_error
{
    _EXPLICIT invalid_argument (const string &__str)
        : logic_error (__str) { }

    // extension
    _EXPLICIT invalid_argument (const char *__s = 0)
        : logic_error (__s) { }
};


// 19.1.4
struct _RWSTD_EXPORT length_error: logic_error
{
    _EXPLICIT length_error (const string &__str)
        : logic_error (__str) { }

    // extension
    _EXPLICIT length_error (const char *__s = 0)
        : logic_error (__s) { }
};


// 19.1.5
struct _RWSTD_EXPORT out_of_range: logic_error
{
    _EXPLICIT out_of_range (const string &__str)
        : logic_error (__str) { }

    // extension
    _EXPLICIT out_of_range (const char *__s = 0)
        : logic_error (__s) { }
};


// 19.1.6
struct _RWSTD_EXPORT runtime_error: _RW::__rw_exception
{
    _EXPLICIT runtime_error (const string &__str)
        : _RW::__rw_exception (__str) { }

    // extension
    _EXPLICIT runtime_error (const char *__s = 0)
        : _RW::__rw_exception (__s) { }
};


// 19.1.7
struct _RWSTD_EXPORT range_error: runtime_error
{
    _EXPLICIT range_error (const string &__str)
        : runtime_error (__str) { }

    // extension
    _EXPLICIT range_error (const char *__s = 0)
        : runtime_error (__s) { }
};


// 19.1.8
struct _RWSTD_EXPORT overflow_error: runtime_error
{
    _EXPLICIT overflow_error (const string &__str)
        : runtime_error (__str) { }

    // extension
    _EXPLICIT overflow_error (const char *__s = 0)
        : runtime_error (__s) { }
};


// 19.1.9
struct _RWSTD_EXPORT underflow_error: runtime_error
{
    _EXPLICIT underflow_error (const string &__str)
        : runtime_error (__str) { }

    // extension
    _EXPLICIT underflow_error (const char *__s = 0)
        : runtime_error (__s) { }
};


}   // namespace std


#endif   // _RWSTD_STDEXCEPT_INCLUDED
