#ifndef __LIST_CC #define __LIST_CC #pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig /*************************************************************************** * * list.cc - Non-nline list definitions for the Standard Library * *************************************************************************** * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Hewlett-Packard Company makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * * *************************************************************************** * * Copyright (c) 1994-1999 Rogue Wave Software, Inc. All Rights Reserved. * * This computer software is owned by Rogue Wave Software, Inc. and is * protected by U.S. copyright laws and other laws and by international * treaties. This computer software is furnished by Rogue Wave Software, * Inc. pursuant to a written license agreement and may be used, copied, * transmitted, and stored only in accordance with the terms of such * license and with the inclusion of the above copyright notice. This * computer software or any other copies thereof may not be provided or * otherwise made available to any other person. * * U.S. Government Restricted Rights. This computer software is provided * with Restricted Rights. Use, duplication, or disclosure by the * Government is subject to restrictions as set forth in subparagraph (c) * (1) (ii) of The Rights in Technical Data and Computer Software clause * at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the * Commercial Computer Software – Restricted Rights at 48 CFR 52.227-19, * as applicable. Manufacturer is Rogue Wave Software, Inc., 5500 * Flatiron Parkway, Boulder, Colorado 80301 USA. * **************************************************************************/ #include #include #define _RWSTD_LIST_SORT_COUNTERS 64 #ifndef _RWSTD_NO_NAMESPACE namespace std { #endif template void list::__deallocate_buffers () { while (__buffer_list.data()) { __buffer_pointer tmp = __buffer_list; __buffer_list = (__buffer_pointer)(__buffer_list.data()->next_buffer); __list_node_alloc_type(__buffer_list).deallocate(tmp->buffer,tmp->size); __buffer_alloc_type(__buffer_list).deallocate(tmp,1); } __free_list = 0; __next_avail = 0; __last = 0; } // // This requires that T have a default constructor. // template void list::resize (size_type new_size) { // T value; // RW_BUG: bts-78526 if (new_size > size()) insert(end(), new_size - size(), T() ); // RW_BUG: bts-78526 else if (new_size < size()) { iterator tmp = begin(); advance(tmp, (difference_type) new_size); erase(tmp, end()); } } template void list::resize (size_type new_size, T value) { if (new_size > size()) insert(end(), new_size - size(), value); else if (new_size < size()) { iterator tmp = begin(); advance(tmp, (difference_type) new_size); erase(tmp, end()); } } #ifndef _RWSTD_NO_MEMBER_TEMPLATES template template void list::__insert_aux2 (iterator position, InputIterator first, InputIterator locallast) { while (first != locallast) insert(position, *first++); } #endif // _RWSTD_NO_MEMBER_TEMPLATES #ifdef _RWSTD_NO_MEMBER_TEMPLATES template void list::insert (iterator position, const_iterator first, const_iterator locallast) { while (first != locallast) insert(position, *first++); } template void list::insert (iterator position, const T* first, const T* locallast) { while (first != locallast) insert(position, *first++); } #endif // _RWSTD_NO_MEMBER_TEMPLATES template void list::__insert_aux (iterator position, size_type n, const T& x) { while (n--) insert(position, x); } template _TYPENAME list::iterator list::erase (iterator first, iterator locallast) { iterator tmp = end(); while (first != locallast) { tmp = erase(first++); } return tmp; } template list& list::operator= (const list& x) { if (this != &x) { iterator first1 = begin(); iterator last1 = end(); const_iterator first2 = x.begin(); const_iterator last2 = x.end(); while (first1 != last1 && first2 != last2) *first1++ = *first2++; if (first2 == last2) erase(first1, last1); else insert(last1, first2, last2); } return *this; } template void list::remove (const T& value) { iterator first = begin(); iterator last = end(); while (first != last) { iterator next = first; ++next; if (*first == value) erase(first); first = next; } } template void list::unique () { iterator first = begin(); iterator last = end(); if (first == last) return; iterator next = first; while (++next != last) { if (*first == *next) erase(next); else first = next; next = first; } } template void list::merge (list& x) { iterator first1 = begin(); iterator last1 = end(); iterator first2 = x.begin(); iterator last2 = x.end(); while (first1 != last1 && first2 != last2) { if (*first2 < *first1) { iterator next = first2; __transfer(first1, first2, ++next, x); first2 = next; } else first1++; } if (first2 != last2) __transfer(last1, first2, last2, x); } template void list::reverse () { if (size() < 2) return; for (iterator first = ++begin(); first != end();) { iterator old = first++; __transfer(begin(), old, first, *this); } } // sorts list by moving nodes within list. This preserves iterators pointing to // elements of the list. template void list::sort () { for (unsigned int n = 1; n < size(); n *= 2) { iterator i1 = begin(), i2 = begin(), i3 = begin(); __advance(i2, (difference_type) n, end()); __advance(i3, (difference_type) (2*n), end()); for (unsigned int m = 0; m < (size()+(2*n))/(n*2); m++) { if (i1 != end() && i2 != end()) { __adjacent_merge(i1, i2, i3); i1 = i3; i2 = i3; __advance(i2, (difference_type) n, end()); __advance(i3, (difference_type) 2*n, end()); } } } } #ifndef _RWSTD_NO_MEMBER_TEMPLATES template template void list::remove_if (Predicate pred) { iterator first = begin(); iterator last = end(); while (first != last) { iterator next = first; ++next; if (pred(*first)) erase(first); first = next; } } template template void list::unique (BinaryPredicate pred) { iterator first = begin(); iterator last = end(); if (first == last) return; iterator next = first; while (++next != last) { if (pred(*first, *next)) erase(next); else first = next; next = first; } } template template void list::merge (list& x, Compare comp) { iterator first1 = begin(); iterator last1 = end(); iterator first2 = x.begin(); iterator last2 = x.end(); while (first1 != last1 && first2 != last2) { if (comp(*first2, *first1)) { iterator next = first2; __transfer(first1, first2, ++next, x); first2 = next; } else first1++; } if (first2 != last2) __transfer(last1, first2, last2, x); } template template void list::sort (Compare comp) { for (int n = 1; n < size(); n *= 2) { iterator i1 = begin(), i2 = begin(), i3 = begin(); __advance(i2, (difference_type) n, end()); __advance(i3, (difference_type) (2*n), end()); for (int m = 0; m < (size()+(2*n))/(n*2); m++) { if (i1 != end() && i2 != end()) { __adjacent_merge(i1, i2, i3, comp); i1 = i3; i2 = i3; __advance(i2, (difference_type) n, end()); __advance(i3, (difference_type) 2*n, end()); } } } } /* template template void list::sort (Compare comp) { if (size() < 2) return; list carry(get_allocator()); list counter[ _RWSTD_LIST_SORT_COUNTERS]; for (int i = 0; i < _RWSTD_LIST_SORT_COUNTERS; i++) counter[i].__set_allocator(get_allocator()); int fill = 0; while (!empty()) { carry.splice(carry.begin(), *this, begin()); int i = 0; while (i < fill && !counter[i].empty()) { counter[i].merge(carry, comp); carry.swap(counter[i++]); } carry.swap(counter[i]); if (i == fill) ++fill; } while (fill--) merge(counter[fill], comp); } */ #endif /*_RWSTD_NO_MEMBER_TEMPLATES*/ #undef _RWSTD_LIST_SORT_COUNTERS #ifndef _RWSTD_NO_NAMESPACE } #endif #pragma option pop #endif /* __LIST_CC */