static NCerror mergeprojection31(DCEprojection* dst, DCEprojection* src) { NCerror ncstat = NC_NOERR; int i,j; /* merge segment by segment; |dst->segments| == |src->segments| by construction */ ASSERT((dst->discrim == CES_VAR && src->discrim == CES_VAR)); ASSERT((nclistlength(dst->var->segments) == nclistlength(src->var->segments))); for(i=0;i<nclistlength(dst->var->segments);i++) { DCEsegment* dstseg = (DCEsegment*)nclistget(dst->var->segments,i); DCEsegment* srcseg = (DCEsegment*)nclistget(src->var->segments,i); ASSERT((dstseg->cdfnode == srcseg->cdfnode)); /* by construction */ for(j=0;j<nclistlength(dstseg->slices);j++) { dceslicemerge(&dstseg->slices[j],&srcseg->slices[j]); } } return ncstat; }
static int mergeprojection(DCEprojection* dst, DCEprojection* src) { int ncstat = NC_NOERR; int i,j; /* merge segment by segment; |dst->segments| == |src->segments| by construction */ assert((dst->discrim == CES_VAR && src->discrim == CES_VAR)); assert((nclistlength(dst->var->segments) == nclistlength(src->var->segments))); for(i=0;i<nclistlength(dst->var->segments);i++) { DCEsegment* dstseg = (DCEsegment*)nclistget(dst->var->segments,i); DCEsegment* srcseg = (DCEsegment*)nclistget(src->var->segments,i); for(j=0;j<dstseg->rank;j++) { dceslicemerge(dstseg->slices+j, srcseg->slices+j); } } return ncstat; }
/* Modify merged projection to include "addition" projection */ int dcemergeprojections(DCEprojection* merged, DCEprojection* addition) { int ncstat = NC_NOERR; int i,j; ASSERT((merged->discrim == CES_VAR && addition->discrim == CES_VAR)); ASSERT((nclistlength(merged->var->segments) == nclistlength(addition->var->segments))); for(i=0;i<nclistlength(merged->var->segments);i++) { DCEsegment* mergedseg = (DCEsegment*)nclistget(merged->var->segments,i); DCEsegment* addedseg = (DCEsegment*)nclistget(addition->var->segments,i); /* If one segment has larger rank, then copy the extra slices unchanged */ for(j=0;j<addedseg->rank;j++) { if(j < mergedseg->rank) dceslicemerge(mergedseg->slices+j,addedseg->slices+j); else mergedseg->slices[j] = addedseg->slices[j]; } if(addedseg->rank > mergedseg->rank) mergedseg->rank = addedseg->rank; } return ncstat; }