/*---------------------------------------------------------------------------*
 *                                   IT++			             *
 *---------------------------------------------------------------------------*
 * Copyright (c) 1995-2001 by Tony Ottosson, Thomas Eriksson, Pål Frenger,   *
 * Tobias Ringström, and Jonas Samuelsson.                                   *
 *                                                                           *
 * Permission to use, copy, modify, and distribute this software and its     *
 * documentation under the terms of the GNU General Public License is hereby *
 * granted. No representations are made about the suitability of this        *
 * software for any purpose. It is provided "as is" without expressed or     *
 * implied warranty. See the GNU General Public License for more details.    *
 *---------------------------------------------------------------------------*/

/*! 
  \file 
  \brief Error handling functions
  \author Tobias Ringström

  1.5

  2003/05/22 08:55:16
*/

#ifndef __itassert_h
#define __itassert_h

#include "itconfig.h"
#include <iostream>
#include <string>

namespace itpp {

  /*! 
    \defgroup errorhandlingfunc Error handling functions

    For all functions, the argument \c s is a string that is displayed.
  
    \code
    it_assert(t,s);   // Abort if \c t is not true.
    it_assert0(t,s);  // Abort if \c t is not true and ASSERT_LEVEL = 2
    it_assert1(t,s);  // Abort if \c t is not true and ASSERT_LEVEL = 2 or 1
    it_error_if(t,s); // Abort if \c t is true.
    it_error(s);      // Abort.
    it_warning(s);    // Show a warning.
    \endcode

    \c it_assert(), \c it_error() and \c it_warning() is always active while
    \c it_assert0() and \c it_assert1() depends on the \c ASSERT_LEVEL variable.
    If \c ASSERT_LEVEL == 0 then none of these are executed while if it is 1
    only \c it_assert1() is executed.
  */
  //!@{
 
  //! Helper function for the \c it_assert functions
  void it_assert_f(std::string ass, std::string msg, std::string file, int line);
  //! Helper function for the \c it_error functions
  void it_error_f(std::string msg, std::string file, int line);
  //! Helper function for the \c it_warning functions
  void it_warning_f(std::string msg, std::string file, int line);

  //! Enable/disable using exceptions for error handling.
  void it_enable_exceptions(bool on);
  //! Enable warnings
  void it_enable_warnings();
  //! Disable warnings
  void it_disable_warnings();
  //! Redirect warnings to the ostream warn_stream
  void it_redirect_warnings(std::ostream *warn_stream);

#if ASSERT_LEVEL==0 // No tests
#  define it_assert0(t,s) ((void)0)
#  define it_assert1(t,s) ((void)0)
#elif ASSERT_LEVEL==1 // Only some tests
#  define it_assert0(t,s) ((void)0)
#  define it_assert1(t,s) (void)((t) || (it_assert_f(#t,s,__FILE__,__LINE__),0))
#else // Full tests
  //! Abort if \c t is not true and IT++ is compiled with \c -DASSERT_LEVEL = 2. The message string \c s is printed on standard output.
#  define it_assert0(t,s) (void)((t) || (it_assert_f(#t,s,__FILE__,__LINE__),0))
  //! Abort if \c t is not true and IT++ is compiled with \c -DASSERT_LEVEL = 1 or 2. The message string \c s is printed on standard output.
#  define it_assert1(t,s) (void)((t) || (it_assert_f(#t,s,__FILE__,__LINE__),0))
#endif // ASSERT_LEVEL

  //! Abort if \c t is NOT true and output \c s
#define it_assert(t,s)   (void)((t) || (it_assert_f(#t,s,__FILE__,__LINE__),0))
  //! Abort if \c t is true and output \c s
#define it_error_if(t,s) (void)((!(t)) || (it_error_f(s,__FILE__,__LINE__),0))
  //! Abort and output \c s
#define it_error(s)      it_error_f(s,__FILE__,__LINE__)
  //! Output the warning \c s
#define it_warning(s)    it_warning_f(s,__FILE__,__LINE__)

  //!@}

} //namespace itpp

#endif // __itassert_h


syntax highlighted by Code2HTML, v. 0.9.1