Blame src/outputlist.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
/*! \file
Packit 1c1d7e
 *  This class represents a list of output generators that work in "parallel".
Packit 1c1d7e
 *  The class only knows about the abstract base class OutputGenerators.
Packit 1c1d7e
 *  All output is produced by calling a method of this class, which forwards
Packit 1c1d7e
 *  the call to all output generators.
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#include "outputlist.h"
Packit 1c1d7e
#include "outputgen.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "message.h"
Packit 1c1d7e
#include "definition.h"
Packit 1c1d7e
#include "docparser.h"
Packit 1c1d7e
#include "vhdldocgen.h"
Packit 1c1d7e
Packit 1c1d7e
OutputList::OutputList(bool)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("OutputList::OutputList()\n");
Packit 1c1d7e
  m_outputs.setAutoDelete(TRUE);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
OutputList::~OutputList()
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("OutputList::~OutputList()\n");
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void OutputList::add(const OutputGenerator *og)
Packit 1c1d7e
{
Packit 1c1d7e
  if (og) m_outputs.append(og);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void OutputList::disableAllBut(OutputGenerator::OutputType o)
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);
Packit 1c1d7e
  OutputGenerator *og;
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    og->disableIfNot(o);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void OutputList::enableAll()
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);
Packit 1c1d7e
  OutputGenerator *og;
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    og->enable();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void OutputList::disableAll()
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);
Packit 1c1d7e
  OutputGenerator *og;
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    og->disable();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void OutputList::disable(OutputGenerator::OutputType o)
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);
Packit 1c1d7e
  OutputGenerator *og;
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    og->disableIf(o);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void OutputList::enable(OutputGenerator::OutputType o)
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);
Packit 1c1d7e
  OutputGenerator *og;
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    og->enableIf(o);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool OutputList::isEnabled(OutputGenerator::OutputType o)
Packit 1c1d7e
{
Packit 1c1d7e
  bool result=FALSE;
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);
Packit 1c1d7e
  OutputGenerator *og;
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    result=result || og->isEnabled(o);
Packit 1c1d7e
  }
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void OutputList::pushGeneratorState()
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);
Packit 1c1d7e
  OutputGenerator *og;
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    og->pushGeneratorState();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void OutputList::popGeneratorState()
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);
Packit 1c1d7e
  OutputGenerator *og;
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    og->popGeneratorState();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool OutputList::generateDoc(const char *fileName,int startLine,
Packit 1c1d7e
                  Definition *ctx,MemberDef * md,
Packit 1c1d7e
                  const QCString &docStr,bool indexWords,
Packit 1c1d7e
                  bool isExample,const char *exampleName,
Packit 1c1d7e
                  bool singleLine,bool linkFromIndex)
Packit 1c1d7e
{
Packit 1c1d7e
  int count=0;
Packit 1c1d7e
  if (docStr.isEmpty()) return TRUE;
Packit 1c1d7e
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);
Packit 1c1d7e
  OutputGenerator *og;
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (og->isEnabled()) count++;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (count==0) return TRUE; // no output formats enabled.
Packit 1c1d7e
Packit 1c1d7e
  DocRoot *root=0;
Packit 1c1d7e
  root = validatingParseDoc(fileName,startLine,
Packit 1c1d7e
                            ctx,md,docStr,indexWords,isExample,exampleName,
Packit 1c1d7e
                            singleLine,linkFromIndex);
Packit 1c1d7e
Packit 1c1d7e
  writeDoc(root,ctx,md);
Packit 1c1d7e
Packit 1c1d7e
  bool isEmpty = root->isEmpty();
Packit 1c1d7e
Packit 1c1d7e
  delete root;
Packit 1c1d7e
Packit 1c1d7e
  return isEmpty;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void OutputList::writeDoc(DocRoot *root,Definition *ctx,MemberDef *md)
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);
Packit 1c1d7e
  OutputGenerator *og;
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("og->printDoc(extension=%s)\n",
Packit 1c1d7e
    //    ctx?ctx->getDefFileExtension().data():"<null>");
Packit 1c1d7e
    if (og->isEnabled()) og->writeDoc(root,ctx,md);
Packit 1c1d7e
  }
Packit 1c1d7e
  VhdlDocGen::setFlowMember(0);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool OutputList::parseText(const QCString &textStr)
Packit 1c1d7e
{
Packit 1c1d7e
  int count=0;
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);
Packit 1c1d7e
  OutputGenerator *og;
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (og->isEnabled()) count++;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (count==0) return TRUE; // no output formats enabled.
Packit 1c1d7e
Packit 1c1d7e
  DocText *root = validatingParseText(textStr);
Packit 1c1d7e
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (og->isEnabled()) og->writeDoc(root,0,0);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  bool isEmpty = root->isEmpty();
Packit 1c1d7e
Packit 1c1d7e
  delete root;
Packit 1c1d7e
Packit 1c1d7e
  return isEmpty;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
//--------------------------------------------------------------------------
Packit 1c1d7e
// Create some overloaded definitions of the forall function.
Packit 1c1d7e
// Using template functions here would have made it a little less
Packit 1c1d7e
// portable (I guess).
Packit 1c1d7e
Packit 1c1d7e
// zero arguments
Packit 1c1d7e
void OutputList::forall(void (OutputGenerator::*func)())
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);
Packit 1c1d7e
  OutputGenerator *og;
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (og->isEnabled()) (og->*func)();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// one argument
Packit 1c1d7e
#define FORALL1(a1,p1)                                        \
Packit 1c1d7e
void OutputList::forall(void (OutputGenerator::*func)(a1),a1) \
Packit 1c1d7e
{                                                             \
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);               \
Packit 1c1d7e
  OutputGenerator *og;                                        \
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)                   \
Packit 1c1d7e
  {                                                           \
Packit 1c1d7e
    if (og->isEnabled()) (og->*func)(p1);                     \
Packit 1c1d7e
  }                                                           \
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// two arguments
Packit 1c1d7e
#define FORALL2(a1,a2,p1,p2)                                        \
Packit 1c1d7e
void OutputList::forall(void (OutputGenerator::*func)(a1,a2),a1,a2) \
Packit 1c1d7e
{                                                                   \
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);                     \
Packit 1c1d7e
  OutputGenerator *og;                                              \
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)                         \
Packit 1c1d7e
  {                                                                 \
Packit 1c1d7e
    if (og->isEnabled()) (og->*func)(p1,p2);                        \
Packit 1c1d7e
  }                                                                 \
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// three arguments
Packit 1c1d7e
#define FORALL3(a1,a2,a3,p1,p2,p3)                                        \
Packit 1c1d7e
void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3),a1,a2,a3) \
Packit 1c1d7e
{                                                                         \
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);                           \
Packit 1c1d7e
  OutputGenerator *og;                                                    \
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)                               \
Packit 1c1d7e
  {                                                                       \
Packit 1c1d7e
    if (og->isEnabled()) (og->*func)(p1,p2,p3);                           \
Packit 1c1d7e
  }                                                                       \
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// four arguments
Packit 1c1d7e
#define FORALL4(a1,a2,a3,a4,p1,p2,p3,p4)                                        \
Packit 1c1d7e
void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4),a1,a2,a3,a4) \
Packit 1c1d7e
{                                                                               \
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);                                 \
Packit 1c1d7e
  OutputGenerator *og;                                                          \
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)                                     \
Packit 1c1d7e
  {                                                                             \
Packit 1c1d7e
    if (og->isEnabled()) (og->*func)(p1,p2,p3,p4);                              \
Packit 1c1d7e
  }                                                                             \
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// five arguments
Packit 1c1d7e
#define FORALL5(a1,a2,a3,a4,a5,p1,p2,p3,p4,p5)                                        \
Packit 1c1d7e
void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5),a1,a2,a3,a4,a5) \
Packit 1c1d7e
{                                                                                     \
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);                                       \
Packit 1c1d7e
  OutputGenerator *og;                                                                \
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)                                           \
Packit 1c1d7e
  {                                                                                   \
Packit 1c1d7e
    if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5);                                 \
Packit 1c1d7e
  }                                                                                   \
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// six arguments
Packit 1c1d7e
#define FORALL6(a1,a2,a3,a4,a5,a6,p1,p2,p3,p4,p5,p6)                                  \
Packit 1c1d7e
void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5,a6),a1,a2,a3,a4,a5,a6) \
Packit 1c1d7e
{                                                                                     \
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);                                       \
Packit 1c1d7e
  OutputGenerator *og;                                                                \
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)                                           \
Packit 1c1d7e
  {                                                                                   \
Packit 1c1d7e
    if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5,p6);                              \
Packit 1c1d7e
  }                                                                                   \
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// seven arguments
Packit 1c1d7e
#define FORALL7(a1,a2,a3,a4,a5,a6,a7,p1,p2,p3,p4,p5,p6,p7)                      \
Packit 1c1d7e
void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5,a6,a7),a1,a2,a3,a4,a5,a6,a7) \
Packit 1c1d7e
{                                                                                     \
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);                                       \
Packit 1c1d7e
  OutputGenerator *og;                                                                \
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)                                           \
Packit 1c1d7e
  {                                                                                   \
Packit 1c1d7e
    if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5,p6,p7);                           \
Packit 1c1d7e
  }                                                                                   \
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
// eight arguments
Packit 1c1d7e
#define FORALL8(a1,a2,a3,a4,a5,a6,a7,a8,p1,p2,p3,p4,p5,p6,p7,p8)                      \
Packit 1c1d7e
void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5,a6,a7,a8),a1,a2,a3,a4,a5,a6,a7,a8) \
Packit 1c1d7e
{                                                                                     \
Packit 1c1d7e
  QListIterator<OutputGenerator> it(m_outputs);                                       \
Packit 1c1d7e
  OutputGenerator *og;                                                                \
Packit 1c1d7e
  for (it.toFirst();(og=it.current());++it)                                           \
Packit 1c1d7e
  {                                                                                   \
Packit 1c1d7e
    if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5,p6,p7,p8);                        \
Packit 1c1d7e
  }                                                                                   \
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// now instantiate only the ones we need.
Packit 1c1d7e
Packit 1c1d7e
FORALL1(const char *a1,a1)
Packit 1c1d7e
FORALL1(char a1,a1)
Packit 1c1d7e
FORALL1(int a1,a1)
Packit 1c1d7e
FORALL1(const DotClassGraph &a1,a1)
Packit 1c1d7e
FORALL1(const DotInclDepGraph &a1,a1)
Packit 1c1d7e
FORALL1(const DotCallGraph &a1,a1)
Packit 1c1d7e
FORALL1(const DotDirDeps &a1,a1)
Packit 1c1d7e
FORALL1(const DotGfxHierarchyTable &a1,a1)
Packit 1c1d7e
FORALL1(const DotGroupCollaboration &a1,a1)
Packit 1c1d7e
FORALL1(SectionTypes a1,a1)
Packit 1c1d7e
#if defined(HAS_BOOL_TYPE) || defined(Q_HAS_BOOL_TYPE)
Packit 1c1d7e
FORALL1(bool a1,a1)
Packit 1c1d7e
FORALL2(bool a1,int a2,a1,a2)
Packit 1c1d7e
FORALL2(bool a1,bool a2,a1,a2)
Packit 1c1d7e
FORALL2(const char *a1,bool a2,a1,a2)
Packit 1c1d7e
FORALL4(const char *a1,const char *a2,const char *a3,bool a4,a1,a2,a3,a4)
Packit 1c1d7e
#endif
Packit 1c1d7e
FORALL2(int a1,bool a2,a1,a2)
Packit 1c1d7e
FORALL2(bool a1,const char *a2,a1,a2)
Packit 1c1d7e
FORALL2(ParamListTypes a1,const char *a2,a1,a2)
Packit 1c1d7e
FORALL1(IndexSections a1,a1)
Packit 1c1d7e
FORALL2(const char *a1,const char *a2,a1,a2)
Packit 1c1d7e
FORALL2(const char *a1,int a2,a1,a2)
Packit 1c1d7e
FORALL2(const char *a1,SectionInfo::SectionType a2,a1,a2)
Packit 1c1d7e
FORALL3(bool a1,HighlightedItem a2,const char *a3,a1,a2,a3)
Packit 1c1d7e
FORALL3(bool a1,bool a2,bool a3,a1,a2,a3)
Packit 1c1d7e
FORALL3(const ClassDiagram &a1,const char *a2,const char *a3,a1,a2,a3)
Packit 1c1d7e
FORALL3(const char *a1,const char *a2,const char *a3,a1,a2,a3)
Packit 1c1d7e
FORALL3(const char *a1,const char *a2,bool a3,a1,a2,a3)
Packit 1c1d7e
FORALL3(const char *a1,int a2,const char *a3,a1,a2,a3)
Packit 1c1d7e
FORALL3(const char *a1,const char *a2,SectionInfo::SectionType a3,a1,a2,a3)
Packit 1c1d7e
FORALL3(uchar a1,uchar a2,uchar a3,a1,a2,a3)
Packit 1c1d7e
FORALL3(Definition *a1,const char *a2,bool a3,a1,a2,a3)
Packit 1c1d7e
FORALL4(SectionTypes a1,const char *a2,const char *a3,const char *a4,a1,a2,a3,a4)
Packit 1c1d7e
FORALL4(const char *a1,const char *a2,const char *a3,const char *a4,a1,a2,a3,a4)
Packit 1c1d7e
FORALL4(const char *a1,const char *a2,const char *a3,int a4,a1,a2,a3,a4)
Packit 1c1d7e
FORALL5(const char *a1,const char *a2,const char *a3,const char *a4,const char *a5,a1,a2,a3,a4,a5)
Packit 1c1d7e
FORALL5(const char *a1,const char *a2,const char *a3,const char *a4,bool a5,a1,a2,a3,a4,a5)
Packit 1c1d7e
FORALL6(const char *a1,const char *a2,const char *a3,const char *a4,const char *a5,const char *a6,a1,a2,a3,a4,a5,a6)
Packit 1c1d7e
FORALL6(const char *a1,const DocLinkInfo &a2,const char *a3,const char *a4,const SourceLinkInfo &a5,const SourceLinkInfo &a6,a1,a2,a3,a4,a5,a6)
Packit 1c1d7e
FORALL7(const char *a1,const char *a2,const char *a3,const char *a4,int a5,int a6,bool a7,a1,a2,a3,a4,a5,a6,a7)
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
//--------------------------------------------------------------------------