/*
 *  logger.h
 *  RatLib
 *
 *  Created by Curtis Jones on 2008.10.25.
 *  Copyright 2008 Curtis Jones. All rights reserved.
 *
 */

#ifndef __LOGGER_H__
#define __LOGGER_H__

#include <stdio.h>
#include <string.h>

// because these probably aren't already defined a dozen
// times elsewhere.
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))

// used to give gcc hints regarding branch prediction
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)

#ifdef LOG_LEVEL

//
// error
//
#if LOG_LEVEL >= 1
#define LOG1(...) printf(__VA_ARGS__)
#else
#define LOG1(...)
#endif

//
// ?
//
#if LOG_LEVEL >= 2
#define LOG2(...) printf(__VA_ARGS__)
#else
#define LOG2(...)
#endif

//
// standard
//
#if LOG_LEVEL >= 3
#define LOG3(...) printf(__VA_ARGS__)
#else
#define LOG3(...)
#endif

//
// ?
//
#if LOG_LEVEL >= 4
#define LOG4(...) printf(__VA_ARGS__)
#else
#define LOG4(...)
#endif

//
// debug
//
#if LOG_LEVEL >= 5
#define LOG5(...) printf(__VA_ARGS__)
#else
#define LOG5(...)
#endif

#else

#define LOG1(...)
#define LOG2(...)
#define LOG3(...)
#define LOG4(...)
#define LOG5(...)

#endif

#define LOG_ERROR_AND_BREAK(...) {LOG5(__VA_ARGS__); break;}
#define LOG_ERROR_AND_CONTINUE(...) {LOG5(__VA_ARGS__); continue;}
#define LOG_ERROR_AND_GOTO(a,b,...) {LOG5(__VA_ARGS__); error=a; goto b;}
#define LOG_ERROR_AND_RETURN(a,...) {LOG5(__VA_ARGS__); return a;}

#endif /* __LOGGER_H__ */
