"""
Objective-C runtime wrapper for use by LLDB Python formatters

part of The LLVM Compiler Infrastructure
This file is distributed under the University of Illinois Open Source
License. See LICENSE.TXT for details.
"""
import lldb
import time, datetime
import inspect

class TimeMetrics:
	@staticmethod
	def generate(label=None):
		return TimeMetrics(label)
	
	def __init__(self,lbl=None):
		self.label = "" if lbl is None else lbl
		pass
	
	def __enter__(self):
		caller = inspect.stack()[1]
		self.function = str(caller)
		self.enter_time = time.clock()
	
	def __exit__(self, a,b,c):
		self.exit_time = time.clock()
		print "It took " + str(self.exit_time - self.enter_time) + " time units to run through " + self.function + self.label
		return False

class Counter:
	def __init__(self):
		self.count = 0
		self.list = []
	def update(self,name):
		self.count = self.count + 1
		# avoid getting the full dump of this ValueObject just to save its metrics
		if isinstance(name,lldb.SBValue):
			self.list.append(name.GetName())
		else:
			self.list.append(str(name))
	def __str__(self):
		return str(self.count) + " times, for items [" + str(self.list) + "]"

class MetricsPrinter_Verbose:
	def __init__(self,metrics):
		self.metrics = metrics
	def __str__(self):
		string = ""
		for key,value in self.metrics.metrics.items():
			string = string + "metric " + str(key) + ": " + str(value) + "\n"
		return string

class MetricsPrinter_Compact:
	def __init__(self,metrics):
		self.metrics = metrics
	def __str__(self):
		string = ""
		for key,value in self.metrics.metrics.items():
			string = string + "metric " + str(key) + " was hit " + str(value.count) + " times\n"
		return string

class Metrics:
	def __init__(self):
		self.metrics = {}

	def add_metric(self,name):
		self.metrics[name] = Counter()

	def metric_hit(self,metric,trigger):
		self.metrics[metric].update(trigger)

	def __getitem__(self,key):
		return self.metrics[key]

	def __getattr__(self,name):
		if name == 'compact':
			return MetricsPrinter_Compact(self)
		if name == 'verbose':
			return MetricsPrinter_Verbose(self)
		raise AttributeError("%r object has no attribute %r" %
			                         (type(self).__name__, name))

	def __str__(self):
		return str(self.verbose)

	def metric_success(self,metric):
		total_count = 0
		metric_count = self[metric].count
		for key,value in self.metrics.items():
			total_count = total_count + value.count
		if total_count > 0:
			return metric_count / float(total_count)
		return 0
