#!/usr/bin/python
#
# Copyright 2012 Google Inc. All Rights Reserved.
#

"""Tools for recording and reporting timeline of benchmark_run."""

__author__ = 'yunlian@google.com (Yunlian Jiang)'

import time


class Event(object):
  def __init__(self, name='', cur_time=0):
    self.name = name
    self.timestamp = cur_time


class Timeline(object):
  """Use a dict to store the timeline."""

  def __init__(self):
    self.events = []

  def Record(self, event):
    for e in self.events:
      assert e.name != event, ('The event {0} is already recorded.'
                               .format(event))
    cur_event = Event(name=event, cur_time=time.time())
    self.events.append(cur_event)

  def GetEvents(self):
    return([e.name for e in self.events])

  def GetEventDict(self):
    tl = {}
    for e in self.events:
      tl[e.name] = e.timestamp
    return tl

  def GetEventTime(self, event):
    for e in self.events:
      if e.name == event:
        return e.timestamp
    raise IndexError, 'The event {0} is not recorded'.format(event)

  def GetLastEventTime(self):
    return self.events[-1].timestamp

  def GetLastEvent(self):
    return self.events[-1].name
