#ifndef STARS_ida_Interface_h
#define STARS_ida_Interface_h

#include <map>


class STARS_IDA_Interface_t: public STARS_Interface_t
{
	public:

/* Segment getters */

		STARS_IDA_Interface_t() {};
		virtual STARS_Segment_t *getseg(const STARS_ea_t &addr)
			{
				segment_t* seg=::getseg(addr);
				return seg2Seg(seg);
			}

		virtual STARS_Segment_t *getnseg(const int &index)
			{
				segment_t* seg=::getnseg(index);
				return seg2Seg(seg);
			}

                virtual size_t get_segm_qty()
			{
				return ::get_segm_qty();
			}

		virtual STARS_Segment_t *get_next_seg(const STARS_ea_t &addr)
			{
				segment_t* seg=::get_next_seg(addr);
				return seg2Seg(seg);
			}

/* Function getters */

                /* find out how many functions there is */
                virtual size_t get_func_qty()
			{
				return ::get_func_qty();
			}

                /* get the index-th function */
                virtual STARS_Function_t *getn_func(int index) 
			{
				func_t* seg=::getn_func(index);
				return func2Func(seg);
			}

                /* get the function at the given address */
                virtual STARS_Function_t *get_func(STARS_ea_t ea) 
			{
				func_t* f=::get_func(ea);
				return func2Func(f);
			}

                virtual void get_func_name(const STARS_ea_t &ea, char* name, const size_t &len)
			{
				func_t* f=::get_func(ea);
				if(f)
				{
					func2Func(f)->GetFunctionName(name,len);
					return;
				}
				/* empty name */
				name[0]='\0';
				return;
			}

		virtual void AuditTailChunkOwnership(void);
                virtual void AuditCodeTargets(void);

	private:

		STARS_Segment_t* seg2Seg(segment_t* seg)
			{
				if(!seg)
					return NULL;
				if(segmap[seg]==NULL)
					segmap[seg]=new STARS_IDA_Segment_t(seg);
				return segmap[seg];
			}
		std::map<segment_t*, STARS_Segment_t*> segmap;



		STARS_Function_t* func2Func(func_t* f)
			{
				if(!f)
					return NULL;
				if(funcmap[f]==NULL)
					funcmap[f]=new STARS_IDA_Function_t(f);
				return funcmap[f];
			}
		std::map<func_t*, STARS_Function_t*> funcmap;
};


#endif