aknlayoutcompiler/src/MLCompDataLayPerfWriter.cpp
changeset 0 f58d6ec98e88
child 1 b700e12870ca
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/aknlayoutcompiler/src/MLCompDataLayPerfWriter.cpp	Thu Dec 17 09:14:18 2009 +0200
@@ -0,0 +1,222 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*    
+*
+*/
+
+
+#include "MLCompDataLayPerfWriter.h"
+#include "MLCompData2Cdl.h" // for static methods
+#include "LayoutCompilerErr.h"
+#include "CodeGenConsts.h"
+
+#include <cdlcompilertoolkit/cdltkinterface.h>
+#include <cdlcompilertoolkit/cdltkutil.h>
+
+#include <iostream>
+#include <sstream>
+#include <set>
+#include <fstream>
+#include <algorithm>
+
+using namespace std;
+using namespace CdlCompilerToolkit;
+
+const string KComma = ",";
+const string KSpace = " ";
+const string KMacroNameRoot = "LAYOUT_TEST";
+const string KMacroNameWindow = "_WINDOW";
+const string KMacroNameText = "_TEXT";
+const string KMacroNameComponent = "_COMPONENT";
+const string KMacroNameParams = "_PARAMS";
+
+//
+// TMLCompDataLayPerfTableWriter
+//
+
+TMLCompDataLayPerfTableWriter::TMLCompDataLayPerfTableWriter(TMLCompDataLayPerfWriter* aParent, TMLCompDataTable& aTable, string& aInterfaceName, int aTableId) 
+	: 
+	iParent(aParent),
+	iTable(aTable),
+	iInterfaceName(aInterfaceName),
+	iTableId(aTableId)
+	{
+	}
+
+TMLCompDataLayPerfTableWriter::~TMLCompDataLayPerfTableWriter()
+	{
+	}
+
+void TMLCompDataLayPerfTableWriter::Write(ostream& out)
+	{
+	WriteTable(out);
+	}
+
+
+const string KTestAPITableFuntionSig = "\
+testLayout_$LAYOUT_$TABLEID()";
+
+string GenerateMLFunctionName(string aInterfaceName, int aTableId)
+	{
+	string tableNum = CdlTkUtil::IntToString(aTableId);
+
+	CdlTkUtil::CReplaceSet rep;
+	rep.Add("$LAYOUT", aInterfaceName);
+	rep.Add("$TABLEID", tableNum);
+	return CdlTkUtil::MultiReplace(rep, KTestAPITableFuntionSig);
+	}
+
+void TMLCompDataLayPerfTableWriter::WriteTable(ostream& out)
+	{
+	out << "void " << GenerateMLFunctionName(iInterfaceName, iTableId) << endl;
+
+	out << "{" << endl; // start of function
+	out << "DECLARE_LOCAL_VARS_COUNTS" << endl;
+	
+	out << "\n// Layout MACROs for Layout Table : ";
+	out << iTable.Name() << endl;
+
+	for (int i=0; i<iTable.size(); ++i)
+		{
+		WriteLine(out, *iTable[i]);
+		}
+
+	out << endl;
+	out << "}\n" << endl; // end of function
+	}
+
+void TMLCompDataLayPerfTableWriter::WriteLine(ostream& out, TMLCompDataLine& aLine)
+	{
+	string macroName = BuildMacroName(aLine);
+	string apiName = BuildApiName(aLine);
+	string params = BuildParams(aLine);
+	string paramLimitParams = BuildParamLimitParams(aLine);
+
+	out << macroName << "( "; 
+
+	if(aLine.NeedsParams())		
+		{
+		out << 	apiName << KFuncParamLimitsSuffix << "(" << paramLimitParams << ")";
+		out << ", ";
+		}
+
+	out << 	apiName << "(" << params << ")";
+	out << " )" << endl; // this ends the macro call
+	out << endl;
+	}
+
+string TMLCompDataLayPerfTableWriter::BuildMacroName(TMLCompDataLine& aLine)
+	{
+	string macroName = KMacroNameRoot;
+	macroName += (aLine.iType == TMLCompDataLine::ETextComponent) ? KMacroNameText : KMacroNameWindow;
+	macroName += KMacroNameComponent;
+	if(aLine.NeedsParams())		
+		macroName += KMacroNameParams;
+	return macroName;
+	}
+
+string TMLCompDataLayPerfTableWriter::BuildApiName(TMLCompDataLine& aLine)
+	{
+	string apiName = iInterfaceName;
+	apiName += string("::");
+	apiName += MLCompDataToCdl::LineApiName(aLine);
+	return apiName;
+	}
+
+string TMLCompDataLayPerfTableWriter::BuildParams(TMLCompDataLine& aLine)
+	{
+	string paramsString;
+	string name = aLine.Name();
+
+	// add the params in the order of the CDL interface
+	CCdlTkApi* api = iParent->iInterface.ApiList().Find(name);
+	if(!api)
+		throw NotFoundErr(name + " in interface " + iParent->iInterface.FileName());
+	CCdlTkFunctionApi* funcApi = static_cast<CCdlTkFunctionApi*>(api);
+	CCdlTkApiParams& params = funcApi->Params();
+	bool first = true;
+	for(CCdlTkApiParams::iterator pParam = params.begin(); pParam != params.end(); ++pParam)
+		{
+		if(!first)
+			{
+			paramsString.append(KComma); 
+			paramsString.append(KSpace);
+			}
+		paramsString.append(pParam->Name());
+		first = false;
+		}
+	return paramsString;
+	}
+
+string TMLCompDataLayPerfTableWriter::BuildParamLimitParams(TMLCompDataLine& aLine)
+	{
+	string paramsString;
+	string name = aLine.Name();
+
+	CCdlTkApi* api = iParent->iInterface.ApiList().Find(name);
+	if(!api)
+		throw NotFoundErr(name + " in interface " + iParent->iInterface.FileName());
+	CCdlTkFunctionApi* funcApi = static_cast<CCdlTkFunctionApi*>(api);
+	CCdlTkApiParams& params = funcApi->Params();
+
+	CCdlTkApiParams::iterator pParam = params.FindByName(KParamOptionIndex);
+	if(pParam != params.end() && aLine.NeedsOptions())
+		{
+		paramsString.append(pParam->Name());
+		}
+
+	return paramsString;
+	}
+
+
+//
+// TMLCompDataLayPerfWriter
+//
+
+TMLCompDataLayPerfWriter::TMLCompDataLayPerfWriter(CCdlTkInterface& aInterface, TMLCompData& aLayout, const std::string& aName)
+	:
+	iInterface(aInterface), 
+	TMLWriterBase<TMLCompData>(aLayout, aName)
+	{
+	}
+
+void TMLCompDataLayPerfWriter::Write(const std::string& aCdlName)
+	{
+	ofstream out(iName.c_str());
+
+	cout << "writing layout " << iName << endl;
+	string cdlFileName(CdlTkUtil::StripPath(aCdlName));
+	string ifName(iInterface.Header().Name());
+
+	out << "// function implementations: " << endl;
+	int tableId = 0;
+	for (TMLCompData::iterator pTab = iLayout.begin(); pTab != iLayout.end(); ++pTab)
+		{
+		TMLCompDataLayPerfTableWriter writer(this, **pTab, ifName, tableId++);
+		writer.Write(out);
+		}
+
+	out << "void testLayout_" << ifName << "()\n{" << endl;
+	tableId = 0;
+	for(;tableId < iLayout.size(); tableId++)
+		{
+		out << GenerateMLFunctionName(ifName, tableId) << ";" << endl;
+		}
+	out << "}\n" << endl;
+
+	out.close();
+	}
+
+// End of File