#ifndef __SYMBOLSCREATER_H__
#define __SYMBOLSCREATER_H__
#include <queue>
#include <string>
#include <fstream>
#include <vector>
#include <map>

using namespace std;

#include <boost/thread/thread.hpp>
#include <boost/thread/condition.hpp>

struct SymGenContext {
	const char* iFileName ;
	TUint32	iTotalSize ;
	TUint32 iCodeAddress; 
	TUint32 iDataAddress; 
	TUint32 iDataBssLinearBase;	 
	TInt iTextSize; 
	TInt iDataSize; 
	TInt iBssSize;   	
	TInt iTotalDataSize;
	TBool iExecutable ;
};

class SymbolGenerator  {  
public :
		SymbolGenerator(const char* aSymbolFileName, int aMultiThreadsCount = 1);
		~SymbolGenerator();		
		void AddEntry(const SymGenContext& aEntry); 
		void WaitThreads();
private :
		SymbolGenerator();
		SymbolGenerator& operator = (const SymbolGenerator& aRight);
		static void ThreadFunc(SymbolGenerator* aInst); 
		bool ProcessEntry(const SymGenContext& aContext);
		bool ProcessARMV5Map(ifstream& aStream, const SymGenContext& aContext);
		bool ProcessGCCMap(ifstream& aStream, const SymGenContext& aContext);
		bool ProcessX86Map(ifstream& aStream, const SymGenContext& aContext);
		ofstream iOutput ; 
		boost::thread_group iThreads ;
		boost::condition_variable iCond;
		boost::mutex iQueueMutex;
		boost::mutex iFileMutex ;
		queue<SymGenContext> iEntries ;	
		vector<char*> iErrMsgs ;
	
};

#endif //__ROMSYMBOLGENERATOR_H__
