/*
 * Author: George V. Neville-Neil
 */

#include "Python.h"

/* Our stuff... */
#include "timing.h"

static PyObject *
start_timing(PyObject *self)
{
    Py_INCREF(Py_None);
    BEGINTIMING;
    return Py_None;
}

static PyObject *
finish_timing(PyObject *self)
{
    ENDTIMING
    Py_INCREF(Py_None);
    return Py_None;
}

static PyObject *
seconds(PyObject *self)
{
    return PyInt_FromLong(TIMINGS);
}

static PyObject *
milli(PyObject *self)
{
    return PyInt_FromLong(TIMINGMS);
}

static PyObject *
micro(PyObject *self)
{
    return PyInt_FromLong(TIMINGUS);
}


static PyMethodDef timing_methods[] = {
    {"start",   (PyCFunction)start_timing, METH_NOARGS},
    {"finish",  (PyCFunction)finish_timing, METH_NOARGS},
    {"seconds", (PyCFunction)seconds, METH_NOARGS},
    {"milli",   (PyCFunction)milli, METH_NOARGS},
    {"micro",   (PyCFunction)micro, METH_NOARGS},
    {NULL,      NULL}
};


PyMODINIT_FUNC inittiming(void)
{
    if (PyErr_WarnPy3k("the timing module has been removed in "
                        "Python 3.0; use time.clock() instead", 2) < 0)
    return;

    (void)Py_InitModule("timing", timing_methods);
}
