Sections #1967: cleanup API by taking section creation args as std::vector's 87/4487/14
authorSam White <white67@illinois.edu>
Fri, 17 Aug 2018 21:40:41 +0000 (16:40 -0500)
committerSam White <white67@illinois.edu>
Tue, 21 Aug 2018 18:55:15 +0000 (13:55 -0500)
Also replace internal storage of section objects with std::vector's, and
update the documentation and examples to match.

Define a macro CMK_CKSECTIONINFO_STL now for applications to check.

Change-Id: I0ee0dcf70f62528cc7b2cd06f3881e5409296966

doc/charm++/sections.tex
examples/charm++/hello/xarraySection/hello.C
src/ck-core/charm++.h
src/ck-core/ck.C
src/ck-core/ckarray.C
src/ck-core/ckarray.h
src/ck-core/ckcallback.C
src/ck-core/ckmulticast.C
src/ck-core/cksection.h
src/scripts/configure.ac
src/xlat-i/xi-Chare.C

index 29d718cb93741bd9c7286fb15bceba2be2bb7ec6..0cc542f2da0fc3e291e4c2c0e9538ee13ba332a9 100644 (file)
@@ -31,12 +31,12 @@ of all the array section members through either explicit enumeration, or an inde
 For example, for a 3D array:
 
 \begin{alltt}
-  CkVec<CkArrayIndex3D> elems;    // add array indices
+  std::vector<CkArrayIndex3D> elems;  // add array indices
   for (int i=0; i<10; i++)
     for (int j=0; j<20; j+=2)
       for (int k=0; k<30; k+=2)
-         elems.push_back(CkArrayIndex3D(i, j, k));
-  CProxySection_Hello proxy = CProxySection_Hello::ckNew(helloArrayID, elems.getVec(), elems.size());
+         elems.emplace_back(i, j, k);
+  CProxySection_Hello proxy = CProxySection_Hello::ckNew(helloArrayID, elems);
 \end{alltt}
 
 Alternatively, one can do the same thing by providing the index range [lbound:ubound:stride]
@@ -53,9 +53,8 @@ For user-defined array index other than CkArrayIndex1D to CkArrayIndex6D,
 one needs to use the generic array index type: CkArrayIndex.
 
 \begin{alltt}
-  CkArrayIndex *elems;    // add array indices
-  int numElems;
-  CProxySection_Hello proxy = CProxySection_Hello::ckNew(helloArrayID, elems, numElems);
+  std::vector<CkArrayIndex> elems;  // add array indices
+  CProxySection_Hello proxy = CProxySection_Hello::ckNew(helloArrayID, elems);
 \end{alltt}
 
 \subsection{Group sections}
@@ -246,12 +245,11 @@ Note: cross section logic also works for groups with analogous characteristics.
 Given three arrays declared thusly:
 
 \begin{alltt}
-         CkArrayID *aidArr= new CkArrayID[3];
-         CProxy\_multisectiontest\_array1d *Aproxy= new CProxy\_multisectiontest\_array1d[3];
-         for(int i=0;i<3;i++)
+         std::vector<CkArrayID> aidArr(3);
+         for (int i=0; i<3; i++)
            \{
-             Aproxy[i]=CProxy\_multisectiontest\_array1d::ckNew(masterproxy.ckGetGroupID(),ArraySize);   
-             aidArr[i]=Aproxy[i].ckGetArrayID();
+             CProxy\_multisectiontest\_array1d Aproxy = CProxy\_multisectiontest\_array1d::ckNew(masterproxy.ckGetGroupID(), ArraySize);
+             aidArr[i] = Aproxy.ckGetArrayID();
            \}
 \end{alltt}
 
@@ -259,23 +257,19 @@ One can make a section including the  lower half elements of all three
 arrays as follows:
 
 \begin{alltt}
-         int aboundary=ArraySize/2;
-         int afloor=aboundary;
-         int aceiling=ArraySize-1;
-         int asectionSize=aceiling-afloor+1;
+         int aboundary = ArraySize/2;
+         int afloor = aboundary;
+         int aceiling = ArraySize-1;
+         int asectionSize = aceiling-afloor+1;
          // cross section lower half of each array
-         CkArrayIndex **aelems= new CkArrayIndex*[3];
-         aelems[0]= new CkArrayIndex[asectionSize];
-         aelems[1]= new CkArrayIndex[asectionSize];
-         aelems[2]= new CkArrayIndex[asectionSize];
-         int *naelems=new int[3];
-         for(int k=0;k<3;k++)
+         std::vector<std::vector<CkArrayIndex> > aelems(3);
+         for (int k=0; k<3; k++)
            \{
-             naelems[k]=asectionSize;
-             for(int i=afloor,j=0;i<=aceiling;i++,j++)
-               aelems[k][j]=CkArrayIndex1D(i);
+             aelems[k].resize(asectionSize);
+             for (int i=afloor,j=0; i<=aceiling; i++,j++)
+               aelems[k][j] = CkArrayIndex1D(i);
            \}
-         CProxySection\_multisectiontest\_array1d arrayLowProxy(3,aidArr,aelems,naelems);
+         CProxySection\_multisectiontest\_array1d arrayLowProxy(aidArr, aelems);
 \end{alltt}
 
 The resulting cross section proxy, as in the example \uw{arrayLowProxy},
index 0742ac23871c017e8dd1c40d9a7541dc917a2aa3..21cc5f94dfb9aa08b2ce05f140dc877d4529b6c3 100644 (file)
@@ -42,27 +42,23 @@ public:
     int afloor = 0, aceiling = sectionSize-1;
 
     // Allocate space
-    std::vector<CProxy_Hello> arrayOfArrays(numArrays);
     std::vector<CkArrayID> arrID(numArrays);
-    std::vector<int> nelems(numArrays);
-    std::vector<CkArrayIndex *> elems(numArrays);
+    std::vector<std::vector<CkArrayIndex> > elems(numArrays);
 
     // Create a list of array section members
     for(int k=0; k < numArrays; k++)
     {
         // Create the array
-        arrayOfArrays[k] = CProxy_Hello::ckNew(k, mcastMgrGID, numElements);
+        CProxy_Hello array = CProxy_Hello::ckNew(k, mcastMgrGID, numElements);
         // Store the AID
-        arrID[k]  = arrayOfArrays[k].ckGetArrayID();
+        arrID[k]  = array.ckGetArrayID();
         // Create a list of section member indices in this array
-        nelems[k] = sectionSize;
-        elems[k]  = new CkArrayIndex[sectionSize];
+        elems[k].resize(sectionSize);
         for(int i=afloor,j=0; i <= aceiling; i++,j++)
             elems[k][j] = CkArrayIndex1D(i);
     }
     // Create the x-array-section
-    sectionProxy = CProxySection_Hello(numArrays, arrID.data(), elems.data(), nelems.data());
-    for (auto elem : elems) delete [] elem;
+    sectionProxy = CProxySection_Hello(arrID, elems);
 
     // Delegate the section comm to the CkMulticast library
     sectionProxy.ckSectionDelegate(mcastMgr);
index cabd8fa771367d680bb84aa94e51ec20fb9dd058..c5ce5f6e11b70fc0e33d4e797650a8614819277a 100644 (file)
@@ -1010,10 +1010,10 @@ public:
   inline CkSectionID &ckGetSectionID() {return _sid[0]; }
   inline CkSectionID &ckGetSectionID(int i) {return _sid[i]; }
   inline CkGroupID ckGetGroupIDn(int i) const {return _sid[i]._cookie.get_aid();}
-  inline int *ckGetElements() const {return _sid[0].pelist;}
-  inline int *ckGetElements(int i) const {return _sid[i].pelist;}
-  inline int ckGetNumElements() const { return _sid[0].npes; }
-  inline int ckGetNumElements(int i) const { return _sid[i].npes; }
+  inline int *ckGetElements() const {return _sid[0].pelist.data();}
+  inline int *ckGetElements(int i) const {return _sid[i].pelist.data();}
+  inline int ckGetNumElements() const { return _sid[0].pelist.size(); }
+  inline int ckGetNumElements(int i) const { return _sid[i].pelist.size(); }
   inline int ckGetBfactor() const { return _sid[0].bfactor; }
   void pup(PUP::er &p) {
     CProxy_Group::pup(p);
index 0753d6708e1fbeb3a5c3349f467d7bd8a004c08c..36943e16cc56dfbe7923231a2917b526b9e53ec1 100644 (file)
@@ -256,13 +256,13 @@ void CkDelegateMgr::GroupSend(CkDelegateData *pd,int ep,void *m,int onPE,CkGroup
 void CkDelegateMgr::GroupBroadcast(CkDelegateData *pd,int ep,void *m,CkGroupID g)
   { CkBroadcastMsgBranch(ep,m,g); }
 void CkDelegateMgr::GroupSectionSend(CkDelegateData *pd,int ep,void *m,int nsid,CkSectionID *s)
-  { CkSendMsgBranchMulti(ep,m,s->_cookie.get_aid(),s->npes,s->pelist); }
+  { CkSendMsgBranchMulti(ep,m,s->_cookie.get_aid(),s->pelist.size(),s->pelist.data()); }
 void CkDelegateMgr::NodeGroupSend(CkDelegateData *pd,int ep,void *m,int onNode,CkNodeGroupID g)
   { CkSendMsgNodeBranch(ep,m,onNode,g); }
 void CkDelegateMgr::NodeGroupBroadcast(CkDelegateData *pd,int ep,void *m,CkNodeGroupID g)
   { CkBroadcastMsgNodeBranch(ep,m,g); }
 void CkDelegateMgr::NodeGroupSectionSend(CkDelegateData *pd,int ep,void *m,int nsid,CkSectionID *s)
-  { CkSendMsgNodeBranchMulti(ep,m,s->_cookie.get_aid(),s->npes,s->pelist); }
+  { CkSendMsgNodeBranchMulti(ep,m,s->_cookie.get_aid(),s->pelist.size(),s->pelist.data()); }
 void CkDelegateMgr::ArrayCreate(CkDelegateData *pd,int ep,void *m,const CkArrayIndex &idx,int onPE,CkArrayID a)
 {
        CProxyElement_ArrayBase ap(a,idx);
@@ -402,14 +402,19 @@ void CProxy::pup(PUP::er &p) {
 
 /**** Array sections */
 #define CKSECTIONID_CONSTRUCTOR_DEF(index) \
-CkSectionID::CkSectionID(const CkArrayID &aid, const CkArrayIndex##index *elems, const int nElems, int factor): _nElems(nElems), bfactor(factor) { \
+CkSectionID::CkSectionID(const CkArrayID &aid, const CkArrayIndex##index *elems, const int nElems, int factor): bfactor(factor) { \
+  _elems.assign(elems, elems+nElems);  \
   _cookie.get_aid() = aid;     \
   _cookie.get_pe() = CkMyPe(); \
-  _elems = new CkArrayIndex[nElems];   \
-  for (int i=0; i<nElems; i++) _elems[i] = elems[i];   \
-  pelist = NULL;       \
-  npes  = 0;   \
-}
+} \
+CkSectionID::CkSectionID(const CkArrayID &aid, const std::vector<CkArrayIndex##index> &elems, int factor): bfactor(factor) { \
+  _elems.resize(elems.size()); \
+  for (int i=0; i<_elems.size(); ++i) { \
+    _elems[i] = static_cast<CkArrayIndex>(elems[i]); \
+  } \
+  _cookie.get_aid() = aid;     \
+  _cookie.get_pe() = CkMyPe(); \
+} \
 
 CKSECTIONID_CONSTRUCTOR_DEF(1D)
 CKSECTIONID_CONSTRUCTOR_DEF(2D)
@@ -419,60 +424,34 @@ CKSECTIONID_CONSTRUCTOR_DEF(5D)
 CKSECTIONID_CONSTRUCTOR_DEF(6D)
 CKSECTIONID_CONSTRUCTOR_DEF(Max)
 
-CkSectionID::CkSectionID(const CkGroupID &gid, const int *_pelist, const int _npes, int factor): _nElems(0), _elems(NULL), npes(_npes), bfactor(factor) {
-  pelist = new int[npes];
-  for (int i=0; i<npes; i++) pelist[i] = _pelist[i];
+CkSectionID::CkSectionID(const CkGroupID &gid, const int *_pelist, const int _npes, int factor): bfactor(factor) {
+  _cookie.get_aid() = gid;
+  pelist.assign(_pelist, _pelist+_npes);
+}
+
+CkSectionID::CkSectionID(const CkGroupID &gid, const std::vector<int>& _pelist, int factor): pelist(_pelist), bfactor(factor) {
   _cookie.get_aid() = gid;
 }
 
 CkSectionID::CkSectionID(const CkSectionID &sid) {
-  int i;
   _cookie = sid._cookie;
-  _nElems = sid._nElems;
+  pelist = sid.pelist;
+  _elems = sid._elems;
   bfactor = sid.bfactor;
-  if (_nElems > 0) {
-    _elems = new CkArrayIndex[_nElems];
-    for (i=0; i<_nElems; i++) _elems[i] = sid._elems[i];
-  } else _elems = NULL;
-  npes = sid.npes;
-  if (npes > 0) {
-    pelist = new int[npes];
-    for (i=0; i<npes; ++i) pelist[i] = sid.pelist[i];
-  } else pelist = NULL;
 }
 
 void CkSectionID::operator=(const CkSectionID &sid) {
-  int i;
   _cookie = sid._cookie;
-  _nElems = sid._nElems;
+  pelist = sid.pelist;
+  _elems = sid._elems;
   bfactor = sid.bfactor;
-  if (_nElems > 0) {
-    _elems = new CkArrayIndex[_nElems];
-    for (i=0; i<_nElems; i++) _elems[i] = sid._elems[i];
-  } else _elems = NULL;
-  npes = sid.npes;
-  if (npes > 0) {
-    pelist = new int[npes];
-    for (i=0; i<npes; ++i) pelist[i] = sid.pelist[i];
-  } else pelist = NULL;
 }
 
 void CkSectionID::pup(PUP::er &p) {
-    p | _cookie;
-    p | bfactor;
-    p(_nElems);
-    if (_nElems > 0) {
-      if (p.isUnpacking()) _elems = new CkArrayIndex[_nElems];
-      for (int i=0; i< _nElems; i++) p | _elems[i];
-      npes = 0;
-      pelist = NULL;
-    } else {
-      // If _nElems is zero, than this section describes processors instead of array elements
-      _elems = NULL;
-      p(npes);
-      if (p.isUnpacking()) pelist = new int[npes];
-      p(pelist, npes);
-    }
+  p | _cookie;
+  p | pelist;
+  p | _elems;
+  p | bfactor;
 }
 
 /**** Tiny random API routines */
index 5654ae4fed980bdb4458a19bfde7a5adcd51c4d0..a2ff81c8aa9820bf0989a4014dc33eb166779ce4 100644 (file)
@@ -551,24 +551,33 @@ CProxyElement_ArrayBase::CProxyElement_ArrayBase(const ArrayElement *e)
        :CProxy_ArrayBase(e), _idx(e->ckGetArrayIndex())
        {}
 
-CProxySection_ArrayBase::CProxySection_ArrayBase(const CkArrayID &aid, const CkArrayIndex *elems, const int nElems, int factor) :CProxy_ArrayBase(aid), _nsid(1) {
-    _sid = new CkSectionID(aid, elems, nElems, factor);
+CProxySection_ArrayBase::CProxySection_ArrayBase(const CkArrayID &aid, const CkArrayIndex *elems, const int nElems, int factor) :CProxy_ArrayBase(aid) {
+    _sid.emplace_back(aid, elems, nElems, factor);
 }
 
+CProxySection_ArrayBase::CProxySection_ArrayBase(const CkArrayID &aid, const std::vector<CkArrayIndex> &elems, int factor) :CProxy_ArrayBase(aid) {
+    _sid.emplace_back(aid, elems, factor);
+}
 
-CProxySection_ArrayBase::CProxySection_ArrayBase(const int n, const CkArrayID *aid, CkArrayIndex const * const *elems, const int *nElems, int factor) :CProxy_ArrayBase(aid[0]), _nsid(n) {
-    if (_nsid == 1) _sid = new CkSectionID(aid[0], elems[0], nElems[0], factor);
-    else if (_nsid > 1) {
-    _sid = new CkSectionID[n];
-    for (int i=0; i<n; ++i) _sid[i] = CkSectionID(aid[i], elems[i], nElems[i], factor);
-    } else _sid = NULL;
+CProxySection_ArrayBase::CProxySection_ArrayBase(const int n, const CkArrayID *aid, CkArrayIndex const * const *elems, const int *nElems, int factor) :CProxy_ArrayBase(aid[0]) {
+    _sid.resize(n);
+    for (int i=0; i<_sid.size(); i++) {
+      _sid[i] = CkSectionID(aid[i], elems[i], nElems[i], factor);
+    }
+}
+
+CProxySection_ArrayBase::CProxySection_ArrayBase(const std::vector<CkArrayID> &aid, const std::vector<std::vector<CkArrayIndex> > &elems, int factor) :CProxy_ArrayBase(aid[0]) {
+    _sid.resize(aid.size());
+    for (int i=0; i<_sid.size(); i++) {
+      _sid[i] = CkSectionID(aid[i], elems[i], factor);
+    }
 }
 
 
 void CProxySection_ArrayBase::ckAutoDelegate(int opts){
-    if(_nsid < 1)
+    if(_sid.empty())
       CmiAbort("Auto Delegation before setting up CkSectionID\n");
-    CkArray *ckarr = CProxy_CkArray(_sid->get_aid()).ckLocalBranch();
+    CkArray *ckarr = CProxy_CkArray(_sid[0].get_aid()).ckLocalBranch();
     if(ckarr->isSectionAutoDelegated()){
        CkMulticastMgr *mCastGrp = CProxy_CkMulticastMgr(ckarr->getmCastMgr()).ckLocalBranch();
        ckSectionDelegate(mCastGrp, opts);
@@ -577,9 +586,9 @@ void CProxySection_ArrayBase::ckAutoDelegate(int opts){
 
 
 void CProxySection_ArrayBase::setReductionClient(CkCallback *cb) {
-    if(_nsid < 1)
+    if(_sid.empty())
       CmiAbort("setReductionClient before setting up CkSectionID\n");
-    CkArray *ckarr = CProxy_CkArray(_sid->get_aid()).ckLocalBranch();
+    CkArray *ckarr = CProxy_CkArray(_sid[0].get_aid()).ckLocalBranch();
     if(ckarr->isSectionAutoDelegated()){
       CkMulticastMgr *mCastGrp = CProxy_CkMulticastMgr(ckarr->getmCastMgr()).ckLocalBranch();
       mCastGrp->setReductionClient(*this, cb);
@@ -591,9 +600,9 @@ void CProxySection_ArrayBase::setReductionClient(CkCallback *cb) {
 
 
 void CProxySection_ArrayBase::resetSection(){
-    if(_nsid < 1)
+    if(_sid.empty())
       CmiAbort("resetSection before setting up CkSectionID\n");
-    CkArray *ckarr = CProxy_CkArray(_sid->get_aid()).ckLocalBranch();
+    CkArray *ckarr = CProxy_CkArray(_sid[0].get_aid()).ckLocalBranch();
     if(ckarr->isSectionAutoDelegated()){
       CkMulticastMgr *mCastGrp = CProxy_CkMulticastMgr(ckarr->getmCastMgr()).ckLocalBranch();
       mCastGrp->resetSection(*this);
@@ -742,13 +751,7 @@ void CProxyElement_ArrayBase::pup(PUP::er &p)
 void CProxySection_ArrayBase::pup(PUP::er &p)
 {
   CProxy_ArrayBase::pup(p);
-  p | _nsid;
-  if (p.isUnpacking()) {
-    if (_nsid == 1) _sid = new CkSectionID;
-    else if (_nsid > 1) _sid = new CkSectionID[_nsid];
-    else _sid = NULL;
-  }
-  for (int i=0; i<_nsid; ++i) _sid[i].pup(p);
+  p | _sid;
 }
 
 /*
@@ -1207,18 +1210,18 @@ void CkBroadcastMsgSection(int entryIndex, void *msg, CkSectionID sID, int opts
 void CProxySection_ArrayBase::ckSend(CkArrayMessage *msg, int ep, int opts)
 {
        if (ckIsDelegated()) //Just call our delegateMgr
-         ckDelegatedTo()->ArraySectionSend(ckDelegatedPtr(), ep, msg, _nsid, _sid, opts);
+         ckDelegatedTo()->ArraySectionSend(ckDelegatedPtr(), ep, msg, _sid.size(), _sid.data(), opts);
        else {
          // send through all
-         for (int k=0; k<_nsid; ++k) {
-           for (int i=0; i< _sid[k]._nElems-1; i++) {
+         for (int k=0; k<_sid.size(); ++k) {
+           for (int i=0; i< _sid[k]._elems.size()-1; i++) {
              CProxyElement_ArrayBase ap(_sid[k]._cookie.get_aid(), _sid[k]._elems[i]);
              void *newMsg=CkCopyMsg((void **)&msg);
              ap.ckSend((CkArrayMessage *)newMsg,ep,opts);
            }
-           if (_sid[k]._nElems > 0) {
-             void *newMsg= (k<_nsid-1) ? CkCopyMsg((void **)&msg) : msg;
-             CProxyElement_ArrayBase ap(_sid[k]._cookie.get_aid(), _sid[k]._elems[_sid[k]._nElems-1]);
+           if (!_sid[k]._elems.empty()) {
+             void *newMsg= (k<_sid.size()-1) ? CkCopyMsg((void **)&msg) : msg;
+             CProxyElement_ArrayBase ap(_sid[k]._cookie.get_aid(), _sid[k]._elems[_sid[k]._elems.size()-1]);
              ap.ckSend((CkArrayMessage *)newMsg,ep,opts);
            }
          }
index bd00af1bcc88ec38292d93faea0d2967dec41162..864b97249d9f82621824ca31889953542f0d400c 100644 (file)
@@ -186,58 +186,62 @@ PUPmarshall(CProxyElement_ArrayBase)
 
 class CProxySection_ArrayBase:public CProxy_ArrayBase {
 private:
-       int _nsid;
-       CkSectionID *_sid;
+  std::vector<CkSectionID> _sid;
 public:
-       CProxySection_ArrayBase(): _nsid(0), _sid(NULL) {}
+       CProxySection_ArrayBase() =default;
        CProxySection_ArrayBase(const CkArrayID &aid,
                const CkArrayIndex *elems, const int nElems, int factor=USE_DEFAULT_BRANCH_FACTOR);
+       CProxySection_ArrayBase(const CkArrayID &aid,
+               const std::vector<CkArrayIndex> &elems, int factor=USE_DEFAULT_BRANCH_FACTOR);
        CProxySection_ArrayBase(const CkArrayID &aid,
                const CkArrayIndex *elems, const int nElems, CK_DELCTOR_PARAM)
-               :CProxy_ArrayBase(aid,CK_DELCTOR_ARGS), _nsid(1) { _sid = new CkSectionID(aid, elems, nElems); }
+               :CProxy_ArrayBase(aid,CK_DELCTOR_ARGS) { _sid.emplace_back(aid, elems, nElems); }
+       CProxySection_ArrayBase(const CkArrayID &aid,
+               const std::vector<CkArrayIndex> &elems, CK_DELCTOR_PARAM)
+               :CProxy_ArrayBase(aid,CK_DELCTOR_ARGS) { _sid.emplace_back(aid, elems); }
        CProxySection_ArrayBase(const CkSectionID &sid)
-               :CProxy_ArrayBase(sid._cookie.get_aid()), _nsid(1) { _sid = new CkSectionID(sid); }
+               :CProxy_ArrayBase(sid._cookie.get_aid()) { _sid.emplace_back(sid); }
        CProxySection_ArrayBase(const CkSectionID &sid, CK_DELCTOR_PARAM)
-               :CProxy_ArrayBase(sid._cookie.get_aid(), CK_DELCTOR_ARGS), _nsid(1) { _sid = new CkSectionID(sid); }
+               :CProxy_ArrayBase(sid._cookie.get_aid(), CK_DELCTOR_ARGS) { _sid.emplace_back(sid); }
         CProxySection_ArrayBase(const CProxySection_ArrayBase &cs)
-               :CProxy_ArrayBase(cs), _nsid(cs._nsid) {
-      if (_nsid == 1) _sid = new CkSectionID(*cs._sid);
-      else if (_nsid > 1) {
-        _sid = new CkSectionID[_nsid];
-        for (int i=0; i<_nsid; ++i) _sid[i] = cs._sid[i];
-      } else _sid = NULL;
+               :CProxy_ArrayBase(cs) {
+        _sid.resize(cs._sid.size());
+        for (int i=0; i<_sid.size(); ++i) {
+          _sid[i] = cs._sid[i];
+        }
     }
         CProxySection_ArrayBase(const CProxySection_ArrayBase &cs, CK_DELCTOR_PARAM)
-               :CProxy_ArrayBase(cs.ckGetArrayID(),CK_DELCTOR_ARGS), _nsid(cs._nsid) {
-      if (_nsid == 1) _sid = new CkSectionID(cs.ckGetArrayID(), cs.ckGetArrayElements(), cs.ckGetNumElements());
-      else if (_nsid > 1) {
-        _sid = new CkSectionID[_nsid];
-        for (int i=0; i<_nsid; ++i) _sid[i] = cs._sid[i];
-      } else _sid = NULL;
+               :CProxy_ArrayBase(cs.ckGetArrayID(),CK_DELCTOR_ARGS) {
+        _sid.resize(cs._sid.size());
+        for (int i=0; i<_sid.size(); ++i) {
+          _sid[i] = cs._sid[i];
+        }
     }
     CProxySection_ArrayBase(const int n, const CkArrayID *aid, CkArrayIndex const * const *elems, const int *nElems, int factor=USE_DEFAULT_BRANCH_FACTOR);
+    CProxySection_ArrayBase(const std::vector<CkArrayID> &aid, const std::vector<std::vector<CkArrayIndex> > &elems, int factor=USE_DEFAULT_BRANCH_FACTOR);
     CProxySection_ArrayBase(const int n, const CkArrayID *aid, CkArrayIndex const * const *elems, const int *nElems,CK_DELCTOR_PARAM)
-        :CProxy_ArrayBase(aid[0],CK_DELCTOR_ARGS), _nsid(n) {
-      if (_nsid == 1) _sid = new CkSectionID(aid[0], elems[0], nElems[0]);
-      else if (_nsid > 1) {
-      _sid = new CkSectionID[n];
-      for (int i=0; i<n; ++i) _sid[i] = CkSectionID(aid[i], elems[i], nElems[i]);
-      } else _sid = NULL;
+        :CProxy_ArrayBase(aid[0],CK_DELCTOR_ARGS) {
+        _sid.resize(n);
+        for (int i=0; i<_sid.size(); ++i) {
+          _sid[i] = CkSectionID(aid[i], elems[i], nElems[i]);
+        }
     }
-
-    ~CProxySection_ArrayBase() {
-      if (_nsid == 1) delete _sid;
-      else if (_nsid > 1) delete[] _sid;
+    CProxySection_ArrayBase(const std::vector<CkArrayID> &aid, const std::vector<std::vector<CkArrayIndex> > &elems, CK_DELCTOR_PARAM)
+        :CProxy_ArrayBase(aid[0],CK_DELCTOR_ARGS) {
+        _sid.resize(aid.size());
+        for (int i=0; i<_sid.size(); ++i) {
+          _sid[i] = CkSectionID(aid[i], elems[i]);
+        }
     }
 
+    ~CProxySection_ArrayBase() =default;
+
     CProxySection_ArrayBase &operator=(const CProxySection_ArrayBase &cs) {
       CProxy_ArrayBase::operator=(cs);
-      _nsid = cs._nsid;
-      if (_nsid == 1) _sid = new CkSectionID(*cs._sid);
-      else if (_nsid > 1) {
-        _sid = new CkSectionID[_nsid];
-        for (int i=0; i<_nsid; ++i) _sid[i] = cs._sid[i];
-      } else _sid = NULL;
+      _sid.resize(cs._sid.size());
+      for (int i=0; i<_sid.size(); ++i) {
+        _sid[i] = cs._sid[i];
+      }
       return *this;
     }
     
@@ -255,16 +259,16 @@ public:
        void ckSend(CkArrayMessage *m, int ep, int opts = 0) ;
 
 //     ArrayElement *ckLocal(void) const;
-    inline int ckGetNumSubSections() const { return _nsid; }
-       inline CkSectionInfo &ckGetSectionInfo() {return _sid->_cookie;}
-       inline CkSectionID *ckGetSectionIDs() {return _sid;}
+    inline int ckGetNumSubSections() const { return _sid.size(); }
+       inline CkSectionInfo &ckGetSectionInfo() {return _sid[0]._cookie;}
+       inline CkSectionID *ckGetSectionIDs() {return _sid.data();}
        inline CkSectionID &ckGetSectionID() {return _sid[0];}
        inline CkSectionID &ckGetSectionID(int i) {return _sid[i];}
        inline CkArrayID ckGetArrayIDn(int i) const {return _sid[i]._cookie.get_aid();}
-    inline CkArrayIndex *ckGetArrayElements() const {return _sid[0]._elems;}
-    inline CkArrayIndex *ckGetArrayElements(int i) const {return _sid[i]._elems;}
-    inline int ckGetNumElements() const { return _sid[0]._nElems; }
-       inline int ckGetNumElements(int i) const { return _sid[i]._nElems; }
+    inline CkArrayIndex *ckGetArrayElements() const {return const_cast<CkArrayIndex *>(_sid[0]._elems.data());}
+    inline CkArrayIndex *ckGetArrayElements(int i) const {return const_cast<CkArrayIndex *>(_sid[i]._elems.data());}
+    inline int ckGetNumElements() const { return _sid[0]._elems.size(); }
+       inline int ckGetNumElements(int i) const { return _sid[i]._elems.size(); }
        inline int ckGetBfactor() const { return _sid[0].bfactor; }
        void pup(PUP::er &p);
 };
index d0bd5f72e6ec145ae007d4c197ce62ee6897421e..db57b20decb8c11d4654d6f181b2c3dd36dd1b6a 100644 (file)
@@ -183,12 +183,12 @@ CkCallback::CkCallback(int ep,CProxySection_ArrayBase &sectElt,bool doInline) {
       d.section.ep=ep; 
       CkSectionID secID=sectElt.ckGetSectionID(0); 
       d.section.sinfo = secID._cookie.info;
-      d.section._elems = secID._elems;
-      d.section._nElems = secID._nElems;
-      d.section.pelist = secID.pelist;
-      d.section.npes = secID.npes;
-      secID._elems = NULL;
-      secID.pelist = NULL;
+      d.section._elems = secID._elems.data();
+      d.section._nElems = secID._elems.size();
+      d.section.pelist = secID.pelist.data();
+      d.section.npes = secID.pelist.size();
+      secID._elems.clear();
+      secID.pelist.clear();
       d.section.hasRefnum = false;
       d.section.refnum = 0;
 }
@@ -200,10 +200,10 @@ CkCallback::CkCallback(int ep, CkSectionID &id) {
       type=bcastSection;
       d.section.ep=ep;
       d.section.sinfo = id._cookie.info;
-      d.section._elems = id._elems;
-      d.section._nElems = id._nElems;
-      d.section.pelist = id.pelist;
-      d.section.npes = id.npes;
+      d.section._elems = id._elems.data();
+      d.section._nElems = id._elems.size();
+      d.section.pelist = id.pelist.data();
+      d.section.npes = id.pelist.size();
 }
 
 CkCallback::CkCallback(ArrayElement *p, int ep,bool doInline) {
@@ -394,8 +394,8 @@ void CkCallback::send(void *msg) const
                 CkSectionInfo sinfo(d.section.sinfo);
                 CkSectionID secID(sinfo, d.section._elems, d.section._nElems, d.section.pelist, d.section.npes);
                CkBroadcastMsgSection(d.section.ep, msg, secID);
-                secID._elems = NULL;
-                secID.pelist = NULL;
+                secID._elems.clear();
+                secID.pelist.clear();
                break;
              }
        case replyCCS: { /* Send CkDataMsg as a CCS reply */
index 9fe3bb33bf69855cd6209ee9ad8798f770ed9b96..f03fa75b51a45154c736d79cd35f76404255559e 100644 (file)
@@ -384,9 +384,9 @@ void CkMulticastMgr::resetSection(CProxySection_ArrayBase &proxy)
   mCastEntry *oldentry = (mCastEntry *)info.get_val();
   DEBUGF(("[%d] resetSection: old entry:%p new entry:%p\n", CkMyPe(), oldentry, entry));
 
-  const CkArrayIndex *al = sid->_elems;
+  const std::vector<CkArrayIndex> &al = sid->_elems;
   CmiAssert(info.get_aid() == aid);
-  prepareCookie(entry, *sid, al, sid->_nElems, aid);
+  prepareCookie(entry, *sid, al.data(), sid->_elems.size(), aid);
 
   CProxy_CkMulticastMgr  mCastGrp(thisgroup);
 
@@ -866,10 +866,10 @@ void CkMulticastMgr::resetCookie(CkSectionInfo s)
 
 void CkMulticastMgr::SimpleSend(int ep,void *m, CkArrayID a, CkSectionID &sid, int opts)
 {
-  DEBUGF(("[%d] SimpleSend: nElems:%d\n", CkMyPe(), sid._nElems));
+  DEBUGF(("[%d] SimpleSend: nElems:%d\n", CkMyPe(), sid._elems.size()));
     // set an invalid cookie since we don't have it
   ((multicastGrpMsg *)m)->_cookie = CkSectionInfo(-1, NULL, 0, a);
-  for (int i=0; i< sid._nElems-1; i++) {
+  for (int i=0; i< sid._elems.size()-1; i++) {
      CProxyElement_ArrayBase ap(a, sid._elems[i]);
      void *newMsg=CkCopyMsg((void **)&m);
 #if CMK_MESSAGE_LOGGING
@@ -878,8 +878,8 @@ void CkMulticastMgr::SimpleSend(int ep,void *m, CkArrayID a, CkSectionID &sid, i
 #endif
      ap.ckSend((CkArrayMessage *)newMsg,ep,opts|CK_MSG_LB_NOTRACE);
   }
-  if (sid._nElems > 0) {
-     CProxyElement_ArrayBase ap(a, sid._elems[sid._nElems-1]);
+  if (!sid._elems.empty()) {
+     CProxyElement_ArrayBase ap(a, sid._elems[sid._elems.size()-1]);
      ap.ckSend((CkArrayMessage *)m,ep,opts|CK_MSG_LB_NOTRACE);
   }
 }
index 283dca0afec658c67c4bee92829e7697532ad208..cbcc5482bff0a44609665f43e391021cf0ecca21 100644 (file)
@@ -112,7 +112,8 @@ class CkArrayIndex5D;
 class CkArrayIndex6D;
 
 #define CKSECTIONID_CONSTRUCTOR(index) \
-  CkSectionID(const CkArrayID &aid, const CkArrayIndex##index *elems, const int nElems, int factor=USE_DEFAULT_BRANCH_FACTOR);
+  CkSectionID(const CkArrayID &aid, const CkArrayIndex##index *elems, const int nElems, int factor=USE_DEFAULT_BRANCH_FACTOR); \
+  CkSectionID(const CkArrayID &aid, const std::vector<CkArrayIndex##index> &elems, int factor=USE_DEFAULT_BRANCH_FACTOR);
 
 #define USE_DEFAULT_BRANCH_FACTOR 0
 
@@ -125,29 +126,32 @@ public:
   /// Minimal section info (cookie)
   CkSectionInfo _cookie;
   /// The list of array indices that are section members (array sections)
-  CkArrayIndex *_elems;
-  /// The number of section members
-  int _nElems;
+  std::vector<CkArrayIndex> _elems;
   /**
    * \brief A list of PEs that host section members.
    * - For group sections these point to the PEs in the section
    * - For array sections these point to the processors the array elements are on
    * @note For array sections, currently not saved when pupped across processors
    */
-  int *pelist;
-  /// The number of PEs that host section members
-  int npes;
+  std::vector<int> pelist;
   /// Branching factor in the spanning tree, can be negative
   int bfactor;
 
-  CkSectionID(): _elems(NULL), _nElems(0), pelist(NULL), npes(0),
-                  bfactor(USE_DEFAULT_BRANCH_FACTOR) {}
+  CkSectionID(): bfactor(USE_DEFAULT_BRANCH_FACTOR) {}
   CkSectionID(const CkSectionID &sid);
-  CkSectionID(CkSectionInfo &c, CkArrayIndex *e, int n, int *_pelist, int _npes,
+  CkSectionID(CkSectionInfo &c, const CkArrayIndex *e, int n, const int *_pelist, int _npes,
+              int factor=USE_DEFAULT_BRANCH_FACTOR): _cookie(c), bfactor(factor)
+  {
+    _elems.assign(e, e+n);
+    pelist.assign(_pelist, _pelist+n);
+  }
+  CkSectionID(CkSectionInfo &c, const std::vector<CkArrayIndex>& e, const std::vector<int>& _pelist,
               int factor=USE_DEFAULT_BRANCH_FACTOR): _cookie(c), _elems(e),
-              _nElems(n), pelist(_pelist), npes(_npes), bfactor(factor)  {}
+              pelist(_pelist), bfactor(factor)  {}
   CkSectionID(const CkGroupID &gid, const int *_pelist, const int _npes,
               int factor=USE_DEFAULT_BRANCH_FACTOR);
+  CkSectionID(const CkGroupID &gid, const std::vector<int>& _pelist,
+              int factor=USE_DEFAULT_BRANCH_FACTOR);
   CKSECTIONID_CONSTRUCTOR(1D)
   CKSECTIONID_CONSTRUCTOR(2D)
   CKSECTIONID_CONSTRUCTOR(3D)
@@ -157,11 +161,10 @@ public:
   CKSECTIONID_CONSTRUCTOR(Max)
 
   inline CkGroupID get_aid() const { return _cookie.get_aid(); }
+  inline int nElems() const { return _elems.size(); }
+  inline int nPes() const { return pelist.size(); }
   void operator=(const CkSectionID &);
-  ~CkSectionID() {
-    delete [] _elems;
-    delete [] pelist;
-  }
+  ~CkSectionID() = default;
   void pup(PUP::er &p);
 };
 PUPmarshall(CkSectionID)
index f1b1b00c83e766f088fa56ebbf5ccc45fe0b5177..7f6b693780a9d45bb86b0d8e0ea2360ac64b2913 100644 (file)
@@ -306,6 +306,8 @@ fi
 
 AC_DEFINE_UNQUOTED(CMK_LBID_64BIT, 1, [enable 64 bit LB ID])
 
+AC_DEFINE_UNQUOTED(CMK_CKSECTIONINFO_STL, 1, [enable STL CkSectionInfo])
+
 AC_ARG_WITH([qlogic],
             [AS_HELP_STRING([--with-qlogic],
               [QLogic based Infiniband])],[with_qlogic=yes],
index 7322bb6829aec1cec29224f7fc61d13a45ab134a..0e34afd846481ce8ee5e054d72efe78742774565 100644 (file)
@@ -1420,11 +1420,15 @@ void Array::genSubDecls(XStr& str) {
              "int nElems, int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
              "      return CkSectionID(aid, elems, nElems, factor);\n"
              "    } \n"
+             "    static CkSectionID ckNew(const CkArrayID &aid, const std::vector<CkArrayIndex1D> &elems, "
+             "int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
+             "      return CkSectionID(aid, elems, factor);\n"
+             "    } \n"
              "    static CkSectionID ckNew(const CkArrayID &aid, int l, int u, int s, "
              "int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
              "      std::vector<CkArrayIndex1D> al;\n"
-             "      for (int i=l; i<=u; i+=s) al.push_back(CkArrayIndex1D(i));\n"
-             "      return CkSectionID(aid, al.data(), al.size(), factor);\n"
+             "      for (int i=l; i<=u; i+=s) al.emplace_back(i);\n"
+             "      return CkSectionID(aid, al, factor);\n"
              "    } \n";
     } else if (indexSuffix == (const char*)"2D") {
       str << "    " << etype
@@ -1437,13 +1441,17 @@ void Array::genSubDecls(XStr& str) {
              "int nElems, int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
              "      return CkSectionID(aid, elems, nElems, factor);\n"
              "    } \n"
+             "    static CkSectionID ckNew(const CkArrayID &aid, const std::vector<CkArrayIndex2D> &elems, "
+             "int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
+             "      return CkSectionID(aid, elems, factor);\n"
+             "    } \n"
              "    static CkSectionID ckNew(const CkArrayID &aid, int l1, int u1, int s1, "
              "int l2, int u2, int s2, int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
              "      std::vector<CkArrayIndex2D> al;\n"
              "      for (int i=l1; i<=u1; i+=s1) \n"
              "        for (int j=l2; j<=u2; j+=s2) \n"
-             "          al.push_back(CkArrayIndex2D(i, j));\n"
-             "      return CkSectionID(aid, al.data(), al.size(), factor);\n"
+             "          al.emplace_back(i, j);\n"
+             "      return CkSectionID(aid, al, factor);\n"
              "    } \n";
     } else if (indexSuffix == (const char*)"3D") {
       str << "    " << etype
@@ -1456,6 +1464,10 @@ void Array::genSubDecls(XStr& str) {
              "int nElems, int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
              "      return CkSectionID(aid, elems, nElems, factor);\n"
              "    } \n"
+             "    static CkSectionID ckNew(const CkArrayID &aid, const std::vector<CkArrayIndex3D> &elems, "
+             "int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
+             "      return CkSectionID(aid, elems, factor);\n"
+             "    } \n"
              "    static CkSectionID ckNew(const CkArrayID &aid, int l1, int u1, int s1, "
              "int l2, int u2, int s2, int l3, int u3, int s3, int "
              "factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
@@ -1463,8 +1475,8 @@ void Array::genSubDecls(XStr& str) {
              "      for (int i=l1; i<=u1; i+=s1) \n"
              "        for (int j=l2; j<=u2; j+=s2) \n"
              "          for (int k=l3; k<=u3; k+=s3) \n"
-             "          al.push_back(CkArrayIndex3D(i, j, k));\n"
-             "      return CkSectionID(aid, al.data(), al.size(), factor);\n"
+             "          al.emplace_back(i, j, k);\n"
+             "      return CkSectionID(aid, al, factor);\n"
              "    } \n";
     } else if (indexSuffix == (const char*)"4D") {
       str << "    " << etype
@@ -1477,6 +1489,10 @@ void Array::genSubDecls(XStr& str) {
              "int nElems, int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
              "      return CkSectionID(aid, elems, nElems, factor);\n"
              "    } \n"
+             "    static CkSectionID ckNew(const CkArrayID &aid, const std::vector<CkArrayIndex4D> &elems, "
+             "int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
+             "      return CkSectionID(aid, elems, factor);\n"
+             "    } \n"
              "    static CkSectionID ckNew(const CkArrayID &aid, int l1, int u1, int s1, "
              "int l2, int u2, int s2, int l3, int u3, int s3, int l4, int u4, int s4, "
              "int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
@@ -1485,8 +1501,8 @@ void Array::genSubDecls(XStr& str) {
              "        for (int j=l2; j<=u2; j+=s2) \n"
              "          for (int k=l3; k<=u3; k+=s3) \n"
              "            for (int l=l4; l<=u4; l+=s4) \n"
-             "              al.push_back(CkArrayIndex4D(i, j, k, l));\n"
-             "      return CkSectionID(aid, al.data(), al.size(), factor);\n"
+             "              al.emplace_back(i, j, k, l);\n"
+             "      return CkSectionID(aid, al, factor);\n"
              "    } \n";
     } else if (indexSuffix == (const char*)"5D") {
       str << "    " << etype
@@ -1499,6 +1515,10 @@ void Array::genSubDecls(XStr& str) {
              "int nElems, int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
              "      return CkSectionID(aid, elems, nElems, factor);\n"
              "    } \n"
+             "    static CkSectionID ckNew(const CkArrayID &aid, const std::vector<CkArrayIndex5D> &elems, "
+             "int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
+             "      return CkSectionID(aid, elems, factor);\n"
+             "    } \n"
              "    static CkSectionID ckNew(const CkArrayID &aid, int l1, int u1, int s1, "
              "int l2, int u2, int s2, int l3, int u3, int s3, int l4, int u4, int s4, "
              "int l5, int u5, int s5, int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
@@ -1508,8 +1528,8 @@ void Array::genSubDecls(XStr& str) {
              "          for (int k=l3; k<=u3; k+=s3) \n"
              "            for (int l=l4; l<=u4; l+=s4) \n"
              "              for (int m=l5; m<=u5; m+=s5) \n"
-             "                al.push_back(CkArrayIndex5D(i, j, k, l, m));\n"
-             "      return CkSectionID(aid, al.data(), al.size(), factor);\n"
+             "                al.emplace_back(i, j, k, l, m);\n"
+             "      return CkSectionID(aid, al, factor);\n"
              "    } \n";
     } else if (indexSuffix == (const char*)"6D") {
       str << "    " << etype
@@ -1522,6 +1542,10 @@ void Array::genSubDecls(XStr& str) {
              "int nElems, int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
              "      return CkSectionID(aid, elems, nElems, factor);\n"
              "    } \n"
+             "    static CkSectionID ckNew(const CkArrayID &aid, const std::vector<CkArrayIndex6D> &elems, "
+             "int factor=USE_DEFAULT_BRANCH_FACTOR) {\n"
+             "      return CkSectionID(aid, elems, factor);\n"
+             "    } \n"
              "    static CkSectionID ckNew(const CkArrayID &aid, int l1, int u1, int s1, "
              "int l2, int u2, int s2, int l3, int u3, int s3, int l4, int u4, int s4, "
              "int l5, int u5, int s5, int l6, int u6, int s6, int "
@@ -1533,8 +1557,8 @@ void Array::genSubDecls(XStr& str) {
              "            for (int l=l4; l<=u4; l+=s4) \n"
              "              for (int m=l5; m<=u5; m+=s5) \n"
              "                for (int n=l6; n<=u6; n+=s6) \n"
-             "                  al.push_back(CkArrayIndex6D(i, j, k, l, m, n));\n"
-             "      return CkSectionID(aid, al.data(), al.size(), factor);\n"
+             "                  al.emplace_back(i, j, k, l, m, n);\n"
+             "      return CkSectionID(aid, al, factor);\n"
              "    } \n";
     }
 
@@ -1543,11 +1567,22 @@ void Array::genSubDecls(XStr& str) {
            "        :";
     genProxyNames(str, "", NULL, "(aid,elems,nElems,CK_DELCTOR_ARGS)", ", ");
     str << " {}\n";
+    str << "    " << ptype
+        << "(const CkArrayID &aid, const std::vector<CkArrayIndex> &elems, CK_DELCTOR_PARAM) \n"
+           "        :";
+    genProxyNames(str, "", NULL, "(aid,elems,CK_DELCTOR_ARGS)", ", ");
+    str << " {}\n";
     str << "    " << ptype
         << "(const CkArrayID &aid, CkArrayIndex *elems, int nElems, int "
            "factor=USE_DEFAULT_BRANCH_FACTOR) \n"
            "        :";
     genProxyNames(str, "", NULL, "(aid,elems,nElems, factor)", ", ");
+    str << " {}\n";
+    str << "    " << ptype
+        << "(const CkArrayID &aid, const std::vector<CkArrayIndex> &elems, int "
+           "factor=USE_DEFAULT_BRANCH_FACTOR) \n"
+           "        :";
+    genProxyNames(str, "", NULL, "(aid,elems, factor)", ", ");
     str << " { ckAutoDelegate(); }\n";
     str << "    " << ptype
         << "(const CkSectionID &sid)  \n"
@@ -1560,27 +1595,51 @@ void Array::genSubDecls(XStr& str) {
            "        :";
     genProxyNames(str, "", NULL, "(n,aid,elems,nElems,CK_DELCTOR_ARGS)", ", ");
     str << " {}\n";
+    str << "    " << ptype
+        << "(const std::vector<CkArrayID> &aid, const std::vector<std::vector<CkArrayIndex> > &elems, "
+           "CK_DELCTOR_PARAM) \n"
+           "        :";
+    genProxyNames(str, "", NULL, "(aid,elems,CK_DELCTOR_ARGS)", ", ");
+    str << " {}\n";
     str << "    " << ptype
         << "(int n, const CkArrayID *aid, CkArrayIndex const * const *elems, const int "
            "*nElems) \n"
            "        :";
     genProxyNames(str, "", NULL, "(n,aid,elems,nElems)", ", ");
     str << " { ckAutoDelegate(); }\n";
+    str << "    " << ptype
+        << "(const std::vector<CkArrayID> &aid, const std::vector<std::vector<CkArrayIndex> > &elems) \n"
+           "        :";
+    genProxyNames(str, "", NULL, "(aid,elems)", ", ");
+    str << " { ckAutoDelegate(); }\n";
     str << "    " << ptype
         << "(int n, const CkArrayID *aid, CkArrayIndex const * const *elems, const int "
            "*nElems, int factor) \n"
            "        :";
     genProxyNames(str, "", NULL, "(n,aid,elems,nElems, factor)", ", ");
     str << " { ckAutoDelegate(); }\n";
+    str << "    " << ptype
+        << "(const std::vector<CkArrayID> &aid, const std::vector<std::vector<CkArrayIndex> > &elems, "
+           "int factor) \n"
+           "        :";
+    genProxyNames(str, "", NULL, "(aid,elems, factor)", ", ");
+    str << " { ckAutoDelegate(); }\n";
     str << "    static CkSectionID ckNew(const CkArrayID &aid, CkArrayIndex *elems, int "
            "nElems) {\n"
            "      return CkSectionID(aid, elems, nElems);\n"
            "    } \n";
+    str << "    static CkSectionID ckNew(const CkArrayID &aid, const std::vector<CkArrayIndex> &elems) {\n "
+           "      return CkSectionID(aid, elems);\n"
+           "    } \n";
 
     str << "    static CkSectionID ckNew(const CkArrayID &aid, CkArrayIndex *elems, int "
            "nElems, int factor) {\n"
            "      return CkSectionID(aid, elems, nElems, factor);\n"
            "    } \n";
+    str << "    static CkSectionID ckNew(const CkArrayID &aid, const std::vector<CkArrayIndex> &elems, int "
+           "factor) {\n"
+           "      return CkSectionID(aid, elems, factor);\n"
+           "    } \n";
 
     str << "    void ckAutoDelegate(int opts=1) {\n"
         << "      if(ckIsDelegated()) return;\n"