apicompatanamdw/compatanalysercmd/headeranalyser/src/NodeIndex.h
changeset 0 638b9c697799
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apicompatanamdw/compatanalysercmd/headeranalyser/src/NodeIndex.h	Tue Jan 12 14:52:39 2010 +0530
@@ -0,0 +1,253 @@
+/*
+* Copyright (c) 2006-2009 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:  
+*
+*/
+
+
+#ifndef __NODE_INDEX_H_
+#define __NODE_INDEX_H_
+
+#include "CmdGlobals.h"
+#ifdef __WIN__
+#pragma warning(disable:4786)
+#endif
+#include <assert.h>
+#include <map>
+#include <list>
+#include <xercesc/dom/DOM.hpp>
+
+using namespace std;
+
+XERCES_CPP_NAMESPACE_USE
+
+//The access specifiers in class
+enum TAccess
+{
+    EAccessGlobal,
+    EAccessPublic,
+    EAccessProtected,
+    EAccessPrivate,
+    EAccessHidden
+};
+
+// The compare function for the fully qualified name that takes
+// into account the identity of the node
+struct compareFQName
+{
+bool operator()(
+    const pair<const XMLCh *,const XMLCh *>&  p1,
+    const pair<const XMLCh *,const XMLCh *>&  p2) const;
+};
+
+// General compare function for XMLCh
+struct ltstr
+{
+  bool operator()(const XMLCh * s1,const XMLCh * s2) const;
+};
+
+// Struct for data members
+struct DataMember
+{
+	string iName;
+	DOMNode* iNode;
+	int iOffset;
+	TAccess iAccess;
+	int iLineNo;
+
+	DataMember(string name,DOMNode* node, int offset, TAccess access, int lineNo):
+	iName(name),
+	iNode(node),
+	iOffset(offset),
+	iAccess(access),
+	iLineNo(lineNo)
+	{
+	}
+
+	DataMember(const DataMember& other)
+	{
+		this->operator=(other);
+	}
+
+	const DataMember & operator=(const DataMember& other)
+	{
+		iName = other.iName;
+		iNode = other.iNode;
+		iOffset = other.iOffset;
+		iAccess = other.iAccess;
+		iLineNo = other.iLineNo;
+		return *this;
+	}
+};
+
+
+/**
+* The NodeIndex class indexes the nodes of the XML node tree by 
+* the fully qualified name and node ID.
+*/
+class NodeIndex
+{
+public:
+    typedef map< pair<const XMLCh *,const XMLCh *> , DOMNode*, compareFQName > fqnamemap;
+    typedef map< const XMLCh *,pair<const XMLCh*,bool>, ltstr > fileidmap;
+	typedef vector<pair<string,DOMNode*> > vtable_t;
+	typedef map< string, vtable_t > vtableindex_t;
+	typedef vector<DataMember> dtable_t;
+	typedef map< string, dtable_t > dtableindex_t;
+public:
+
+    /**
+    * Clears the node map
+    */
+    void clear();
+
+    /**
+    * Add the node with its id to the map
+    */
+    void AddNodeIdToMap(DOMNode * node);
+
+    /**
+    * Add the node with fully qualified name to the map
+    * @param node current DOMNode pointer
+    * @param fqname fully qualified name
+    */
+    void AddNodeFQNameToMap(DOMNode * node, const pair<const XMLCh*,const XMLCh*>& fqname);
+
+    /**
+    * Add the file node to file map
+    * @param id the node id
+    * @param file filepair to add
+    */
+    void AddFileNodeToMap(const XMLCh* id,pair<const XMLCh*,bool> file);
+
+    /**
+    * Finds the node with id.
+    * @param root DOMNode pointer
+    * @param id of the node
+    * @return NULL if not found
+    */
+    DOMNode * FindNodeById(DOMNode * root, const XMLCh* id);
+
+    /**
+    * Finds the node with fully qualified name.
+    * @param root DOMNode pointer
+    * @param FQName fullu qualified name of the node
+    * @return pointer to DOMnode or NULL if not found
+    */
+    DOMNode * FindNodeByFQName(DOMNode * root, pair<const XMLCh*,const XMLCh* > FQName);
+
+    /**
+    * Returns the file pair <filename,tobeanalysed> by file id
+    * @param fileid id to search
+    * @return found filepair
+    */
+    const pair<const XMLCh*,bool>& FindFileByFileId(const XMLCh* fileid);
+
+    /**
+    * Dumps the tables (for debugging)
+    */
+    void DumpTables();
+
+    /**
+    * Adds a virtual function to the table vtable
+    * @param vtable virtual table name
+    * @param functionsig function signature
+    * @param node pointer to DOMNode
+    */
+	void AddVirtualFunction(const string& vtable,const string& functionsig, DOMNode* node);
+
+    /**
+    * Gets the virtual table vtable
+    * @param vtable virtual table name
+    * @return virtual table pointer
+    */
+	const vtable_t* GetVirtualTable(const string& vtable);
+
+    /**
+    * Add empty virtual table
+    * @param vtable virtual table name
+    * @return virtual table pointer
+    */
+	const vtable_t*	AddEmptyVirtualTable(const string& vtable);
+	
+    /**
+    * Adds a data member to the table vtable
+    * @param parentNode Node iterator pointing to the parent node.
+    * @param parentName Name of the parent node.
+    * @param memberName name of the data table
+    * @param memberNode
+    * @param index offset value of member
+    * @param access how restricted the access of member is
+    */
+	void AddDataMember(const HANodeIterator& parentNode, const string& parentName, const string& memberName, DOMNode* memberNode, int index, TAccess access,int lineNo);
+
+    /**
+    * Gets the data member table
+    * @param node Node iterator pointing to the node whose members should be returned.
+    * @param nodeName Name of the node.
+    * @return table pointer
+    */
+	const dtable_t* GetDataMemberTable(const HANodeIterator& node, const string& nodeName);
+
+    /**
+    * Add empty data member table
+    * @param node Reference to the node of the object, whose members will 
+    * get the new (empty) table entry
+    * @param nodeName Name of the node.
+    * @return data table pointer
+    */
+	const dtable_t* AddEmptyDataMemberTable(const HANodeIterator& node, const string& nodeName);
+	
+//Private methods
+private:
+    
+    /**
+    * Search from the tree
+    * @param root DOM root node
+    * @param id to search
+    * @return id table pointer
+    */
+    DOMNode * FindNodeByIdFromTree(DOMNode * root, const XMLCh* id);
+
+    /**
+    * Inserts data member entry to the given table.
+    * @param parentName Name of the data member's parent.
+    * @param member Data member to be inserted to the data table.
+    * @param dataTable Reference to the data table.
+    */
+    void InsertDataMember(const string& parentName, const DataMember& member, dtableindex_t& dataTable);
+    
+//Private member variables
+private:
+        
+    //! Maps node id string to node pointer
+    map< const XMLCh *,DOMNode*,ltstr > iIdToNodeMap;
+
+    //! Maps filename to list of nodes declared in that file
+    fileidmap iIdToFileMap;
+
+    //! File node map
+    fqnamemap iFQNameToNodeMap;
+
+    //! VTable map
+    vtableindex_t iVTableIndex;
+
+    //! DTable map
+    dtableindex_t iDTableIndex;
+
+    //! Data table for anonymous classes
+    dtableindex_t iAnonymousTable;
+};
+
+#endif