diff -r 000000000000 -r 42188c7ea2d9 Orb/Doxygen/src/outputlist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Orb/Doxygen/src/outputlist.cpp Thu Jan 21 17:29:01 2010 +0000 @@ -0,0 +1,314 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 1997-2008 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +/*! \file + * This class represents a list of output generators that work in "parallel". + * The class only knows about the abstract base class OutputGenerators. + * All output is produced by calling a method of this class, which forwards + * the call to all output generators. + */ + +#include "outputlist.h" +#include "outputgen.h" +#include "config.h" +#include "message.h" +#include "definition.h" + +#include "docparser.h" + +OutputList::OutputList(bool) +{ + //printf("OutputList::OutputList()\n"); + outputs = new QList; + outputs->setAutoDelete(TRUE); +} + +OutputList::~OutputList() +{ + //printf("OutputList::~OutputList()\n"); + delete outputs; +} + +void OutputList::add(const OutputGenerator *og) +{ + if (og) outputs->append(og); +} + +void OutputList::disableAllBut(OutputGenerator::OutputType o) +{ + OutputGenerator *og=outputs->first(); + while (og) + { + og->disableIfNot(o); + og=outputs->next(); + } +} + +void OutputList::enableAll() +{ + OutputGenerator *og=outputs->first(); + while (og) + { + og->enable(); + og=outputs->next(); + } +} + +void OutputList::disableAll() +{ + OutputGenerator *og=outputs->first(); + while (og) + { + og->disable(); + og=outputs->next(); + } +} + +void OutputList::disable(OutputGenerator::OutputType o) +{ + OutputGenerator *og=outputs->first(); + while (og) + { + og->disableIf(o); + og=outputs->next(); + } +} + +void OutputList::enable(OutputGenerator::OutputType o) +{ + OutputGenerator *og=outputs->first(); + while (og) + { + og->enableIf(o); + og=outputs->next(); + } +} + +bool OutputList::isEnabled(OutputGenerator::OutputType o) +{ + bool result=FALSE; + OutputGenerator *og=outputs->first(); + while (og) + { + result=result || og->isEnabled(o); + og=outputs->next(); + } + return result; +} + +void OutputList::pushGeneratorState() +{ + OutputGenerator *og=outputs->first(); + while (og) + { + og->pushGeneratorState(); + og=outputs->next(); + } +} + +void OutputList::popGeneratorState() +{ + OutputGenerator *og=outputs->first(); + while (og) + { + og->popGeneratorState(); + og=outputs->next(); + } +} + +void OutputList::parseDoc(const char *fileName,int startLine, + Definition *ctx,MemberDef * md, + const QCString &docStr,bool indexWords, + bool isExample,const char *exampleName, + bool singleLine,bool linkFromIndex) +{ + int count=0; + if (docStr.isEmpty()) return; + + OutputGenerator *og=outputs->first(); + while (og) + { + if (og->isEnabled()) count++; + og=outputs->next(); + } + if (count==0) return; // no output formats enabled. + + DocNode *root=0; + if (docStr.at(docStr.length()-1)=='\n') + { + root = validatingParseDoc(fileName,startLine, + ctx,md,docStr,indexWords,isExample,exampleName, + singleLine,linkFromIndex); + } + else + { + root = validatingParseDoc(fileName,startLine, + ctx,md,docStr+"\n",indexWords,isExample,exampleName, + singleLine,linkFromIndex); + } + + og=outputs->first(); + while (og) + { + //printf("og->printDoc(extension=%s)\n", + // ctx?ctx->getDefFileExtension().data():""); + if (og->isEnabled()) og->printDoc(root,ctx?ctx->getDefFileExtension():QCString("")); + og=outputs->next(); + } + + delete root; +} + +void OutputList::parseText(const QCString &textStr) +{ + int count=0; + OutputGenerator *og=outputs->first(); + while (og) + { + if (og->isEnabled()) count++; + og=outputs->next(); + } + if (count==0) return; // no output formats enabled. + + DocNode *root = validatingParseText(textStr); + + og=outputs->first(); + while (og) + { + if (og->isEnabled()) og->printDoc(root,0); + og=outputs->next(); + } + + delete root; +} + + +//-------------------------------------------------------------------------- +// Create some overloaded definitions of the forall function. +// Using template functions here would have made it a little less +// portable (I guess). + +// zero arguments +void OutputList::forall(void (OutputGenerator::*func)()) +{ + OutputGenerator *og=outputs->first(); + while (og) + { + if (og->isEnabled()) (og->*func)(); + og=outputs->next(); + } +} + +// one argument +#define FORALL1(a1,p1) \ +void OutputList::forall(void (OutputGenerator::*func)(a1),a1) \ +{ \ + OutputGenerator *og=outputs->first(); \ + while (og) \ + { \ + if (og->isEnabled()) (og->*func)(p1); \ + og=outputs->next(); \ + } \ +} + +// two arguments +#define FORALL2(a1,a2,p1,p2) \ +void OutputList::forall(void (OutputGenerator::*func)(a1,a2),a1,a2) \ +{ \ + OutputGenerator *og=outputs->first(); \ + while (og) \ + { \ + if (og->isEnabled()) (og->*func)(p1,p2); \ + og=outputs->next(); \ + } \ +} + +// three arguments +#define FORALL3(a1,a2,a3,p1,p2,p3) \ +void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3),a1,a2,a3) \ +{ \ + OutputGenerator *og=outputs->first(); \ + while (og) \ + { \ + if (og->isEnabled()) (og->*func)(p1,p2,p3); \ + og=outputs->next(); \ + } \ +} + +// four arguments +#define FORALL4(a1,a2,a3,a4,p1,p2,p3,p4) \ +void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4),a1,a2,a3,a4) \ +{ \ + OutputGenerator *og=outputs->first(); \ + while (og) \ + { \ + if (og->isEnabled()) (og->*func)(p1,p2,p3,p4); \ + og=outputs->next(); \ + } \ +} + +// five arguments +#define FORALL5(a1,a2,a3,a4,a5,p1,p2,p3,p4,p5) \ +void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5),a1,a2,a3,a4,a5) \ +{ \ + OutputGenerator *og=outputs->first(); \ + while (og) \ + { \ + if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5); \ + og=outputs->next(); \ + } \ +} + +// now instantiate only the ones we need. + +FORALL1(const char *a1,a1) +FORALL1(char a1,a1) +FORALL1(int a1,a1) +FORALL1(const DotClassGraph &a1,a1) +FORALL1(const DotInclDepGraph &a1,a1) +FORALL1(const DotCallGraph &a1,a1) +FORALL1(const DotDirDeps &a1,a1) +FORALL1(const DotGfxHierarchyTable &a1,a1) +FORALL1(const DotGroupCollaboration &a1,a1) +FORALL1(SectionTypes a1,a1) +#if defined(HAS_BOOL_TYPE) || defined(Q_HAS_BOOL_TYPE) +FORALL1(bool a1,a1) +FORALL2(bool a1,int a2,a1,a2) +FORALL2(bool a1,bool a2,a1,a2) +FORALL4(const char *a1,const char *a2,const char *a3,bool a4,a1,a2,a3,a4) +#endif +FORALL2(int a1,bool a2,a1,a2) +FORALL2(bool a1,HighlightedItem a2,a1,a2) +FORALL2(bool a1,const char *a2,a1,a2) +FORALL2(ParamListTypes a1,const char *a2,a1,a2) +FORALL1(IndexSections a1,a1) +FORALL2(const char *a1,const char *a2,a1,a2) +FORALL2(const char *a1,bool a2,a1,a2) +FORALL2(const char *a1,SectionInfo::SectionType a2,a1,a2) +FORALL3(bool a1,bool a2,bool a3,a1,a2,a3) +FORALL3(const ClassDiagram &a1,const char *a2,const char *a3,a1,a2,a3) +FORALL3(const char *a1,const char *a2,const char *a3,a1,a2,a3) +FORALL3(const char *a1,const char *a2,bool a3,a1,a2,a3) +FORALL3(const char *a1,const char *a2,SectionInfo::SectionType a3,a1,a2,a3) +FORALL3(uchar a1,uchar a2,uchar a3,a1,a2,a3) +FORALL4(SectionTypes a1,const char *a2,const char *a3,const char *a4,a1,a2,a3,a4) +FORALL4(const char *a1,const char *a2,const char *a3,const char *a4,a1,a2,a3,a4) +FORALL4(const char *a1,const char *a2,const char *a3,int a4,a1,a2,a3,a4) +FORALL5(const char *a1,const char *a2,const char *a3,const char *a4,const char *a5,a1,a2,a3,a4,a5) + + +//--------------------------------------------------------------------------