Compiler bug workaround: remove CkVec's pup routine,
authorOrion Lawlor <olawlor@acm.org>
Fri, 21 Feb 2003 19:18:45 +0000 (19:18 +0000)
committerOrion Lawlor <olawlor@acm.org>
Fri, 21 Feb 2003 19:18:45 +0000 (19:18 +0000)
because some instantiations of CkVec can't be pupped.
Instead, we provide CkVec's pup routine as operator|,
which is lazily instantiated.  Of course, according to
the C++ standard, *all* templated members are supposed
to be lazily instantiated, but some compilers (SGI origin,
Alpha cxx) don't do this.

src/util/cklists.h

index 9358830fe1314b8e428f939a5bb51e292daaa5ba..9f63a73998b4271178087f39e61e43aef69655a1 100644 (file)
@@ -174,8 +174,7 @@ class CkVec : private CkSTLHelper<T> {
     void push_back(const T &elt) {insert(length(),elt);}
     int size(void) const {return len;}
  
-//PUP routine:
-  protected:
+//PUP routine help:
     //Only pup the length of this vector, which is returned:
     int pupbase(PUP::er &p) {
        int l=len;
@@ -183,14 +182,15 @@ class CkVec : private CkSTLHelper<T> {
        if (p.isUnpacking()) { setSize(l); len=l;}
        return l;
     }
-  public:
-    void pup(PUP::er &p) {
-       int l=pupbase(p);
-       for (int i=0;i<l;i++) p|block[i];
-    }
-    friend void operator|(PUP::er &p,this_type &v) {v.pup(p);}
 };
 
+/// Default pup routine for CkVec: pup each of the elements
+template <class T>
+void operator|(PUP::er &p,CkVec<T> &vec) {
+    int l=vec.pupbase(p);
+    for (int i=0;i<l;i++) p|vec[i];
+}
+
 
 ///A vector of basic types, which can be pupped as an array
 /// (more restricted, but more efficient version of CkVec)
@@ -295,6 +295,10 @@ class CkPupPtrVec : public CkVec< CkZeroPtr<T, PUP_PTR> >,
                for (int i=0;i<length();i++)
                        operator[] (i).destroy();
        }
+       void pup(PUP::er &p) {
+               int l=pupbase(p);
+               for (int i=0;i<length();i++) p|operator[] (i);
+       }
        friend void operator|(PUP::er &p,this_type &v) {v.pup(p);}
 };
 
@@ -311,6 +315,10 @@ class CkPupAblePtrVec : public CkVec< CkZeroPtr<T, CkPupAblePtr<T> > >,
                for (int i=0;i<length();i++)
                        operator[] (i).destroy();
        }
+       void pup(PUP::er &p) {
+               int l=pupbase(p);
+               for (int i=0;i<length();i++) p|operator[] (i);
+       }
        friend void operator|(PUP::er &p,this_type &v) {v.pup(p);}
 };