1e5c89e4eSSatish Balay #define PETSC_DLL 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Provides a general mechanism to maintain a linked list of PETSc objects. 4e5c89e4eSSatish Balay This is used to allow PETSc objects to carry a list of "composed" objects 5e5c89e4eSSatish Balay */ 6*d382aafbSBarry Smith #include "petscsys.h" 7e5c89e4eSSatish Balay 82bb46157SSatish Balay struct _n_PetscOList { 9e5c89e4eSSatish Balay char name[256]; 10e5c89e4eSSatish Balay PetscObject obj; 11e5c89e4eSSatish Balay PetscOList next; 12e5c89e4eSSatish Balay }; 13e5c89e4eSSatish Balay 14e5c89e4eSSatish Balay #undef __FUNCT__ 15e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListAdd" 16e5c89e4eSSatish Balay /* 17e5c89e4eSSatish Balay 18e5c89e4eSSatish Balay Notes: Replaces item if it is already in list. Removes item if you pass in a 19e5c89e4eSSatish Balay PETSC_NULL object. 20e5c89e4eSSatish Balay 21e5c89e4eSSatish Balay .seealso: PetscOListDestroy() 22e5c89e4eSSatish Balay */ 23e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOListAdd(PetscOList *fl,const char name[],PetscObject obj) 24e5c89e4eSSatish Balay { 25e5c89e4eSSatish Balay PetscOList olist,nlist,prev; 26e5c89e4eSSatish Balay PetscErrorCode ierr; 27e5c89e4eSSatish Balay PetscTruth match; 28e5c89e4eSSatish Balay 29e5c89e4eSSatish Balay PetscFunctionBegin; 30e5c89e4eSSatish Balay 31e5c89e4eSSatish Balay if (!obj) { /* this means remove from list if it is there */ 32e5c89e4eSSatish Balay nlist = *fl; prev = 0; 33e5c89e4eSSatish Balay while (nlist) { 34e5c89e4eSSatish Balay ierr = PetscStrcmp(name,nlist->name,&match);CHKERRQ(ierr); 35e5c89e4eSSatish Balay if (match) { /* found it already in the list */ 36e5c89e4eSSatish Balay ierr = PetscObjectDereference(nlist->obj);CHKERRQ(ierr); 37e5c89e4eSSatish Balay if (prev) prev->next = nlist->next; 38e5c89e4eSSatish Balay else if (nlist->next) { 39e5c89e4eSSatish Balay *fl = nlist->next; 40e5c89e4eSSatish Balay } else { 41e5c89e4eSSatish Balay *fl = 0; 42e5c89e4eSSatish Balay } 43e5c89e4eSSatish Balay ierr = PetscFree(nlist);CHKERRQ(ierr); 44e5c89e4eSSatish Balay PetscFunctionReturn(0); 45e5c89e4eSSatish Balay } 46e5c89e4eSSatish Balay prev = nlist; 47e5c89e4eSSatish Balay nlist = nlist->next; 48e5c89e4eSSatish Balay } 49e5c89e4eSSatish Balay PetscFunctionReturn(0); /* did not find it to remove */ 50e5c89e4eSSatish Balay } 51e5c89e4eSSatish Balay /* look for it already in list */ 52e5c89e4eSSatish Balay nlist = *fl; 53e5c89e4eSSatish Balay while (nlist) { 54e5c89e4eSSatish Balay ierr = PetscStrcmp(name,nlist->name,&match);CHKERRQ(ierr); 55e5c89e4eSSatish Balay if (match) { /* found it in the list */ 56e5c89e4eSSatish Balay ierr = PetscObjectReference(obj);CHKERRQ(ierr); 577dcf0eaaSdalcinl ierr = PetscObjectDereference(nlist->obj);CHKERRQ(ierr); 58e5c89e4eSSatish Balay nlist->obj = obj; 59e5c89e4eSSatish Balay PetscFunctionReturn(0); 60e5c89e4eSSatish Balay } 61e5c89e4eSSatish Balay nlist = nlist->next; 62e5c89e4eSSatish Balay } 63e5c89e4eSSatish Balay 64e5c89e4eSSatish Balay /* add it to list, because it was not already there */ 65e5c89e4eSSatish Balay 662bb46157SSatish Balay ierr = PetscNew(struct _n_PetscOList,&olist);CHKERRQ(ierr); 67e5c89e4eSSatish Balay olist->next = 0; 68e5c89e4eSSatish Balay olist->obj = obj; 69e5c89e4eSSatish Balay ierr = PetscObjectReference(obj);CHKERRQ(ierr); 70e5c89e4eSSatish Balay ierr = PetscStrcpy(olist->name,name);CHKERRQ(ierr); 71e5c89e4eSSatish Balay 72e5c89e4eSSatish Balay if (!*fl) { 73e5c89e4eSSatish Balay *fl = olist; 74e5c89e4eSSatish Balay } else { /* go to end of list */ 75e5c89e4eSSatish Balay nlist = *fl; 76e5c89e4eSSatish Balay while (nlist->next) { 77e5c89e4eSSatish Balay nlist = nlist->next; 78e5c89e4eSSatish Balay } 79e5c89e4eSSatish Balay nlist->next = olist; 80e5c89e4eSSatish Balay } 81e5c89e4eSSatish Balay PetscFunctionReturn(0); 82e5c89e4eSSatish Balay } 83e5c89e4eSSatish Balay 84e5c89e4eSSatish Balay #undef __FUNCT__ 85e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListDestroy" 86e5c89e4eSSatish Balay /* 87e5c89e4eSSatish Balay PetscOListDestroy - Destroy a list of objects 88e5c89e4eSSatish Balay 89e5c89e4eSSatish Balay Input Parameter: 90e5c89e4eSSatish Balay . fl - pointer to list 91e5c89e4eSSatish Balay */ 929c666560SBarry Smith PetscErrorCode PETSC_DLLEXPORT PetscOListDestroy(PetscOList fl) 93e5c89e4eSSatish Balay { 949c666560SBarry Smith PetscOList tmp; 95e5c89e4eSSatish Balay PetscErrorCode ierr; 96e5c89e4eSSatish Balay 97e5c89e4eSSatish Balay PetscFunctionBegin; 989c666560SBarry Smith while (fl) { 999c666560SBarry Smith tmp = fl->next; 1009c666560SBarry Smith ierr = PetscObjectDereference(fl->obj);CHKERRQ(ierr); 1019c666560SBarry Smith ierr = PetscFree(fl);CHKERRQ(ierr); 1029c666560SBarry Smith fl = tmp; 103e5c89e4eSSatish Balay } 104e5c89e4eSSatish Balay PetscFunctionReturn(0); 105e5c89e4eSSatish Balay } 106e5c89e4eSSatish Balay 107e5c89e4eSSatish Balay 108e5c89e4eSSatish Balay #undef __FUNCT__ 109e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListFind" 110e5c89e4eSSatish Balay /* 111e5c89e4eSSatish Balay PetscOListFind - givn a name, find the matching object 112e5c89e4eSSatish Balay 113e5c89e4eSSatish Balay Input Parameters: 114e5c89e4eSSatish Balay + fl - pointer to list 115e5c89e4eSSatish Balay - name - name string 116e5c89e4eSSatish Balay 117e5c89e4eSSatish Balay Output Parameters: 118e5c89e4eSSatish Balay . ob - the PETSc object 119e5c89e4eSSatish Balay 120e5c89e4eSSatish Balay Notes: 121e5c89e4eSSatish Balay The name must have been registered with the PetscOListAdd() before calling this 122e5c89e4eSSatish Balay routine. 123e5c89e4eSSatish Balay 124e5c89e4eSSatish Balay .seealso: PetscOListReverseFind() 125e5c89e4eSSatish Balay 126e5c89e4eSSatish Balay */ 127e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOListFind(PetscOList fl,const char name[],PetscObject *obj) 128e5c89e4eSSatish Balay { 129e5c89e4eSSatish Balay PetscErrorCode ierr; 130e5c89e4eSSatish Balay PetscTruth match; 131e5c89e4eSSatish Balay 132e5c89e4eSSatish Balay PetscFunctionBegin; 133e5c89e4eSSatish Balay 134e5c89e4eSSatish Balay *obj = 0; 135e5c89e4eSSatish Balay while (fl) { 136e5c89e4eSSatish Balay ierr = PetscStrcmp(name,fl->name,&match);CHKERRQ(ierr); 137e5c89e4eSSatish Balay if (match) { 138e5c89e4eSSatish Balay *obj = fl->obj; 139e5c89e4eSSatish Balay break; 140e5c89e4eSSatish Balay } 141e5c89e4eSSatish Balay fl = fl->next; 142e5c89e4eSSatish Balay } 143e5c89e4eSSatish Balay PetscFunctionReturn(0); 144e5c89e4eSSatish Balay } 145e5c89e4eSSatish Balay 146e5c89e4eSSatish Balay #undef __FUNCT__ 147e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListReverseFind" 148e5c89e4eSSatish Balay /* 149e5c89e4eSSatish Balay PetscOListReverseFind - given a object, find the matching name if it exists 150e5c89e4eSSatish Balay 151e5c89e4eSSatish Balay Input Parameters: 152e5c89e4eSSatish Balay + fl - pointer to list 153e5c89e4eSSatish Balay - ob - the PETSc object 154e5c89e4eSSatish Balay 155e5c89e4eSSatish Balay Output Parameters: 156e5c89e4eSSatish Balay . name - name string 157e5c89e4eSSatish Balay 158e5c89e4eSSatish Balay Notes: 159e5c89e4eSSatish Balay The name must have been registered with the PetscOListAdd() before calling this 160e5c89e4eSSatish Balay routine. 161e5c89e4eSSatish Balay 162e5c89e4eSSatish Balay .seealso: PetscOListFind() 163e5c89e4eSSatish Balay 164e5c89e4eSSatish Balay */ 165e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOListReverseFind(PetscOList fl,PetscObject obj,char **name) 166e5c89e4eSSatish Balay { 167e5c89e4eSSatish Balay PetscFunctionBegin; 168e5c89e4eSSatish Balay 169e5c89e4eSSatish Balay *name = 0; 170e5c89e4eSSatish Balay while (fl) { 171e5c89e4eSSatish Balay if (fl->obj == obj) { 172e5c89e4eSSatish Balay *name = fl->name; 173e5c89e4eSSatish Balay break; 174e5c89e4eSSatish Balay } 175e5c89e4eSSatish Balay fl = fl->next; 176e5c89e4eSSatish Balay } 177e5c89e4eSSatish Balay PetscFunctionReturn(0); 178e5c89e4eSSatish Balay } 179e5c89e4eSSatish Balay 180e5c89e4eSSatish Balay 181e5c89e4eSSatish Balay #undef __FUNCT__ 182e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListDuplicate" 183e5c89e4eSSatish Balay /* 184e5c89e4eSSatish Balay PetscOListDuplicate - Creates a new list from a give object list. 185e5c89e4eSSatish Balay 186e5c89e4eSSatish Balay Input Parameters: 187e5c89e4eSSatish Balay . fl - pointer to list 188e5c89e4eSSatish Balay 189e5c89e4eSSatish Balay Output Parameters: 190e5c89e4eSSatish Balay . nl - the new list (should point to 0 to start, otherwise appends) 191e5c89e4eSSatish Balay 192e5c89e4eSSatish Balay 193e5c89e4eSSatish Balay */ 194e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscOListDuplicate(PetscOList fl,PetscOList *nl) 195e5c89e4eSSatish Balay { 196e5c89e4eSSatish Balay PetscErrorCode ierr; 197e5c89e4eSSatish Balay 198e5c89e4eSSatish Balay PetscFunctionBegin; 199e5c89e4eSSatish Balay while (fl) { 200e5c89e4eSSatish Balay ierr = PetscOListAdd(nl,fl->name,fl->obj);CHKERRQ(ierr); 201e5c89e4eSSatish Balay fl = fl->next; 202e5c89e4eSSatish Balay } 203e5c89e4eSSatish Balay PetscFunctionReturn(0); 204e5c89e4eSSatish Balay } 205e5c89e4eSSatish Balay 206e5c89e4eSSatish Balay 207e5c89e4eSSatish Balay 208e5c89e4eSSatish Balay 209e5c89e4eSSatish Balay 210