17d0a6c19SBarry 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 */ 6c6db04a5SJed Brown #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: 1006bf464f9SBarry Smith . ifl - pointer to list 1011d0fab5eSBarry Smith 102b235ab32SBarry Smith Level: developer 103b235ab32SBarry Smith 1041d0fab5eSBarry Smith .seealso: PetscOListAdd(), PetscOListFind(), PetscOListDuplicate(), PetscOListReverseFind(), PetscOListDuplicate() 1051d0fab5eSBarry Smith 1061d0fab5eSBarry Smith @*/ 1076bf464f9SBarry Smith PetscErrorCode PetscOListDestroy(PetscOList *ifl) 108e5c89e4eSSatish Balay { 1096bf464f9SBarry Smith PetscOList tmp,fl = *ifl; 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 } 1196bf464f9SBarry Smith *ifl = PETSC_NULL; 120e5c89e4eSSatish Balay PetscFunctionReturn(0); 121e5c89e4eSSatish Balay } 122e5c89e4eSSatish Balay 123e5c89e4eSSatish Balay 124e5c89e4eSSatish Balay #undef __FUNCT__ 125e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListFind" 1261d0fab5eSBarry Smith /*@C 127e5c89e4eSSatish Balay PetscOListFind - givn a name, find the matching object 128e5c89e4eSSatish Balay 129e5c89e4eSSatish Balay Input Parameters: 130e5c89e4eSSatish Balay + fl - pointer to list 131e5c89e4eSSatish Balay - name - name string 132e5c89e4eSSatish Balay 133e5c89e4eSSatish Balay Output Parameters: 134e5c89e4eSSatish Balay . ob - the PETSc object 135e5c89e4eSSatish Balay 136b235ab32SBarry Smith Level: developer 137b235ab32SBarry Smith 138e5c89e4eSSatish Balay Notes: 139*3c0c59f3SBarry Smith The name must have been registered with the PetscOListAdd() before calling this routine. 140*3c0c59f3SBarry Smith 141*3c0c59f3SBarry Smith The reference count of the object is not increased 142e5c89e4eSSatish Balay 1431d0fab5eSBarry Smith .seealso: PetscOListDestroy(), PetscOListAdd(), PetscOListDuplicate(), PetscOListReverseFind(), PetscOListDuplicate() 144e5c89e4eSSatish Balay 1451d0fab5eSBarry Smith @*/ 1467087cfbeSBarry Smith PetscErrorCode PetscOListFind(PetscOList fl,const char name[],PetscObject *obj) 147e5c89e4eSSatish Balay { 148e5c89e4eSSatish Balay PetscErrorCode ierr; 149ace3abfcSBarry Smith PetscBool match; 150e5c89e4eSSatish Balay 151e5c89e4eSSatish Balay PetscFunctionBegin; 152e5c89e4eSSatish Balay *obj = 0; 153e5c89e4eSSatish Balay while (fl) { 154e5c89e4eSSatish Balay ierr = PetscStrcmp(name,fl->name,&match);CHKERRQ(ierr); 155e5c89e4eSSatish Balay if (match) { 156e5c89e4eSSatish Balay *obj = fl->obj; 157e5c89e4eSSatish Balay break; 158e5c89e4eSSatish Balay } 159e5c89e4eSSatish Balay fl = fl->next; 160e5c89e4eSSatish Balay } 161e5c89e4eSSatish Balay PetscFunctionReturn(0); 162e5c89e4eSSatish Balay } 163e5c89e4eSSatish Balay 164e5c89e4eSSatish Balay #undef __FUNCT__ 165e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListReverseFind" 1661d0fab5eSBarry Smith /*@C 167e5c89e4eSSatish Balay PetscOListReverseFind - given a object, find the matching name if it exists 168e5c89e4eSSatish Balay 169e5c89e4eSSatish Balay Input Parameters: 170e5c89e4eSSatish Balay + fl - pointer to list 171e5c89e4eSSatish Balay - ob - the PETSc object 172e5c89e4eSSatish Balay 173e5c89e4eSSatish Balay Output Parameters: 174e5c89e4eSSatish Balay . name - name string 175e5c89e4eSSatish Balay 176b235ab32SBarry Smith Level: developer 177b235ab32SBarry Smith 178e5c89e4eSSatish Balay Notes: 179*3c0c59f3SBarry Smith The name must have been registered with the PetscOListAdd() before calling this routine. 180*3c0c59f3SBarry Smith 181*3c0c59f3SBarry Smith The reference count of the object is not increased 182e5c89e4eSSatish Balay 1831d0fab5eSBarry Smith .seealso: PetscOListDestroy(), PetscOListAdd(), PetscOListDuplicate(), PetscOListFind(), PetscOListDuplicate() 184e5c89e4eSSatish Balay 1851d0fab5eSBarry Smith @*/ 1867087cfbeSBarry Smith PetscErrorCode PetscOListReverseFind(PetscOList fl,PetscObject obj,char **name) 187e5c89e4eSSatish Balay { 188e5c89e4eSSatish Balay PetscFunctionBegin; 189e5c89e4eSSatish Balay *name = 0; 190e5c89e4eSSatish Balay while (fl) { 191e5c89e4eSSatish Balay if (fl->obj == obj) { 192e5c89e4eSSatish Balay *name = fl->name; 193e5c89e4eSSatish Balay break; 194e5c89e4eSSatish Balay } 195e5c89e4eSSatish Balay fl = fl->next; 196e5c89e4eSSatish Balay } 197e5c89e4eSSatish Balay PetscFunctionReturn(0); 198e5c89e4eSSatish Balay } 199e5c89e4eSSatish Balay 200e5c89e4eSSatish Balay #undef __FUNCT__ 201e5c89e4eSSatish Balay #define __FUNCT__ "PetscOListDuplicate" 2021d0fab5eSBarry Smith /*@C 203e5c89e4eSSatish Balay PetscOListDuplicate - Creates a new list from a give object list. 204e5c89e4eSSatish Balay 205e5c89e4eSSatish Balay Input Parameters: 206e5c89e4eSSatish Balay . fl - pointer to list 207e5c89e4eSSatish Balay 208e5c89e4eSSatish Balay Output Parameters: 209e5c89e4eSSatish Balay . nl - the new list (should point to 0 to start, otherwise appends) 210e5c89e4eSSatish Balay 211b235ab32SBarry Smith Level: developer 212b235ab32SBarry Smith 2131d0fab5eSBarry Smith .seealso: PetscOListDestroy(), PetscOListAdd(), PetscOListReverseFind(), PetscOListFind(), PetscOListDuplicate() 214e5c89e4eSSatish Balay 2151d0fab5eSBarry Smith @*/ 2167087cfbeSBarry Smith PetscErrorCode PetscOListDuplicate(PetscOList fl,PetscOList *nl) 217e5c89e4eSSatish Balay { 218e5c89e4eSSatish Balay PetscErrorCode ierr; 219e5c89e4eSSatish Balay 220e5c89e4eSSatish Balay PetscFunctionBegin; 221e5c89e4eSSatish Balay while (fl) { 222e5c89e4eSSatish Balay ierr = PetscOListAdd(nl,fl->name,fl->obj);CHKERRQ(ierr); 223e5c89e4eSSatish Balay fl = fl->next; 224e5c89e4eSSatish Balay } 225e5c89e4eSSatish Balay PetscFunctionReturn(0); 226e5c89e4eSSatish Balay } 227e5c89e4eSSatish Balay 228e5c89e4eSSatish Balay 229e5c89e4eSSatish Balay 230e5c89e4eSSatish Balay 231e5c89e4eSSatish Balay 232