// -*- c++ -*-
//
// This software may only be used by you under license from the
// University of Notre Dame. A copy of the University of Notre Dame's
// Source Code Agreement is available at the inilib Internet website
// having the URL: If you
// received this software without first entering into a license with the
// University of Notre Dame, you have an infringing copy of this software
// and cannot use it without violating the University of Notre Dame's
// intellectual property rights.
//
// INILIB debugging Code.
//
// WRITTEN BY: Jeff Squyres (Thanks Jeff!)
//
#ifndef INI_DEBUG_H_
#define INI_DEBUG_H_
#include
#include "ini_config.h"
namespace INI {
//
// Brings printf debugging to a new low
//
class Debug {
public:
inline Debug(bool initial = false) : on(initial) {}
inline void On() { on = true; }
inline void Off() { on = false; }
inline bool isOn() const { return on; }
inline Debug& flush();
protected:
bool on;
};
//
// This is icky, but necessary to remove some compiler warnings when
// we're compiling !INI_DEBUG. Other than having two prototypes for
// each definition, there's really no better way to do this... :-)
//
#if INI_DEBUG
#define ARG1 arg1
#else
#define ARG1
#endif
//
// A sick and wrong templated debug function
//
template
inline Debug&
operator<<(Debug& d, const T& ARG1) {
#if INI_DEBUG
if (d.isOn())
std::cerr << ARG1;
#endif
return d;
}
template
inline const Debug&
operator<<(const Debug& d, const T& ARG1) {
#if INI_DEBUG
if (d.isOn())
std::cerr << ARG1;
#endif
return d;
}
//
// These need to be here for the endl on some compilers
//
inline Debug&
operator<< (Debug& d, std::ostream& (*)(std::ostream&))
{
#if INI_DEBUG
if (d.isOn())
std::cerr << std::endl;
#endif
return d;
}
inline const Debug&
operator<< (const Debug& d, std::ostream& (*)(std::ostream&))
{
#if INI_DEBUG
if (d.isOn())
std::cerr << std::endl;
#endif
return d;
}
inline Debug&
operator<< (Debug& d, std::ios& (*)(std::ios&))
{
#if INI_DEBUG
if (d.isOn())
std::cerr << std::endl;
#endif
return d;
}
inline const Debug&
operator<< (const Debug& d, std::ios& (*)(std::ios&))
{
#if INI_DEBUG
if (d.isOn())
std::cerr << std::endl;
#endif
return d;
}
inline Debug&
Debug::flush()
{
#if INI_DEBUG
if (isOn())
std::cerr.flush();
#endif
return (*this);
}
} // namespace INI
#endif // INI_DEBUG_H_