cop<KeyT,DataT,CompareT,AllocT>& cop<KeyT,DataT,CompareT,AllocT> ::keep_if(const property<value_type>& hasProperty) { iterator it = begin(), victim; while(it != end()) if ( !hasProperty(*it) ) { victim = it++; erase(victim); } else ++it; return *this; }
typename cop<KeyT,DataT,CompareT,AllocT>::iterator cop<KeyT,DataT,CompareT,AllocT>::subtract(const key_type& key) { iterator it_ = find(key); if(it_ != end()) erase(it_); return end(); }
typename cop<KeyT,DataT,CompareT,AllocT>::iterator cop<KeyT,DataT,CompareT,AllocT>::subtract(const value_type& val) { iterator it_ = find(val.KEY_VALUE); if(it_ != end()) { (*it_).CONT_VALUE -= val.CONT_VALUE; if((*it_).CONT_VALUE == DataT()) //neutron absorbtion { erase(it_); return end(); } else return it_; } //JODO inverse subtraction violates LAW: symmetric difference //else //{ // DataT inverse = DataT(); // inverse -= val.CONT_VALUE; // return insert(value_type(val.KEY_VALUE, inverse)).ITERATOR; //} }
typename cop<KeyT,DataT,CompareT,AllocT>::iterator cop<KeyT,DataT,CompareT,AllocT>::add(const value_type& val) { if(val.CONT_VALUE == DataT()) return end(); pair<iterator, bool> insertionAttempt = insert(val); if( insertionAttempt.WAS_SUCCESSFUL ) return insertionAttempt.ITERATOR ; else { iterator it = insertionAttempt.ITERATOR; (*it).CONT_VALUE += val.CONT_VALUE ; if((*it).CONT_VALUE == DataT()) //neutron absorbtion { erase(it); return end(); } else return it ; } }