long Coll_List_pushBack( Coll_List *_this, void *object) { Coll_Iter *new_element; long retValue = COLL_ERROR_ALLOC; assert(_this); /* object may be null */ new_element = Coll_Iter_new(); if(new_element){ Coll_Iter_setObject(new_element, object); if (!_this->_nr_elements){ /* first object to insert */ _this->_first_element = new_element; } else { /* insert object at the end of the list */ Coll_Iter_setNext(_this->_last_element, new_element); Coll_Iter_setPrev(new_element, _this->_last_element); } /* update list administration */ _this->_last_element = new_element; _this->_nr_elements++; retValue = COLL_OK; } return retValue; }
long Coll_Set_addUniqueObject( Coll_Set *_this, void *object) { long retValue = COLL_OK; Coll_Iter *new_element = NULL; DLRL_INFO_OBJECT(INF_ENTER); assert(_this); /* object may be null */ if (_this->_is_sorted){ retValue = COLL_ERROR_PRECONDITION_NOT_MET; } else { new_element = Coll_Iter_new(); if(!new_element){ retValue = COLL_ERROR_ALLOC; } } if(retValue == COLL_OK){ Coll_Iter_setObject(new_element, object); if (_this->_nr_elements == 0){ /* first object to insert */ /* Following actions already handled by Coll_Iter constructor */ /* Coll_Iter_setPrev(new_element, NULL); */ /* Coll_Iter_setNext(new_element, NULL); */ _this->_first_element = new_element; _this->_last_element = new_element; } else { /* simply append the new object to the end of the list */ /* Following action already handled by Coll_Iter constructor */ /* Coll_Iter_setNext(new_element, NULL); */ Coll_Iter_setPrev(new_element, _this->_last_element); Coll_Iter_setNext(_this->_last_element, new_element); _this->_last_element = new_element; } /* update set administration */ _this->_nr_elements++; } DLRL_INFO(INF_EXIT); return retValue; }
long Coll_Set_add( Coll_Set *_this, void *object) { long retValue; Coll_Iter *new_element; DLRL_INFO_OBJECT(INF_ENTER); assert(_this); /* object may be null */ if (!_this->_is_sorted && !Coll_Set_find(_this, object)){ /* set is unsorted and does not contain the to be added object => the object can be added as a unique object */ retValue = Coll_Set_addUniqueObject(_this, object); } else { /* set is sorted, add the object at the right place */ new_element = Coll_Iter_new(); if (!new_element){ retValue = COLL_ERROR_ALLOC; } else { Coll_Iter_setObject(new_element, object); if ( (_this->_nr_elements == 0) || (_this->_isLess(object, Coll_Iter_getObject(_this->_first_element) ) ) ){ /* first object to insert */ Coll_Iter_setNext(new_element, _this->_first_element); if (_this->_first_element){ Coll_Iter_setPrev(_this->_first_element, new_element); } _this->_first_element = new_element; /* update set administration */ _this->_nr_elements++; } else { int ready = 0; /* insert object at the right place */ Coll_Iter *iter = _this->_first_element; while (!ready) { int isLess = _this->_isLess(object, Coll_Iter_getObject(iter)); if ( !(isLess || _this->_isLess(Coll_Iter_getObject(iter), object)) ) { /* equal => element already exists in set => delete iterator object again */ Coll_Iter_delete(new_element); ready = 1; } else if (isLess) { /* smaller => insert the new element here */ Coll_Iter_setNext(new_element, iter); Coll_Iter_setPrev(new_element, Coll_Iter_getPrev(iter)); Coll_Iter_setNext(Coll_Iter_getPrev(iter), new_element); Coll_Iter_setPrev(iter, new_element); /* update set administration */ _this->_nr_elements++; ready = 1; } else if (Coll_Iter_getNext(iter) == NULL){ /* append new element to the end of the set */ Coll_Iter_setPrev(new_element, iter); Coll_Iter_setNext(iter, new_element); /* update set administration */ _this->_last_element = new_element; _this->_nr_elements++; ready = 1; } else { /* do nothing */ } iter = Coll_Iter_getNext(iter); } } retValue = COLL_OK; } } DLRL_INFO(INF_EXIT); return retValue; }