summaryrefslogtreecommitdiffstats
path: root/src/outputlist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/outputlist.cpp')
-rw-r--r--src/outputlist.cpp239
1 files changed, 239 insertions, 0 deletions
diff --git a/src/outputlist.cpp b/src/outputlist.cpp
new file mode 100644
index 0000000..daa83ed
--- /dev/null
+++ b/src/outputlist.cpp
@@ -0,0 +1,239 @@
+/******************************************************************************
+ *
+ * $Id$
+ *
+ * Copyright (C) 1997-1999 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.
+ *
+ * All output generated with Doxygen is not covered 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"
+
+OutputList::OutputList(bool)
+{
+ //printf("OutputList::OutputList()\n");
+ outputs = new QList<OutputGenerator>;
+ outputs->setAutoDelete(TRUE);
+}
+
+OutputList::OutputList(const OutputList *olist)
+{
+ //printf("OutputList::OutputList() deep copy\n");
+ outputs = new QList<OutputGenerator>;
+ outputs->setAutoDelete(TRUE);
+
+ QList<OutputGenerator> *ol=olist->outputs;
+ OutputGenerator *og=ol->first();
+ while (og)
+ {
+ OutputGenerator *ogc=og->copy();
+ outputs->append(ogc);
+ if (og->isEnabled()) ogc->enable(); else ogc->disable();
+ og=ol->next();
+ }
+ //printf("OutputList::OutputList dst=%d res=%d\n",ol->count(),outputs->count());
+}
+
+OutputList::~OutputList()
+{
+ delete outputs;
+}
+
+OutputList &OutputList::operator=(const OutputList &olist)
+{
+ if (this!=&olist)
+ {
+ QList<OutputGenerator> *ol=olist.outputs;
+ OutputGenerator *ogsrc=ol->first();
+ OutputGenerator *ogdst=outputs->first();
+ //printf("OutputList::operator= src=%d dst=%d\n",outputs->count(),ol->count());
+ while (ogdst)
+ {
+ ogdst=ogsrc->copy();
+ ogsrc=ol->next();
+ ogdst=outputs->next();
+ }
+ }
+ return *this;
+}
+
+void OutputList::add(const OutputGenerator *og)
+{
+ if (og) outputs->append(og);
+}
+
+//HtmlGenerator *OutputList::getHtmlGenerator()
+//{
+// OutputGenerator *og=outputs->first();
+// while (og)
+// {
+// if (og->get(OutputGenerator::Html)) return (HtmlGenerator *)og;
+// og=outputs->next();
+// }
+// return 0; // should not happen!
+//}
+
+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::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;
+}
+
+OutputList &OutputList::operator+=(const OutputList &outputList)
+{
+ OutputList *ol=(OutputList *)&outputList;
+ OutputGenerator *ogsrc=ol->outputs->first();
+ OutputGenerator *ogdst=outputs->first();
+ //printf("OutputList::operator+= src=%d dst=%d\n",outputs->count(),ol->outputs->count());
+ while (ogdst && ogsrc)
+ {
+ ogdst->append(ogsrc);
+ ogsrc=ol->outputs->next();
+ ogdst=outputs->next();
+ }
+ return *this;
+}
+
+//--------------------------------------------------------------------------
+// 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(); \
+ } \
+}
+
+// now instantiate only the ones we need.
+
+FORALL1(const char *a1,a1)
+FORALL1(char a1,a1)
+FORALL1(int a1,a1)
+FORALL1(IndexSections a1,a1)
+FORALL2(const char *a1,const char *a2,a1,a2)
+FORALL2(int a1,bool a2,a1,a2)
+FORALL3(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(uchar a1,uchar a2,uchar a3,a1,a2,a3)
+FORALL4(const char *a1,const char *a2,const char *a3,const char *a4,a1,a2,a3,a4)
+
+
+//--------------------------------------------------------------------------