/* Web Polygraph       http://www.web-polygraph.org/
 * (C) 2003-2006 The Measurement Factory
 * Licensed under the Apache License, Version 2.0 */

#ifndef POLYGRAPH__LOGANALYZERS_STEX_H
#define POLYGRAPH__LOGANALYZERS_STEX_H

#include "xstd/String.h"
#include "base/StatPhaseRec.h"

class XmlNodes;
class PhaseInfo;


// an algorithm of extracting a particular named statistics out of
// cycle or phase stats record and describing/categorizing that statistics
class Stex {
	public:
		typedef TmSzStat StatPhaseRec::*AggrPtr;
		typedef TmSzHistStat StatPhaseRec::*HistPtr;
		typedef TmSzStat StatIntvlRec::*TracePtr;

	public:
		Stex(const String &aKey, const String &aName);
		virtual ~Stex();

		void parent(const Stex *aParent);

		const String &key() const { return theKey; } // precise, for machine use
		const String &name() const { return theName; } // imprecise, human-readable
		const Stex *parent() const { return theParent; }

		virtual const TmSzStat *aggr(const PhaseInfo &phase) const;
		virtual const TmSzHistStat *hist(const PhaseInfo &) const { return 0; }
		virtual const TmSzStat *trace(const StatIntvlRec &) const { return 0; }

		virtual void describe(XmlNodes &nodes) const = 0;

	protected:
		void describeParent(XmlNodes &nodes) const;

	protected:
		String theKey;
		String theName;
		const Stex *theParent; // if we are a part of a 'larger' stats group
};


class HitsStex: public Stex {
	public:
		HitsStex(const String &aKey, const String &aName);

		virtual const TmSzHistStat *hist(const PhaseInfo &phase) const;
		virtual const TmSzStat *trace(const StatIntvlRec &rec) const;

		virtual void describe(XmlNodes &nodes) const;
};

class MissesStex: public Stex {
	public:
		MissesStex(const String &aKey, const String &aName);

		virtual const TmSzHistStat *hist(const PhaseInfo &phase) const;
		virtual const TmSzStat *trace(const StatIntvlRec &rec) const;

		virtual void describe(XmlNodes &nodes) const;
};

class HitMissesStex: public Stex {
	public:
		HitMissesStex(const String &aKey, const String &aName);

		virtual const TmSzHistStat *hist(const PhaseInfo &phase) const;
		virtual const TmSzStat *trace(const StatIntvlRec &rec) const;

	protected:
		mutable TmSzHistStat theXactHist;
		mutable TmSzStat theXactAggr;

		virtual void describe(XmlNodes &nodes) const;
};


class Ims200Stex: public Stex {
	public:
		Ims200Stex(const String &aKey, const String &aName);

		virtual const TmSzStat *aggr(const PhaseInfo &phase) const;
		virtual const TmSzHistStat *hist(const PhaseInfo &phase) const;

		virtual void describe(XmlNodes &nodes) const;

	protected:
		mutable TmSzStat theXactAggr;
};

class Ims304Stex: public Stex {
	public:
		Ims304Stex(const String &aKey, const String &aName);

		virtual const TmSzStat *aggr(const PhaseInfo &phase) const;
		virtual const TmSzHistStat *hist(const PhaseInfo &phase) const;

		virtual void describe(XmlNodes &nodes) const;

	protected:
		mutable TmSzStat theXactAggr;
};

class ImsStex: public Stex {
	public:
		ImsStex(const String &aKey, const String &aName);

		virtual const TmSzHistStat *hist(const PhaseInfo &phase) const;
		virtual const TmSzStat *trace(const StatIntvlRec &rec) const;

		virtual void describe(XmlNodes &nodes) const;

	protected:
		mutable TmSzHistStat theXactHist;
		mutable TmSzStat theXactAggr;
};


class CachableStex: public Stex {
	public:
		CachableStex(const String &aKey, const String &aName);

		virtual const TmSzStat *trace(const StatIntvlRec &rec) const;

		virtual void describe(XmlNodes &nodes) const;
};

class UnCachableStex: public Stex {
	public:
		UnCachableStex(const String &aKey, const String &aName);

		virtual const TmSzStat *trace(const StatIntvlRec &rec) const;

		virtual void describe(XmlNodes &nodes) const;
};

class AllCachableStex: public Stex {
	public:
		AllCachableStex(const String &aKey, const String &aName);

		virtual const TmSzStat *trace(const StatIntvlRec &rec) const;

		virtual void describe(XmlNodes &nodes) const;

	protected:
		mutable TmSzStat theXactAggr;
};


class FillStex: public Stex {
	public:
		FillStex(const String &aKey, const String &aName);

		virtual const TmSzStat *trace(const StatIntvlRec &rec) const;

		virtual void describe(XmlNodes &nodes) const;
};


class SimpleStex: public Stex {
	public:
		SimpleStex(const String &aKey, const String &aName, HistPtr aHist, TracePtr aTrace);

		virtual const TmSzHistStat *hist(const PhaseInfo &phase) const;
		virtual const TmSzStat *trace(const StatIntvlRec &rec) const;

		virtual void describe(XmlNodes &nodes) const;

	protected:
		HistPtr theHist;
		TracePtr theTrace;
};


class AllMethodsStex: public Stex {
	public:
		AllMethodsStex(const String &aKey, const String &aName);

		virtual const TmSzHistStat *hist(const PhaseInfo &phase) const;
		virtual const TmSzStat *trace(const StatIntvlRec &rec) const;

		virtual void describe(XmlNodes &nodes) const;

	protected:
		mutable TmSzHistStat theXactHist;
		mutable TmSzStat theXactAggr;
};


class AllRepsStex: public Stex {
	public:
		AllRepsStex(const String &aKey, const String &aName);

		virtual const TmSzHistStat *hist(const PhaseInfo &phase) const;
		virtual const TmSzStat *trace(const StatIntvlRec &rec) const;

		virtual void describe(XmlNodes &nodes) const;

	protected:
		mutable TmSzHistStat theXactHist;
		mutable TmSzStat theXactAggr;
};


class ContTypeStex: public Stex {
	public:
		ContTypeStex(const String &aKey, const String &aName, int idx);

		virtual const TmSzStat *aggr(const PhaseInfo &phase) const;

		virtual void describe(XmlNodes &nodes) const;

	protected:
		int theIdx;
		mutable TmSzStat theXactAggr;
};

class AllContTypesStex: public Stex {
	public:
		AllContTypesStex(const String &aKey, const String &aName);

		virtual const TmSzStat *aggr(const PhaseInfo &phase) const;

		virtual void describe(XmlNodes &nodes) const;

	protected:
		mutable TmSzStat theXactAggr;
};


#endif


syntax highlighted by Code2HTML, v. 0.9.1