charmxi: factor out more loop-over-elements constructs
authorPhil Miller <mille121@illinois.edu>
Sun, 30 Sep 2012 19:11:27 +0000 (14:11 -0500)
committerPhil Miller <mille121@illinois.edu>
Sun, 30 Sep 2012 20:20:56 +0000 (15:20 -0500)
src/xlat-i/xi-symbol.C

index f2afe90704e397d380df3b2fe9723672d76e6f48..9024c1947fcb4490e86937e269f0e4fb0c2560f6 100644 (file)
@@ -167,6 +167,35 @@ void perElemGen(list<T*> &l, A* arg_, void (U::*fn_)(A*))
     perElemGenC<T, U, A*>(l, arg_, fn_, NULL);
 }
 
+/**
+   Apply fn_ on each non-NULL element in the list l.
+   If between_ is passed, do that between each element.
+ */
+template<typename T, typename U>
+class perElemC
+{
+    void (U::*fn)();
+public:
+    perElemC(list<T*> &l,
+              void (U::*fn_)())
+       : fn(fn_)
+       {
+           for_each(l.begin(), l.end(), *this);
+       }
+    void operator()(T* m)
+       {
+           if (m) {
+               (m->*fn)();
+           }
+       }
+};
+
+template<typename T, typename U>
+void perElem(list<T*> &l, void (U::*fn_)())
+{
+    perElemC<T, U>(l, fn_);
+}
+
 void newLine(XStr &str)
 {
     str << endx;
@@ -630,15 +659,13 @@ ModuleList::print(XStr& str)
 void
 ModuleList::generate()
 {
-    for (list<Module*>::iterator i = modules.begin(); i != modules.end(); ++i)
-       (*i)->generate();
+  perElem(modules, &Module::generate);
 }
 
 void
 ModuleList::preprocess()
 {
-    for (list<Module*>::iterator i = modules.begin(); i != modules.end(); ++i)
-       (*i)->preprocess();
+  perElem(modules, &Module::preprocess);
 }
 
 void
@@ -704,10 +731,7 @@ ConstructList::genReg(XStr& str)
 void
 ConstructList::preprocess()
 {
-    for (list<Construct*>::iterator i = constructs.begin(); 
-        i != constructs.end(); ++i)
-       if (*i)
-           (*i)->preprocess();
+  perElem(constructs, &Construct::preprocess);
 }
 
 XStr Chare::proxyName(int withTemplates)
@@ -2666,9 +2690,7 @@ void MemberList::genReg(XStr& str)
 
 void MemberList::preprocess()
 {
-    for (list<Member*>::iterator i = members.begin(); i != members.end(); ++i)
-       if (*i)
-           (*i)->preprocess();
+  perElem(members, &Member::preprocess);
 }
 
 void MemberList::lookforCEntry(CEntry *centry)