/**
 * projectM -- Milkdrop-esque visualisation SDK
 * Copyright (C)2003-2007 projectM Team
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * See 'LICENSE.txt' included within this release
 *
 */
/**
 * $Id$
 *
 * $Log$
 */

#ifndef COMMON_HPP
#define COMMON_HPP

#include <vector>
#include <typeinfo>
#include <cstdarg>
#include <cassert>

#ifdef _MSC_sVER
#define strcasecmp(s, t)    _strcmpi(s, t)
#endif

#ifdef _MSC_VER
  #pragma warning( disable : 4244 4305 4996; once : 4018 )
  #define WIN32_LEAN_AND_MEAN
  #define NOMINMAX
  #include <windows.h>
  typedef unsigned int uint;
#endif

#ifdef DEBUG
//extern FILE *debugFile;
#endif

#ifdef MACOS
#include <cstdio>
extern FILE *fmemopen (void *buf, size_t len, const char *pMode);
#endif /** MACOS */

#include "dlldefs.h"

#define DEFAULT_FONT_PATH   "/home/carm/fonts/courier1.glf"
#define MAX_TOKEN_SIZE      512
#define MAX_PATH_SIZE       4096

#define STRING_BUFFER_SIZE  1024*150
#define STRING_LINE_SIZE    1024


#ifdef LINUX
#include <cstdlib>
#define projectM_isnan      std::isnan
#define projectM_fmax       fmax
#define projectM_fmin       fmin
#endif

#ifdef WIN32
#define projectM_isnan(x)   ((x) != (x))
#define projectM_fmax(x,y)  ((x) >= (y) ? (x): (y))
#define projectM_fmin(x,y)  ((x) <= (y) ? (x): (y))
#endif

#ifdef MACOS
#define projectM_isnan(x)   ((x) != (x))
#define projectM_fmax(x,y)  ((x) >= (y) ? (x): (y))
#define projectM_fmin(x,y)  ((x) <= (y) ? (x): (y))
#endif

#ifndef TRUE
#define TRUE                true
#endif

#ifndef FALSE
#define FALSE               false
#endif


#define MAX_DOUBLE_SIZE      10000000.0
#define MIN_DOUBLE_SIZE     -10000000.0

#define MAX_INT_SIZE         10000000
#define MIN_INT_SIZE        -10000000

/* default float initial value */
#define DEFAULT_DOUBLE_IV   0.0

/* default float lower bound */
#define DEFAULT_DOUBLE_LB   MIN_DOUBLE_SIZE

/* default float upper bound */
#define DEFAULT_DOUBLE_UB   MAX_DOUBLE_SIZE

#ifdef WIN32
#include <float.h>
#define isnan               _isnan
#endif /** WIN32 */

/** Per-platform path separators */
#define WIN32_PATH_SEPARATOR  '\\'
#define UNIX_PATH_SEPARATOR   '/'
#ifdef WIN32
#define PATH_SEPARATOR        WIN32_PATH_SEPARATOR
#else
#define PATH_SEPARATOR        UNIX_PATH_SEPARATOR
#endif /** WIN32 */

#include <string>


const unsigned int  NUM_Q_VARIABLES (32);
const std::string   PROJECTM_FILE_EXTENSION ("prjm");
const std::string   MILKDROP_FILE_EXTENSION ("milk");
const std::string   PROJECTM_MODULE_EXTENSION ("so");


template <class TraverseFunctor, class Container>
void traverse (Container & container)
{
  TraverseFunctor functor;

  for (typename Container::iterator pos = container.begin ();
       pos != container.end ();
       ++pos)
  {
    assert (pos->second);
    functor (pos->second);
  }

}


template <class TraverseFunctor, class Container>
void traverseVector (Container & container)
{
  TraverseFunctor functor;

  for (typename Container::iterator pos = container.begin ();
       pos != container.end ();
       ++pos)
  {
    assert (*pos);
    functor (*pos);
  }

}

template <class TraverseFunctor, class Container>
void traverse (Container & container, TraverseFunctor & functor)
{
  for (typename Container::iterator pos = container.begin ();
       pos != container.end ();
       ++pos)
  {
    assert (pos->second);
    functor (pos->second);
  }

}

namespace TraverseFunctors
{
  template <class Data>
  class Delete
  {

  public:

    void
    operator () (Data * data)
    {
      assert (data);
      delete (data);
    }

  };
} /*  namespace TraverseFunctors  */


inline std::string
parseExtension (const std::string & filename) {
  const std::size_t start = filename.find_last_of ('.');

  if (start == std::string::npos  ||  start >= (filename.length ()-1))
    return "";
  else
    return filename.substr (start+1, filename.length ());
}

inline std::string
parseFilename (const std::string & filename) {
  const std::size_t start = filename.find_last_of ('/');

  if (start == std::string::npos || start >= (filename.length ()-1))
    return "";
  else
    return filename.substr (start+1, filename.length ());
}

inline double
meanSquaredError (const double & x, const double & y) {
  return (x-y)*(x-y);
}


enum PresetRatingType {
  FIRST_RATING_TYPE     = 0,
  HARD_CUT_RATING_TYPE  = FIRST_RATING_TYPE,
  SOFT_CUT_RATING_TYPE,
  LAST_RATING_TYPE      = SOFT_CUT_RATING_TYPE,
  TOTAL_RATING_TYPES    = SOFT_CUT_RATING_TYPE+1
};


typedef std::vector<int> RatingList;

#endif
