//=============================================================================
// File      : utilities.h
// Created   : mar jun 19 13:18:14 CEST 2001
// Author    : Antoine YESSAYAN, Paul RASCLE, EDF
// Project   : SALOME
// Copyright : EDF 2001
// $Header$
//=============================================================================

/* ---  Definition macros file to print information if _DEBUG_ is defined --- */

#ifndef UTILITIES_H
#define UTILITIES_H

#include <stdlib.h>
// # include <iostream> ok for gcc3.01
#include <iostream>

/* ---  INFOS is always defined (without _DEBUG_): to be used for warnings, with release version --- */

#define HEREWEARE \
  cout << flush;  \
  cerr << __FILE__ << " [" << __LINE__ << "] : " << flush;
#define INFOS(chain)       \
  {                        \
    HEREWEARE;             \
    cerr << chain << endl; \
  }
#define PYSCRIPT(chain)                         \
  {                                             \
    cout << flush;                              \
    cerr << "---PYSCRIPT--- " << chain << endl; \
  }

/* --- To print date and time of compilation of current source on stdout --- */

#if defined(__GNUC__)
#define COMPILER "g++";
#elif defined(__sun)
#define COMPILER "CC";
#elif defined(__KCC)
#define COMPILER "KCC";
#elif defined(__PGI)
#define COMPILER "pgCC";
#else
#define COMPILER "undefined";
#endif

#ifdef INFOS_COMPILATION
#error INFOS_COMPILATION already defined
#endif
#define INFOS_COMPILATION                 \
  {                                       \
    cerr << flush;                        \
    cout << __FILE__;                     \
    cout << " [" << __LINE__ << "] : ";   \
    cout << "COMPILED with " << COMPILER; \
    cout << ", " << __DATE__;             \
    cout << " at " << __TIME__ << endl;   \
    cout << "\n\n";                       \
    cout << flush;                        \
  }

#ifdef _DEBUG_

/* --- the following MACROS are useful at debug time --- */

#define HERE     \
  cout << flush; \
  cerr << "- Trace " << __FILE__ << " [" << __LINE__ << "] : " << flush;
#define SCRUTE(var) \
  HERE;             \
  cerr << #var << "=" << var << endl;
#define MESSAGE(chain)     \
  {                        \
    HERE;                  \
    cerr << chain << endl; \
  }
#define INTERRUPTION(code)                              \
  HERE;                                                 \
  cerr << "INTERRUPTION return code= " << code << endl; \
  exit(code);

#ifndef ASSERT
#define ASSERT(condition)                                          \
  if (!(condition)) {                                              \
    HERE;                                                          \
    cerr << "CONDITION " << #condition << " NOT VERIFIED" << endl; \
    INTERRUPTION(1);                                               \
  }
#endif /* ASSERT */

#define REPERE   \
  cout << flush; \
  cerr << "   --------------" << endl << flush;
#define BEGIN_OF(chain)                    \
  {                                        \
    REPERE;                                \
    HERE;                                  \
    cerr << "Begin of: " << chain << endl; \
    REPERE;                                \
  }
#define END_OF(chain)                           \
  {                                             \
    REPERE;                                     \
    HERE;                                       \
    cerr << "Normal end of: " << chain << endl; \
    REPERE;                                     \
  }

#else /* ifdef _DEBUG_*/

#define HERE
#define SCRUTE(var)
#define MESSAGE(chain)
#define INTERRUPTION(code)

#ifndef ASSERT
#define ASSERT(condition)
#endif /* ASSERT */

#define REPERE
#define BEGIN_OF(chain)
#define END_OF(chain)

#endif /* ifdef _DEBUG_*/

#endif /* ifndef UTILITIES_H */
