Orb/Doxygen/src/classdef.cpp
changeset 1 82f11024044a
parent 0 42188c7ea2d9
--- a/Orb/Doxygen/src/classdef.cpp	Thu Jan 21 17:29:01 2010 +0000
+++ b/Orb/Doxygen/src/classdef.cpp	Thu Mar 18 18:26:18 2010 +0000
@@ -310,7 +310,26 @@
     m_impl->inherits = new BaseClassList;
     m_impl->inherits->setAutoDelete(TRUE);
   }
-  m_impl->inherits->append(new BaseClassDef(cd,n,p,s,t));
+  if (Config_getBool("PREPROCESS_INCLUDES")) {
+    // If we are preprocessing the #included files we might have seen
+    // this class declaration, and inheritance more than once so we
+    // only add a relationship where one did not exist before
+    bool hasAlready = false;
+	BaseClassListIterator bcli(*baseClasses());
+	BaseClassDef *bcd;
+	for (bcli.toFirst();(bcd=bcli.current());++bcli) {
+	  if (bcd->usedName == n) {
+		hasAlready = true;
+		//printf("*** Seen it...\n");
+		break;
+	  }
+	}
+	if (!hasAlready) {
+	  m_impl->inherits->append(new BaseClassDef(cd,n,p,s,t));
+	}
+  } else {
+	m_impl->inherits->append(new BaseClassDef(cd,n,p,s,t));
+  }
 }
 
 // inserts a sub class in the inherited list
@@ -360,7 +379,7 @@
                                     bool addToAllList
                                    )
 {
-  //printf("insertInternalMember(%s) isHidden()=%d\n",md->name().data(),md->isHidden());
+  //printf("%p:insertInternalMember(%s) isHidden()=%d\n", this, md->name().data(),md->isHidden());
   if (md->isHidden()) return;
 
   if (!isReference())
@@ -3186,11 +3205,68 @@
   return 0;
 }
 
+/** Need this to check the function, If we wait until we are trying
+to insert a MemberDef thatn we will (a) have a memory leak and
+(b) call makeresident on that MemberDef prematurely.
+*/
+bool ClassDef::hasFunction(const QCString &theDef, Protection prot)
+{
+	bool retVal = false;
+	switch (prot) {
+		case Protected: 
+			retVal = hasFunction(MemberList::proMethods, theDef);
+			break;
+		case Package: 
+			retVal = hasFunction(MemberList::pacMethods, theDef);
+			break;
+		case Public:    
+			retVal = hasFunction(MemberList::pubMethods, theDef);
+			break;
+		case Private:   
+			retVal = hasFunction(MemberList::priMethods, theDef);
+			break;
+	}
+	return retVal;
+}
+
+bool ClassDef::hasFunction(MemberList::ListType lt, const QCString &theDef)
+{
+	MemberList *ml = createMemberList(lt);
+	MemberListIterator mli(*ml);
+	MemberDef *cmd;
+	for (mli.toFirst(); (cmd = mli.current()); ++mli) {
+		if (theDef == cmd->declaration()) {
+			//printf("ClassDef::addMemberToList() rejecting duplicate %d \"%s::%s\"\n", md->memberType(), name().data(), md->declaration() ? md->declaration() : "");
+			return true;
+		}
+	}
+	return false;
+}
+
 void ClassDef::addMemberToList(MemberList::ListType lt,MemberDef *md,bool isBrief)
 {
   static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
   static bool sortMemberDocs = Config_getBool("SORT_MEMBER_DOCS");
   MemberList *ml = createMemberList(lt);
+  /*
+  if (Config_getBool("PREPROCESS_INCLUDES")) {
+    // If we are preprocessing the #included files we might have seen
+    // this member  more than once so we
+    // only add a member where one did not exist before
+	MemberListIterator mli(*ml);
+	MemberDef *cmd;
+	for (mli.toFirst(); (cmd = mli.current()); ++mli) {
+		if (strcmp(md->declaration(), cmd->declaration()) == 0) {
+		//if (md->anchor() == cmd->anchor()) {
+			printf("ClassDef::addMemberToList() rejecting duplicate %d \"%s::%s\"\n", md->memberType(), name().data(), md->declaration() ? md->declaration() : "");
+			// TODO: Delete md to avoid memory leak???
+			// But some callers still use md after it has been inserted...
+			return;
+		}
+	}
+  }
+  printf("ClassDef::addMemberToList() adding %d, \"%s::%s\"\n", md->memberType(), name().data(), md->declaration() ? md->declaration() : "");
+  */
   if (( isBrief && sortBriefDocs ) ||
       (!isBrief && sortMemberDocs)
      )