from __future__ import absolute_import

# System modules
import time

# Third-party modules

# LLDB modules
from .lldbtest import *

class Stopwatch(object):
    """Stopwatch provides a simple utility to start/stop your stopwatch multiple
    times.  Each start/stop is equal to a lap, with its elapsed time accumulated
    while measurment is in progress.

    When you're ready to start from scratch for another round of measurements,
    be sure to call the reset() method.

    For example,

    sw = Stopwatch()
    for i in range(1000):
        with sw:
            # Do some length operations...
            ...
    # Get the average time.
    avg_time = sw.avg()

    # Reset the stopwatch as we are about to perform other kind of operations.
    sw.reset()
    ...
    """

    #############################################################
    #
    # Context manager interfaces to support the 'with' statement.
    #
    #############################################################

    def __enter__(self):
        """
        Context management protocol on entry to the body of the with statement.
        """
        return self.start()

    def __exit__(self, type, value, tb):
        """
        Context management protocol on exit from the body of the with statement.
        """
        self.stop()

    def reset(self):
        self.__laps__ = 0
        self.__total_elapsed__ = 0.0
        self.__start__ = None
        self.__stop__ = None
        self.__elapsed__ = 0.0
        self.__nums__ = []

    def __init__(self):
        self.reset()

    def start(self):
        if self.__start__ is None:
            self.__start__ = time.time()
        else:
            raise Exception("start() already called, did you forget to stop() first?")
        # Return self to facilitate the context manager __enter__ protocol.
        return self

    def stop(self):
        if self.__start__ is not None:
            self.__stop__ = time.time()
            elapsed = self.__stop__ - self.__start__
            self.__total_elapsed__ += elapsed
            self.__laps__ += 1
            self.__nums__.append(elapsed)
            self.__start__ = None # Reset __start__ to be None again.
        else:
            raise Exception("stop() called without first start()?")

    def laps(self):
        """Gets the number of laps. One lap is equal to a start/stop action."""
        return self.__laps__

    def avg(self):
        """Equal to total elapsed time divided by the number of laps."""
        return self.__total_elapsed__ / self.__laps__

    #def sigma(self):
    #    """Return the standard deviation of the available samples."""
    #    if self.__laps__ <= 0:
    #        return None
    #    return numpy.std(self.__nums__)

    def __str__(self):
        return "Avg: %f (Laps: %d, Total Elapsed Time: %f, min=%f, max=%f)" % (self.avg(),
                                                                               self.__laps__,
                                                                               self.__total_elapsed__,
                                                                               min(self.__nums__),
                                                                               max(self.__nums__))

class BenchBase(TestBase):
    """
    Abstract base class for benchmark tests.
    """
    def setUp(self):
        """Fixture for unittest test case setup."""
        super(BenchBase, self).setUp()
        #TestBase.setUp(self)
        self.stopwatch = Stopwatch()

    def tearDown(self):
        """Fixture for unittest test case teardown."""
        super(BenchBase, self).tearDown()
        #TestBase.tearDown(self)
        del self.stopwatch

