// <clock> -*- C++ -*-
/*! ========================================================================
** Extended Template and Library
** Clock Abstraction
** $Id$
**
** Copyright (c) 2002 Robert B. Quattlebaum Jr.
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
** published by the Free Software Foundation; either version 2 of
** the License, or (at your option) any later version.
**
** This package 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
** General Public License for more details.
**
** === N O T E S ===========================================================
**
** ========================================================================= */

/* === S T A R T =========================================================== */

#ifndef __ETL__CLOCK__
#define __ETL__CLOCK__

/* === H E A D E R S ======================================================= */

#include "etl_config.h"

#ifdef HAVE_GETTIMEOFDAY
#include "_clock_gettimeofday.h"
#ifndef ETL_CLOCK_DEFAULT_DESC_CLASS
#define ETL_CLOCK_DEFAULT_DESC_CLASS	_ETL::clock_desc_gettimeofday
#endif
#ifndef ETL_CLOCK_REALTIME_DESC_CLASS
#define ETL_CLOCK_REALTIME_DESC_CLASS	_ETL::clock_desc_gettimeofday
#endif
#endif

#ifdef _WIN32
#include "_clock_win32hpcount.h"
#ifndef ETL_CLOCK_DEFAULT_DESC_CLASS
#define ETL_CLOCK_DEFAULT_DESC_CLASS	_ETL::clock_desc_win32hpcount
#endif
#ifndef ETL_CLOCK_REALTIME_DESC_CLASS
#define ETL_CLOCK_REALTIME_DESC_CLASS	_ETL::clock_desc_win32hpcount
#endif
#endif

// If we could not find ourselves a better
// clock description, go ahead and use the
// standard clock() implementation.
// (Better than nothing...)
#include "_clock_system.h"
#ifndef ETL_CLOCK_DEFAULT_DESC_CLASS
#define ETL_CLOCK_DEFAULT_DESC_CLASS	_ETL::clock_desc_sys_clock
#endif
#ifndef ETL_CLOCK_PROCTIME_DESC_CLASS
#define ETL_CLOCK_PROCTIME_DESC_CLASS	_ETL::clock_desc_sys_clock
#endif
#ifndef ETL_CLOCK_REALTIME_DESC_CLASS
#define ETL_CLOCK_REALTIME_DESC_CLASS	_ETL::clock_desc_sys_time
#endif

#include "_clock_base.h"

_ETL_BEGIN_NAMESPACE

#if 0
	typedef _ETL::clock_base<ETL_CLOCK_DEFAULT_DESC_CLASS> clock;
	#ifdef ETL_CLOCK_PROCTIME_DESC_CLASS
		#define ETL_CLOCK_PROCTIME
		typedef clock_base<ETL_CLOCK_PROCTIME_DESC_CLASS> clock_proctime;
	#endif
	#ifdef ETL_CLOCK_REALTIME_DESC_CLASS
		#define ETL_CLOCK_REALTIME
		typedef clock_base<ETL_CLOCK_REALTIME_DESC_CLASS> clock_realtime;
	#else
		#warning No realtime clock description found.
	#endif

#else
	class clock : public _ETL::clock_base<ETL_CLOCK_DEFAULT_DESC_CLASS> { };
	#ifdef ETL_CLOCK_PROCTIME_DESC_CLASS
		#define ETL_CLOCK_PROCTIME
		class clock_proctime : public _ETL::clock_base<ETL_CLOCK_PROCTIME_DESC_CLASS> { };
	#endif
	#ifdef ETL_CLOCK_REALTIME_DESC_CLASS
		#define ETL_CLOCK_REALTIME
		class clock_realtime : public _ETL::clock_base<ETL_CLOCK_REALTIME_DESC_CLASS> { };
	#else
		#warning No realtime clock description found.
	#endif
#endif

_ETL_END_NAMESPACE

//using etl::clock;

/* === E N D =============================================================== */

#endif
