1*7d0a6c19SBarry Smith 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 */ 6d382aafbSBarry 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" 161d0fab5eSBarry Smith /*@C 171d0fab5eSBarry Smith PetscOListAdd - Adds a new object to an PetscOList 18e5c89e4eSSatish Balay 191d0fab5eSBarry Smith Input Parameters: 201d0fab5eSBarry Smith + fl - the object list 211d0fab5eSBarry Smith . name - the name to use for the object 221d0fab5eSBarry Smith - obj - the object to attach 23e5c89e4eSSatish Balay 24b235ab32SBarry Smith Level: developer 25b235ab32SBarry Smith 261d0fab5eSBarry Smith Notes: Replaces item if it is already in list. Removes item if you pass in a PETSC_NULL object. 271d0fab5eSBarry Smith 281d0fab5eSBarry Smith Use PetscOListFind() or PetscOListReverseFind() to get the object back 291d0fab5eSBarry Smith 301d0fab5eSBarry Smith .seealso: PetscOListDestroy(), PetscOListFind(), PetscOListDuplicate(), PetscOListReverseFind(), PetscOListDuplicate() 311d0fab5eSBarry Smith 321d0fab5eSBarry Smith @*/ 337087cfbeSBarry Smith PetscErrorCode PetscOListAdd(PetscOList *fl,const char name[],PetscObject obj) 34e5c89e4eSSatish Balay { 35e5c89e4eSSatish Balay PetscOList olist,nlist,prev; 36e5c89e4eSSatish Balay PetscErrorCode ierr; 37ace3abfcSBarry Smith PetscBool match; 38e5c89e4eSSatish Balay 39e5c89e4eSSatish Balay PetscFunctionBegin; 40e5c89e4eSSatish Balay 41e5c89e4eSSatish Balay if (!obj) { /* this means remove from list if it is there */ 42e5c89e4eSSatish Balay nlist = *fl; prev = 0; 43e5c89e4eSSatish Balay while (nlist) { 44e5c89e4eSSatish Balay ierr = PetscStrcmp(name,nlist->name,&match);CHKERRQ(ierr); 45e5c89e4eSSatish Balay if (match) { /* found it already in the list */ 46e5c89e4eSSatish Balay ierr = PetscObjectDereference(nlist->obj);CHKERRQ(ierr); 47e5c89e4eSSatish Balay if (prev) prev->next = nlist->next; 48e5c89e4eSSatish Balay else if (nlist->next) { 49e5c89e4eSSatish Balay *fl = nlist->next; 50e5c89e4eSSatish Balay } else { 51e5c89e4eSSatish Balay *fl = 0; 52e5c89e4eSSatish Balay } 53e5c89e4eSSatish Balay ierr = PetscFree(nlist);CHKERRQ(ierr); 54e5c89e4eSSatish Balay PetscFunctionReturn(0); 55e5c89e4eSSatish Balay } 56e5c89e4eSSatish Balay prev = nlist; 57e5c89e4eSSatish Balay nlist = nlist->next; 58e5c89e4eSSatish Balay } 59e5c89e4eSSatish Balay PetscFunctionReturn(0); /* did not find it to remove */ 60e5c89e4eSSatish Balay } 61e5c89e4eSSatish Balay /* look for it already in list */ 62e5c89e4eSSatish Balay nlist = *fl; 63e5c89e4eSSatish Balay while (nlist) { 64e5c89e4eSSatish Balay ierr = PetscStrcmp(name,nlist->name,&match);CHKERRQ(ierr); 65e5c89e4eSSatish Balay if (match) { /* found it in the list */ 66e5c89e4eSSatish Balay ierr = PetscObjectReference(obj);CHKERRQ(ierr); 677dcf0eaaSdalcinl ierr = PetscObjectDereference(nlist->obj);CHKERRQ(ierr); 68e5c89e4eSSatish Balay nlist->obj = obj; 69e5c89e4eSSatish Balay PetscFunctionReturn(0); 70e5c89e4eSSatish Balay } 71e5c89e4eSSatish Balay nlist = nlist->next; 72e5c89e4eSSatish Balay } 73e5c89e4eSSatish Balay 74e5c89e4eSSatish Balay /* add it to list, because it was not already there */ 75e5c89e4eSSatish Balay 762bb46157SSatish Balay ierr = PetscNew(struct _n_PetscOList,&olist);CHKERRQ(ierr); 77e5c89e4eSSatish Balay olist->next = 0; 78e5c89e4eSSatish Balay olist->obj = obj; 79e5c89e4eSSatish Balay ierr = PetscObjectReference(obj);CHKERRQ(ierr); 80e5c89e4eSSatish Balay ierr = PetscStrcpy(olist->name,name);CHKERRQ(ierr); 81e5c89e4eSSatish Balay 82e5c89e4eSSatish Balay if (!*fl) { 83e5c89e4eSSatish Balay *fl = olist; 84e5c89e4eSSatish Balay } else { /* go to end of list */ 85e5c89e4eSSatish Balay nlist = *fl; 86e5c89e4eSSatish Balay while (nlist->next) { 87e5c89e4eSSatish Balay nlist = nlist->next; 88e5c89e4eSSatish Balay } 89e5c89e4eSSatish Balay nlist->next = olist; 90e5c89e4eSSatish Balay } 91e5c89e4eSSatish Balay PetscFunctionReturn(0); 92e5c89e4eSSatish Balay } 93e5c89e4eSSatish Balay 94e5c89e4eSSatish Balay #undef __FUNCT__ 95e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListDestroy" 961d0fab5eSBarry Smith /*@C 97e5c89e4eSSatish Balay PetscOListDestroy - Destroy a list of objects 98e5c89e4eSSatish Balay 99e5c89e4eSSatish Balay Input Parameter: 100e5c89e4eSSatish Balay . fl - pointer to list 1011d0fab5eSBarry Smith 102b235ab32SBarry Smith Level: developer 103b235ab32SBarry Smith 1041d0fab5eSBarry Smith .seealso: PetscOListAdd(), PetscOListFind(), PetscOListDuplicate(), PetscOListReverseFind(), PetscOListDuplicate() 1051d0fab5eSBarry Smith 1061d0fab5eSBarry Smith @*/ 1077087cfbeSBarry Smith PetscErrorCode PetscOListDestroy(PetscOList fl) 108e5c89e4eSSatish Balay { 1099c666560SBarry Smith PetscOList tmp; 110e5c89e4eSSatish Balay PetscErrorCode ierr; 111e5c89e4eSSatish Balay 112e5c89e4eSSatish Balay PetscFunctionBegin; 1139c666560SBarry Smith while (fl) { 1149c666560SBarry Smith tmp = fl->next; 1159c666560SBarry Smith ierr = PetscObjectDereference(fl->obj);CHKERRQ(ierr); 1169c666560SBarry Smith ierr = PetscFree(fl);CHKERRQ(ierr); 1179c666560SBarry Smith fl = tmp; 118e5c89e4eSSatish Balay } 119e5c89e4eSSatish Balay PetscFunctionReturn(0); 120e5c89e4eSSatish Balay } 121e5c89e4eSSatish Balay 122e5c89e4eSSatish Balay 123e5c89e4eSSatish Balay #undef __FUNCT__ 124e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListFind" 1251d0fab5eSBarry Smith /*@C 126e5c89e4eSSatish Balay PetscOListFind - givn a name, find the matching object 127e5c89e4eSSatish Balay 128e5c89e4eSSatish Balay Input Parameters: 129e5c89e4eSSatish Balay + fl - pointer to list 130e5c89e4eSSatish Balay - name - name string 131e5c89e4eSSatish Balay 132e5c89e4eSSatish Balay Output Parameters: 133e5c89e4eSSatish Balay . ob - the PETSc object 134e5c89e4eSSatish Balay 135b235ab32SBarry Smith Level: developer 136b235ab32SBarry Smith 137e5c89e4eSSatish Balay Notes: 138e5c89e4eSSatish Balay The name must have been registered with the PetscOListAdd() before calling this 139e5c89e4eSSatish Balay routine. 140e5c89e4eSSatish Balay 1411d0fab5eSBarry Smith .seealso: PetscOListDestroy(), PetscOListAdd(), PetscOListDuplicate(), PetscOListReverseFind(), PetscOListDuplicate() 142e5c89e4eSSatish Balay 1431d0fab5eSBarry Smith @*/ 1447087cfbeSBarry Smith PetscErrorCode PetscOListFind(PetscOList fl,const char name[],PetscObject *obj) 145e5c89e4eSSatish Balay { 146e5c89e4eSSatish Balay PetscErrorCode ierr; 147ace3abfcSBarry Smith PetscBool match; 148e5c89e4eSSatish Balay 149e5c89e4eSSatish Balay PetscFunctionBegin; 150e5c89e4eSSatish Balay 151e5c89e4eSSatish Balay *obj = 0; 152e5c89e4eSSatish Balay while (fl) { 153e5c89e4eSSatish Balay ierr = PetscStrcmp(name,fl->name,&match);CHKERRQ(ierr); 154e5c89e4eSSatish Balay if (match) { 155e5c89e4eSSatish Balay *obj = fl->obj; 156e5c89e4eSSatish Balay break; 157e5c89e4eSSatish Balay } 158e5c89e4eSSatish Balay fl = fl->next; 159e5c89e4eSSatish Balay } 160e5c89e4eSSatish Balay PetscFunctionReturn(0); 161e5c89e4eSSatish Balay } 162e5c89e4eSSatish Balay 163e5c89e4eSSatish Balay #undef __FUNCT__ 164e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListReverseFind" 1651d0fab5eSBarry Smith /*@C 166e5c89e4eSSatish Balay PetscOListReverseFind - given a object, find the matching name if it exists 167e5c89e4eSSatish Balay 168e5c89e4eSSatish Balay Input Parameters: 169e5c89e4eSSatish Balay + fl - pointer to list 170e5c89e4eSSatish Balay - ob - the PETSc object 171e5c89e4eSSatish Balay 172e5c89e4eSSatish Balay Output Parameters: 173e5c89e4eSSatish Balay . name - name string 174e5c89e4eSSatish Balay 175b235ab32SBarry Smith Level: developer 176b235ab32SBarry Smith 177e5c89e4eSSatish Balay Notes: 178e5c89e4eSSatish Balay The name must have been registered with the PetscOListAdd() before calling this 179e5c89e4eSSatish Balay routine. 180e5c89e4eSSatish Balay 1811d0fab5eSBarry Smith .seealso: PetscOListDestroy(), PetscOListAdd(), PetscOListDuplicate(), PetscOListFind(), PetscOListDuplicate() 182e5c89e4eSSatish Balay 1831d0fab5eSBarry Smith @*/ 1847087cfbeSBarry Smith PetscErrorCode PetscOListReverseFind(PetscOList fl,PetscObject obj,char **name) 185e5c89e4eSSatish Balay { 186e5c89e4eSSatish Balay PetscFunctionBegin; 187e5c89e4eSSatish Balay 188e5c89e4eSSatish Balay *name = 0; 189e5c89e4eSSatish Balay while (fl) { 190e5c89e4eSSatish Balay if (fl->obj == obj) { 191e5c89e4eSSatish Balay *name = fl->name; 192e5c89e4eSSatish Balay break; 193e5c89e4eSSatish Balay } 194e5c89e4eSSatish Balay fl = fl->next; 195e5c89e4eSSatish Balay } 196e5c89e4eSSatish Balay PetscFunctionReturn(0); 197e5c89e4eSSatish Balay } 198e5c89e4eSSatish Balay 199e5c89e4eSSatish Balay #undef __FUNCT__ 200e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListDuplicate" 2011d0fab5eSBarry Smith /*@C 202e5c89e4eSSatish Balay PetscOListDuplicate - Creates a new list from a give object list. 203e5c89e4eSSatish Balay 204e5c89e4eSSatish Balay Input Parameters: 205e5c89e4eSSatish Balay . fl - pointer to list 206e5c89e4eSSatish Balay 207e5c89e4eSSatish Balay Output Parameters: 208e5c89e4eSSatish Balay . nl - the new list (should point to 0 to start, otherwise appends) 209e5c89e4eSSatish Balay 210b235ab32SBarry Smith Level: developer 211b235ab32SBarry Smith 2121d0fab5eSBarry Smith .seealso: PetscOListDestroy(), PetscOListAdd(), PetscOListReverseFind(), PetscOListFind(), PetscOListDuplicate() 213e5c89e4eSSatish Balay 2141d0fab5eSBarry Smith @*/ 2157087cfbeSBarry Smith PetscErrorCode PetscOListDuplicate(PetscOList fl,PetscOList *nl) 216e5c89e4eSSatish Balay { 217e5c89e4eSSatish Balay PetscErrorCode ierr; 218e5c89e4eSSatish Balay 219e5c89e4eSSatish Balay PetscFunctionBegin; 220e5c89e4eSSatish Balay while (fl) { 221e5c89e4eSSatish Balay ierr = PetscOListAdd(nl,fl->name,fl->obj);CHKERRQ(ierr); 222e5c89e4eSSatish Balay fl = fl->next; 223e5c89e4eSSatish Balay } 224e5c89e4eSSatish Balay PetscFunctionReturn(0); 225e5c89e4eSSatish Balay } 226e5c89e4eSSatish Balay 227e5c89e4eSSatish Balay 228e5c89e4eSSatish Balay 229e5c89e4eSSatish Balay 230e5c89e4eSSatish Balay 231