xref: /petsc/src/sys/objects/olist.c (revision 3c0c59f39ee3bd561a1b4dcbd0e58366bfa60aba)
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