// stdexcept standard header -*-c++-*-
// Copyright 2009-2020 IAR Systems AB.
#ifndef _DLIB5_STDEXCEPT_
#define _DLIB5_STDEXCEPT_

#ifndef _SYSTEM_BUILD
#pragma system_include
#endif

#include <dlib5/exception>
#include <dlib5/xstring>
_DLIB5_BEGIN

// CLASS logic_error
class logic_error
  : public _XSTD exception
{       // base of all logic-error exceptions
public:
  explicit logic_error(const string& _Message)
    : _Str(_Message)
  {     // construct from message string
  }

  virtual ~logic_error() _THROW0()
  { // destroy the object
  }

  virtual const char *what() const _THROW0()
  {     // return pointer to message string
    return (_Str.c_str());
  }

  #if _HAS_EXCEPTIONS
  #else /* _HAS_EXCEPTIONS */

    protected:
      virtual void _Doraise() const
      { // perform class-specific exception handling
        _RAISE(*this);
      }
  #endif /* _HAS_EXCEPTIONS */

private:
  string _Str;  // the stored message string
};

// CLASS domain_error
class domain_error
  : public logic_error
{       // base of all domain-error exceptions
public:
  explicit domain_error(const string& _Message)
    : logic_error(_Message)
  {     // construct from message string
  }

  virtual ~domain_error() _THROW0()
  { // destroy the object
  }

  #if _HAS_EXCEPTIONS
  #else /* _HAS_EXCEPTIONS */

    protected:
      virtual void _Doraise() const
      { // perform class-specific exception handling
        _RAISE(*this);
      }
  #endif /* _HAS_EXCEPTIONS */
};

// CLASS invalid_argument
class invalid_argument
  : public logic_error
{       // base of all invalid-argument exceptions
public:
  explicit invalid_argument(const string& _Message)
    : logic_error(_Message)
  {     // construct from message string
  }

  virtual ~invalid_argument() _THROW0()
  { // destroy the object
  }

  #if _HAS_EXCEPTIONS
  #else /* _HAS_EXCEPTIONS */

    protected:
      virtual void _Doraise() const
      { // perform class-specific exception handling
        _RAISE(*this);
      }
  #endif /* _HAS_EXCEPTIONS */
};

// CLASS length_error
class length_error
  : public logic_error
{       // base of all length-error exceptions
public:
  explicit length_error(const string& _Message)
    : logic_error(_Message)
  {     // construct from message string
  }

  virtual ~length_error() _THROW0()
  { // destroy the object
  }

  #if _HAS_EXCEPTIONS
  #else /* _HAS_EXCEPTIONS */

    protected:
      virtual void _Doraise() const
      { // perform class-specific exception handling
        _RAISE(*this);
      }
  #endif /* _HAS_EXCEPTIONS */
};

// CLASS out_of_range
class out_of_range
  : public logic_error
{       // base of all out-of-range exceptions
public:
  explicit out_of_range(const string& _Message)
    : logic_error(_Message)
  {     // construct from message string
  }

  virtual ~out_of_range() _THROW0()
  { // destroy the object
  }

  #if _HAS_EXCEPTIONS
  #else /* _HAS_EXCEPTIONS */

    protected:
      virtual void _Doraise() const
      { // perform class-specific exception handling
        _RAISE(*this);
      }
  #endif /* _HAS_EXCEPTIONS */
};

// CLASS runtime_error
class runtime_error
  : public _XSTD exception
{       // base of all runtime-error exceptions
public:
  explicit runtime_error(const string& _Message)
    : _Str(_Message)
  {     // construct from message string
  }

  virtual ~runtime_error() _THROW0()
  { // destroy the object
  }

  virtual const char *what() const _THROW0()
  {     // return pointer to message string
    return (_Str.c_str());
  }

  #if _HAS_EXCEPTIONS
  #else /* _HAS_EXCEPTIONS */

    protected:
      virtual void _Doraise() const
      { // perform class-specific exception handling
        _RAISE(*this);
      }
  #endif /* _HAS_EXCEPTIONS */

private:
  string _Str;  // the stored message string
};

// CLASS overflow_error
class overflow_error
  : public runtime_error
{       // base of all overflow-error exceptions
public:
  explicit overflow_error(const string& _Message)
    : runtime_error(_Message)
  {     // construct from message string
  }

  virtual ~overflow_error() _THROW0()
  { // destroy the object
  }

  #if _HAS_EXCEPTIONS
  #else /* _HAS_EXCEPTIONS */

    protected:
      virtual void _Doraise() const
      { // perform class-specific exception handling
        _RAISE(*this);
      }
  #endif /* _HAS_EXCEPTIONS */
};

// CLASS underflow_error
class underflow_error
  : public runtime_error
{       // base of all underflow-error exceptions
public:
  explicit underflow_error(const string& _Message)
    : runtime_error(_Message)
  {     // construct from message string
  }

  virtual ~underflow_error() _THROW0()
  { // destroy the object
  }

  #if _HAS_EXCEPTIONS
  #else /* _HAS_EXCEPTIONS */

    protected:
      virtual void _Doraise() const
      { // perform class-specific exception handling
        _RAISE(*this);
      }
  #endif /* _HAS_EXCEPTIONS */
};

// CLASS range_error
class range_error
  : public runtime_error
{       // base of all range-error exceptions
public:
  explicit range_error(const string& _Message)
    : runtime_error(_Message)
  {     // construct from message string
  }

  virtual ~range_error() _THROW0()
  { // destroy the object
  }

  #if _HAS_EXCEPTIONS
  #else /* _HAS_EXCEPTIONS */

    protected:
      virtual void _Doraise() const
      { // perform class-specific exception handling
        _RAISE(*this);
      }
  #endif /* _HAS_EXCEPTIONS */
};
_DLIB5_END
#endif /* _STDEXCEPT_ */

/*
 * Copyright (c) 1992-2009 by P.J. Plauger.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
 V5.04:0576 */
