diff options
author | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-07-16 14:11:33 +0000 |
---|---|---|
committer | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-07-16 14:11:33 +0000 |
commit | 814ff99468e3f05cc1ef375371a8dc39ab96055f (patch) | |
tree | 6032c18cddb56efb4a07eee4787b67c508d0b4b3 | |
parent | b426b1d855c3803bbb090c098aebc0cc65202287 (diff) | |
download | ATCD-814ff99468e3f05cc1ef375371a8dc39ab96055f.tar.gz |
removed STL from ACE, for good this time
-rw-r--r-- | STL/ChangeLog | 50 | ||||
-rw-r--r-- | STL/README | 272 | ||||
-rw-r--r-- | STL/algo.h | 2593 | ||||
-rw-r--r-- | STL/algobase.h | 250 | ||||
-rw-r--r-- | STL/bool.h | 58 | ||||
-rw-r--r-- | STL/bstring.h | 2516 | ||||
-rw-r--r-- | STL/bvector.cpp | 80 | ||||
-rw-r--r-- | STL/bvector.h | 378 | ||||
-rw-r--r-- | STL/defalloc.h | 211 | ||||
-rw-r--r-- | STL/deque.h | 586 | ||||
-rw-r--r-- | STL/function.h | 287 | ||||
-rw-r--r-- | STL/heap.h | 212 | ||||
-rw-r--r-- | STL/iterator.h | 414 | ||||
-rw-r--r-- | STL/list.h | 520 | ||||
-rw-r--r-- | STL/map.h | 167 | ||||
-rw-r--r-- | STL/multimap.h | 161 | ||||
-rw-r--r-- | STL/multiset.h | 148 | ||||
-rw-r--r-- | STL/pair.h | 62 | ||||
-rw-r--r-- | STL/projectn.h | 50 | ||||
-rw-r--r-- | STL/ptr.h | 338 | ||||
-rw-r--r-- | STL/queue.h | 1 | ||||
-rw-r--r-- | STL/random.cpp | 58 | ||||
-rw-r--r-- | STL/set.h | 151 | ||||
-rw-r--r-- | STL/stack.h | 137 | ||||
-rw-r--r-- | STL/stl.h | 206 | ||||
-rw-r--r-- | STL/tempbuf.cpp | 19 | ||||
-rw-r--r-- | STL/tempbuf.h | 74 | ||||
-rw-r--r-- | STL/tree.h | 1088 | ||||
-rw-r--r-- | STL/vector.h | 308 |
29 files changed, 0 insertions, 11395 deletions
diff --git a/STL/ChangeLog b/STL/ChangeLog deleted file mode 100644 index e1a9c2196ab..00000000000 --- a/STL/ChangeLog +++ /dev/null @@ -1,50 +0,0 @@ -Fri Nov 21 01:16:49 1997 <irfan@TWOSTEP> - - * bstring.h: Removed strange looking template specialization. - -Thu Apr 03 08:58:05 1997 David L. Levine <levine@cs.wustl.edu> - - * STL/bool.h: added /**/ to #include <yvals.h>. Thanks to - Matthias Kerkhoff <make@cs.tu-berlin.de> for reporting this. - -Sat Jan 25 11:34:56 1997 Irfan Pyarali <irfan@flamenco.cs.wustl.edu> - - * STL/bstring.h: Fixed typo. - -Mon Jan 20 10:04:11 1997 David L. Levine <levine@cs.wustl.edu> - - * algobase.h: wrapped min/max templates with #if ! defined (VXWORKS) - because it already has them. - - * bstring.h: wrapped basic_string<char> template instantiation - so that it's not used with GreenHills compiler. - -Tue Jan 14 15:46:31 1997 David L. Levine <levine@cs.wustl.edu> - - * tree.h (iterator () and const_iterator ()): added cast - of NULL to link_type before assigning it to NIL; - GreenHills 1.8.8 fails to compile without it. - -Tue Dec 10 20:14:56 1996 Irfan Pyarali <irfan@flamenco.cs.wustl.edu> - - * bstring.h: Fixed string_char_baggage::copy() so that the pointer - are incremented correctly. - -Fri Dec 6 02:08:35 1996 Irfan Pyarali <irfan@flamenco.cs.wustl.edu> - - * bool.h: Made the defines for bool, true, and false conditional. - -Wed Dec 4 00:17:11 1996 Irfan Pyarali <irfan@flamenco.cs.wustl.edu> - - * vector.h: Modified to remove the default argument to the - constructor. This avoids the VC++4.0 compiler from failing to - deal correctly with nested classes. - - * bstring.h: Modified access to reserve and default_size to - correctly use the std namespace. - - * This version of STL was obtained from - http://www.rahul.net/terris/. This is a modified version of the - implementation that comes with VC++4.0. Please see README - for details. - diff --git a/STL/README b/STL/README deleted file mode 100644 index 5132bc1189b..00000000000 --- a/STL/README +++ /dev/null @@ -1,272 +0,0 @@ -STL2.ZIP - -Standard Template Library for Visual C++ 4.0 -and Related Classes - -Revised 10/15/96 - Bug fixes and change to bit_vector. - -This version supports DLLs and threading. You must use critical -sections around code that uses the same container in different -threads. These features come at a price -- since memory -usage is not optimal, this code may use more memory and -may be slower. - -+ General strategy: Remove all statics except the - static allocator objects. -+ Vectors were not affected. -+ Major changes made to tree.h -+ Stability: Very stable. - -This code should be considered for experimental use only. There -are still statics lurking in some functions; these functions -are not thread-safe. - -------------------------- -Fix for bit_vector -------------------------- -This version also has a fix for bit_vector, which doesn't really -work with VC++ 4.x. Please include bvector.cpp in your -project if you use bit_vector. This fixes the linker errors -that occur if you use bector.h in multiple .cpp files. - -------------------------- -Disclaimer -------------------------- -Code is provided without warranty, liability, or technical support. - -STL.H and PTR.H are freely distributable and can be -modified in any way. - --------------------------------- -STRING.H does not compile. --------------------------------- - -"D. Pirzadeh" <ddp@crl.com> Explains how to fix: - -First, I got compile errors in "bstring.h" -and changed it as follows to correct: - line 1104 "::reserve" -> "std::reserve" - line 1110 "::default_size" -> "std::default_size" - -Also, I got an INTERNAL COMPILER ERROR with Visual C++ v4.0 when I did the fol- -lowing: - class xyz : public std::string { } - -I fixed it with: - typedef std::string XyzString; - class xyz : public XyzString { } - --------------------------------- -Changes made to STL distribution --------------------------------- - -These files were modified from the STL distribution shipped with -Microsoft Visual C++ 4.0. The files here are a complete, -working version of the STL. These files have been tested with -MFC applications. - -Changes were made to practically all header files. Look for -comments like: - -*Added by... -*Changed by... - ------------------- -Usage Instructions ------------------- - -Set the preprocessor variable NOMINMAX. - -As Microsoft recommends, the STL is compiled in the std namespace. - -When including these files, do **not** do this: - - namespace std - { - #include <vector.h> - } - -Instead, do this: - - #include <vector.h> - -Recommended usage: - - First, include: - - #include <afxwin.h> - #include <afxext.h> - #include <afxtempl.h> - - Then include the STL header files. - -------------------- -Support for CString -------------------- -The stl.h file contains code written by me. The file contains -operators that will allow you to use CString objects with STL -containers and functions. - -!!!! CString will not work with STL unless you include <stl.h> !!!! - -------------------------------------------- -Helper functions for pointers-in-containers -------------------------------------------- -There is a file called stl.h which contains two functions: - SequenceDelete - MapDelete -These functions send "delete" to all of the objects in a container. - -If you don't like this approach, you can use a supplied "pointer -wrapper" class. - -There is a file called ptr.h which contains a class called Ptr -that can be used exactly like a pointer. The object has a pointer -inside it that points to an object of any class. When a Ptr object -is deleted, "delete" is sent to its underlying pointer. Ptr can be -used with any STL container, as it has a copy constructor and -assignment operator, which transfers "ownership" of the pointer from -the source object to the destination object. Ptr is from the book -Design Patterns by Gamma et al -- see the Proxy pattern. - -The Ptr class makes memory leaks impossible, because it deletes -objects automatically when the container is deleted, or when -functions like "delete" are used. - -Example: - - This is a vector of CStrings: - - std::vector< Ptr<CString> > StringVector; - - StringVector.push_back( Ptr( new CString( "hello" ) ) ); - StringVector.push_back( Ptr( new CString( "This is another string" ) ) ); - ------------------------- -Common Problems with STL ------------------------- - -1) Compiler error: != is ambiguous - - Solution: put the following line at the beginning of the method - that caused the error: - - using namespace std; - -2) When using maps, the debugger crashes. - - This is because symbols for maps (actually, for the "pair") - get truncated to 255 characters. Solution: Turn off the - variables window in the debugger. Don't try to look at - a symbol that has been truncated. This is not an STL-specific - bug -- It's a bug in the debugger. - -3) All sorts of compile errors in STL header files - - Make sure the preprocessor variable NOMINMAX is defined - - -4) Compiler errors about "operator < is not available", etc. - The class involved has global comparison operators. - - Solution: - Write "routers" in the std namespace to the global namespace. - Example (see also stl.h - this is how CString is able - to work with STL): - - namespace std - { - BOOL operator < ( const MyClass & rLhs, - const AnotherClass & rRhs ) - { - return ::operator < ( rLhs, rRhs ); - } - } - - See also 5. - -5) When you use find() or another algorithm, the compiler - complains that it cannot find the == or < operators. - -If your code compiles without any error messages, then disregard -this section. However, if you get errors like "cannot convert -first argument from const class X" then read on. - -I am assuming that your code is calling an STL algorithm like -std::sort() or std::find(). If you're not, I can't help -you. - -There is apparently a bug in the Microsoft compiler regarding -namespaces. Namespaces cannot locate global -functions that reside in the global namespace. For example, -the binary == operator. - -Maybe this is a bug, maybe it isn't. This is not clear -to me. However, I do know what works and have tried many other -approaches that do not work. If you have a better solution I -would appreciate it if you could let me know about it. - -So, if you declare your own class and want to use algorithms -like find() on an STL container, you have two choices: - -(1) Declare == as a member function. -(2) Declare global operators == and !=. - -(1) simply works. There will come a time, however, when (1) -won't satisfy your needs. If A == B, then B == A. You can't -do this using member functions if A and B are from different -classes. - -If you choose (2), you must add the != operator to the std -namespace. There are two ways to do this. First, you can do -this: - namespace std - { - inline operator != ( const MyClass &rLhs, const MyClass &rRhs ) - { - return ::operator != ( rLhs, rRhs ); - } - } -This "routes" != from the std namespace to the global namespace. - -Note that ( lhs != rhs ) can be derived from the == operator -as !( lhs == rhs ). There is a macro in STL.H, -STL_DECLARE_GLOBAL_NE, that does this derivation. -This derivation will not work when for whatever reason, !(lhs == rhs) -is not the same as ( lhs != rhs ). - -The following example shows what you have to do for find(). Other -algorithms require you to declare <, <=, and >= too. See the -macros STL_DECLARE_GLOBAL_GE, STL_DECLARE_GLOBAL_LT, and -STL_GLOBAL_LE. These macros derive new comparison operators -from "operator <( const T&, const T& )". - -class MyClass -{ - public: - - int units; - CString description; -}; - -// We want to be able to test two MyClass objects against each other -// in STL. Need to create a global operator for this purpose. -// Since we use find(), we need to declare not-equal too. -bool operator == ( const MyClass &, const MyClass & ); -STL_DECLARE_GLOBAL_NE( MyClass, MyClass ) - -// These operators test for a matching description. -// We do A == B and B == A to be consistent. -bool operator == ( const MyClass&, const CString & ); -bool operator == ( const CString&, const MyClass & ); -STL_DECLARE_GLOBAL_NE( MyClass, CString ) -STL_DECLARE_GLOBAL_NE( CString, MyClass ) - -6. Errors when creating vectors that have vectors and deques - that have deques. - - Solution: Provide atruments to the constructor. - - std::vector< std::vector<int> > - TwoDimensional( 0, std::vector<int>() ); - diff --git a/STL/algo.h b/STL/algo.h deleted file mode 100644 index 3e91b1375a3..00000000000 --- a/STL/algo.h +++ /dev/null @@ -1,2593 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef ALGO_H -#define ALGO_H - -#include <stdlib.h> -#include <bool.h> -#include <pair.h> -#include <iterator.h> -#include <algobase.h> -#include <heap.h> -#include <tempbuf.h> - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class T> -inline T __median(T a, T b, T c) { - if (a < b) - if (b < c) - return b; - else if (a < c) - return c; - else - return a; - else if (a < c) - return a; - else if (b < c) - return c; - else - return b; -} - -template <class T, class Compare> -inline T __median(T a, T b, T c, Compare comp) { - if (comp(a, b)) - if (comp(b, c)) - return b; - else if (comp(a, c)) - return c; - else - return a; - else if (comp(a, c)) - return a; - else if (comp(b, c)) - return c; - else - return b; -} - -template <class InputIterator, class Function> -Function for_each(InputIterator first, InputIterator last, Function f) { - while (first != last) f(*first++); - return f; -} - -template <class InputIterator, class T> -InputIterator find(InputIterator first, InputIterator last, const T& value) { - while (first != last && *first != value) ++first; - return first; -} - -template <class InputIterator, class Predicate> -InputIterator find_if(InputIterator first, InputIterator last, - Predicate pred) { - while (first != last && !pred(*first)) ++first; - return first; -} - -template <class InputIterator> -InputIterator adjacent_find(InputIterator first, InputIterator last) { - if (first == last) return last; - InputIterator next = first; - while(++next != last) { - if (*first == *next) return first; - first = next; - } - return last; -} - -template <class InputIterator, class BinaryPredicate> -InputIterator adjacent_find(InputIterator first, InputIterator last, - BinaryPredicate binary_pred) { - if (first == last) return last; - InputIterator next = first; - while(++next != last) { - if (binary_pred(*first, *next)) return first; - first = next; - } - return last; -} - -template <class InputIterator, class T, class Size> -void count(InputIterator first, InputIterator last, const T& value, - Size& n) { - while (first != last) - if (*first++ == value) ++n; -} - -template <class InputIterator, class Predicate, class Size> -void count_if(InputIterator first, InputIterator last, Predicate pred, - Size& n) { - while (first != last) - if (pred(*first++)) ++n; -} - -template <class ForwardIterator1, class ForwardIterator2, class Distance> -ForwardIterator1 __search(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, ForwardIterator2 last2, - Distance*) { - Distance d1 = 0; - distance(first1, last1, d1); - Distance d2 = 0; - distance(first2, last2, d2); - - if (d1 < d2) return last1; - - ForwardIterator1 current1 = first1; - ForwardIterator2 current2 = first2; - - while (current2 != last2) - if (*current1++ != *current2++) - if (d1-- == d2) - return last1; - else { - current1 = ++first1; - current2 = first2; - } - return (current2 == last2) ? first1 : last1; -} - -template <class ForwardIterator1, class ForwardIterator2> -inline ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, ForwardIterator2 last2) -{ - return __search(first1, last1, first2, last2, distance_type(first1)); -} - -template <class ForwardIterator1, class ForwardIterator2, - class BinaryPredicate, class Distance> -ForwardIterator1 __search(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, ForwardIterator2 last2, - BinaryPredicate binary_pred, Distance*) { - Distance d1 = 0; - distance(first1, last1, d1); - Distance d2 = 0; - distance(first2, last2, d2); - - if (d1 < d2) return last1; - - ForwardIterator1 current1 = first1; - ForwardIterator2 current2 = first2; - - while (current2 != last2) - if (!binary_pred(*current1++, *current2++)) - if (d1-- == d2) - return last1; - else { - current1 = ++first1; - current2 = first2; - } - return (current2 == last2) ? first1 : last1; -} - -template <class ForwardIterator1, class ForwardIterator2, - class BinaryPredicate> -inline ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, ForwardIterator2 last2, - BinaryPredicate binary_pred) { - return __search(first1, last1, first2, last2, binary_pred, - distance_type(first1)); -} - -template <class ForwardIterator1, class ForwardIterator2> -ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2) { - while (first1 != last1) iter_swap(first1++, first2++); - return first2; -} - -template <class InputIterator, class OutputIterator, class UnaryOperation> -OutputIterator transform(InputIterator first, InputIterator last, - OutputIterator result, UnaryOperation op) { - while (first != last) *result++ = op(*first++); - return result; -} - -template <class InputIterator1, class InputIterator2, class OutputIterator, - class BinaryOperation> -OutputIterator transform(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, OutputIterator result, - BinaryOperation binary_op) { - while (first1 != last1) *result++ = binary_op(*first1++, *first2++); - return result; -} - -template <class ForwardIterator, class T> -void replace(ForwardIterator first, ForwardIterator last, const T& old_value, - const T& new_value) { - while (first != last) { - if (*first == old_value) *first = new_value; - ++first; - } -} - -template <class ForwardIterator, class Predicate, class T> -void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, - const T& new_value) { - while (first != last) { - if (pred(*first)) *first = new_value; - ++first; - } -} - -template <class InputIterator, class OutputIterator, class T> -OutputIterator replace_copy(InputIterator first, InputIterator last, - OutputIterator result, const T& old_value, - const T& new_value) { - while (first != last) { - *result++ = *first == old_value ? new_value : *first; - ++first; - } - return result; -} - -template <class Iterator, class OutputIterator, class Predicate, class T> -OutputIterator replace_copy_if(Iterator first, Iterator last, - OutputIterator result, Predicate pred, - const T& new_value) { - while (first != last) { - *result++ = pred(*first) ? new_value : *first; - ++first; - } - return result; -} - -template <class ForwardIterator, class Generator> -void generate(ForwardIterator first, ForwardIterator last, Generator gen) { - while (first != last) *first++ = gen(); -} - -template <class OutputIterator, class Size, class Generator> -void generate_n(OutputIterator first, Size n, Generator gen) { - while (n-- > 0) *first++ = gen(); -} - -template <class InputIterator, class OutputIterator, class T> -OutputIterator remove_copy(InputIterator first, InputIterator last, - OutputIterator result, const T& value) { - while (first != last) { - if (*first != value) *result++ = *first; - ++first; - } - return result; -} - -template <class InputIterator, class OutputIterator, class Predicate> -OutputIterator remove_copy_if(InputIterator first, InputIterator last, - OutputIterator result, Predicate pred) { - while (first != last) { - if (!pred(*first)) *result++ = *first; - ++first; - } - return result; -} - -template <class ForwardIterator, class T> -ForwardIterator remove(ForwardIterator first, ForwardIterator last, - const T& value) { - first = find(first, last, value); - ForwardIterator next = first; - return first == last ? first : remove_copy(++next, last, first, value); -} - -template <class ForwardIterator, class Predicate> -ForwardIterator remove_if(ForwardIterator first, ForwardIterator last, - Predicate pred) { - first = find_if(first, last, pred); - ForwardIterator next = first; - return first == last ? first : remove_copy_if(++next, last, first, pred); -} - -template <class InputIterator, class ForwardIterator> -ForwardIterator __unique_copy(InputIterator first, InputIterator last, - ForwardIterator result, forward_iterator_tag) { - *result = *first; - while (++first != last) - if (*result != *first) *++result = *first; - return ++result; -} - -template <class InputIterator, class BidirectionalIterator> -inline BidirectionalIterator __unique_copy(InputIterator first, - InputIterator last, - BidirectionalIterator result, - bidirectional_iterator_tag) { - return __unique_copy(first, last, result, forward_iterator_tag()); -} - -template <class InputIterator, class RandomAccessIterator> -inline RandomAccessIterator __unique_copy(InputIterator first, - InputIterator last, - RandomAccessIterator result, - random_access_iterator_tag) { - return __unique_copy(first, last, result, forward_iterator_tag()); -} - -template <class InputIterator, class OutputIterator, class T> -OutputIterator __unique_copy(InputIterator first, InputIterator last, - OutputIterator result, T*) { - T value = *first; - *result = value; - while (++first != last) - if (value != *first) { - value = *first; - *++result = value; - } - return ++result; -} - -template <class InputIterator, class OutputIterator> -inline OutputIterator __unique_copy(InputIterator first, InputIterator last, - OutputIterator result, - output_iterator_tag) { - return __unique_copy(first, last, result, value_type(first)); -} - -template <class InputIterator, class OutputIterator> -inline OutputIterator unique_copy(InputIterator first, InputIterator last, - OutputIterator result) { - if (first == last) return result; - return __unique_copy(first, last, result, iterator_category(result)); -} -template <class InputIterator, class ForwardIterator, class BinaryPredicate> -ForwardIterator __unique_copy(InputIterator first, InputIterator last, - ForwardIterator result, - BinaryPredicate binary_pred, - forward_iterator_tag) { - *result = *first; - while (++first != last) - if (!binary_pred(*result, *first)) *++result = *first; - return ++result; -} - -template <class InputIterator, class BidirectionalIterator, - class BinaryPredicate> -inline BidirectionalIterator __unique_copy(InputIterator first, - InputIterator last, - BidirectionalIterator result, - BinaryPredicate binary_pred, - bidirectional_iterator_tag) { - return __unique_copy(first, last, result, binary_pred, - forward_iterator_tag()); -} - -template <class InputIterator, class RandomAccessIterator, - class BinaryPredicate> -inline RandomAccessIterator __unique_copy(InputIterator first, - InputIterator last, - RandomAccessIterator result, - BinaryPredicate binary_pred, - random_access_iterator_tag) { - return __unique_copy(first, last, result, binary_pred, - forward_iterator_tag()); -} - -template <class InputIterator, class OutputIterator, class BinaryPredicate, - class T> -OutputIterator __unique_copy(InputIterator first, InputIterator last, - OutputIterator result, - BinaryPredicate binary_pred, T*) { - T value = *first; - *result = value; - while (++first != last) - if (!binary_pred(value, *first)) { - value = *first; - *++result = value; - } - return ++result; -} - -template <class InputIterator, class OutputIterator, class BinaryPredicate> -inline OutputIterator __unique_copy(InputIterator first, InputIterator last, - OutputIterator result, - BinaryPredicate binary_pred, - output_iterator_tag) { - return __unique_copy(first, last, result, binary_pred, value_type(first)); -} - -template <class InputIterator, class OutputIterator, class BinaryPredicate> -inline OutputIterator unique_copy(InputIterator first, InputIterator last, - OutputIterator result, - BinaryPredicate binary_pred) { - if (first == last) return result; - return __unique_copy(first, last, result, binary_pred, - iterator_category(result)); -} - -template <class ForwardIterator> -ForwardIterator unique(ForwardIterator first, ForwardIterator last) { - first = adjacent_find(first, last); - return unique_copy(first, last, first); -} - -template <class ForwardIterator, class BinaryPredicate> -ForwardIterator unique(ForwardIterator first, ForwardIterator last, - BinaryPredicate binary_pred) { - first = adjacent_find(first, last, binary_pred); - return unique_copy(first, last, first, binary_pred); -} - -template <class BidirectionalIterator> -void __reverse(BidirectionalIterator first, BidirectionalIterator last, - bidirectional_iterator_tag) { - while (true) - if (first == last || first == --last) - return; - else - iter_swap(first++, last); -} - -template <class RandomAccessIterator> -void __reverse(RandomAccessIterator first, RandomAccessIterator last, - random_access_iterator_tag) { - while (first < last) iter_swap(first++, --last); -} - -template <class BidirectionalIterator> -inline void reverse(BidirectionalIterator first, BidirectionalIterator last) { - __reverse(first, last, iterator_category(first)); -} - -template <class BidirectionalIterator, class OutputIterator> -OutputIterator reverse_copy(BidirectionalIterator first, - BidirectionalIterator last, - OutputIterator result) { - while (first != last) *result++ = *--last; - return result; -} - -template <class ForwardIterator, class Distance> -void __rotate(ForwardIterator first, ForwardIterator middle, - ForwardIterator last, Distance*, forward_iterator_tag) { - for (ForwardIterator i = middle; ;) { - iter_swap(first++, i++); - if (first == middle) { - if (i == last) return; - middle = i; - } else if (i == last) - i = middle; - } -} - -template <class BidirectionalIterator, class Distance> -void __rotate(BidirectionalIterator first, BidirectionalIterator middle, - BidirectionalIterator last, Distance*, - bidirectional_iterator_tag) { - reverse(first, middle); - reverse(middle, last); - reverse(first, last); -} - -template <class EuclideanRingElement> -EuclideanRingElement __gcd(EuclideanRingElement m, EuclideanRingElement n) -{ - while (n != 0) { - EuclideanRingElement t = m % n; - m = n; - n = t; - } - return m; -} - -template <class RandomAccessIterator, class Distance, class T> -void __rotate_cycle(RandomAccessIterator first, RandomAccessIterator last, - RandomAccessIterator initial, Distance shift, T*) { - T value = *initial; - RandomAccessIterator ptr1 = initial; - RandomAccessIterator ptr2 = ptr1 + shift; - while (ptr2 != initial) { - *ptr1 = *ptr2; - ptr1 = ptr2; - if (last - ptr2 > shift) - ptr2 += shift; - else - ptr2 = first + (shift - (last - ptr2)); - } - *ptr1 = value; -} - -template <class RandomAccessIterator, class Distance> -void __rotate(RandomAccessIterator first, RandomAccessIterator middle, - RandomAccessIterator last, Distance*, - random_access_iterator_tag) { - Distance n = __gcd(last - first, middle - first); - while (n--) - __rotate_cycle(first, last, first + n, middle - first, - value_type(first)); -} - -template <class ForwardIterator> -inline void rotate(ForwardIterator first, ForwardIterator middle, - ForwardIterator last) { - if (first == middle || middle == last) return; - __rotate(first, middle, last, distance_type(first), - iterator_category(first)); -} - -template <class ForwardIterator, class OutputIterator> -OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle, - ForwardIterator last, OutputIterator result) { - return copy(first, middle, copy(middle, last, result)); -} - -unsigned long __long_random(unsigned long); - -template <class RandomAccessIterator, class Distance> -void __random_shuffle(RandomAccessIterator first, RandomAccessIterator last, - Distance*) { - if (first == last) return; - for (RandomAccessIterator i = first + 1; i != last; ++i) - iter_swap(i, first + Distance(__long_random((i - first) + 1))); -} - -template <class RandomAccessIterator> -inline void random_shuffle(RandomAccessIterator first, - RandomAccessIterator last) { - __random_shuffle(first, last, distance_type(first)); -} - -template <class RandomAccessIterator, class RandomNumberGenerator> -void random_shuffle(RandomAccessIterator first, RandomAccessIterator last, - RandomNumberGenerator& rand) { - if (first == last) return; - for (RandomAccessIterator i = first + 1; i != last; ++i) - iter_swap(i, first + rand((i - first) + 1)); -} - -template <class BidirectionalIterator, class Predicate> -BidirectionalIterator partition(BidirectionalIterator first, - BidirectionalIterator last, Predicate pred) { - while (true) { - while (true) - if (first == last) - return first; - else if (pred(*first)) - ++first; - else - break; - --last; - while (true) - if (first == last) - return first; - else if (!pred(*last)) - --last; - else - break; - iter_swap(first, last); - ++first; - } -} - -template <class ForwardIterator, class Predicate, class Distance> -ForwardIterator __inplace_stable_partition(ForwardIterator first, - ForwardIterator last, - Predicate pred, Distance len) { - if (len == 1) return pred(*first) ? last : first; - ForwardIterator middle = first; - advance(middle, len / 2); - ForwardIterator - first_cut = __inplace_stable_partition(first, middle, pred, len / 2); - ForwardIterator - second_cut = __inplace_stable_partition(middle, last, pred, - len - len / 2); - rotate(first_cut, middle, second_cut); - len = 0; - distance(middle, second_cut, len); - advance(first_cut, len); - return first_cut; -} - -template <class ForwardIterator, class Pointer, class Predicate, - class Distance, class T> -ForwardIterator __stable_partition_adaptive(ForwardIterator first, - ForwardIterator last, - Predicate pred, Distance len, - Pointer buffer, - Distance buffer_size, - Distance& fill_pointer, T*) { - if (len <= buffer_size) { - len = 0; - ForwardIterator result1 = first; - Pointer result2 = buffer; - while (first != last && len < fill_pointer) - if (pred(*first)) - *result1++ = *first++; - else { - *result2++ = *first++; - ++len; - } - if (first != last) { - raw_storage_iterator<Pointer, T> result3 = result2; - while (first != last) - if (pred(*first)) - *result1++ = *first++; - else { - *result3++ = *first++; - ++len; - } - fill_pointer = len; - } - copy(buffer, buffer + len, result1); - return result1; - } - ForwardIterator middle = first; - advance(middle, len / 2); - ForwardIterator first_cut = __stable_partition_adaptive - (first, middle, pred, len / 2, buffer, buffer_size, fill_pointer, - (T*)0); - ForwardIterator second_cut = __stable_partition_adaptive - (middle, last, pred, len - len / 2, buffer, buffer_size, - fill_pointer, (T*)0); - rotate(first_cut, middle, second_cut); - len = 0; - distance(middle, second_cut, len); - advance(first_cut, len); - return first_cut; -} - -template <class ForwardIterator, class Predicate, class Pointer, - class Distance> -ForwardIterator __stable_partition(ForwardIterator first, ForwardIterator last, - Predicate pred, Distance len, - pair<Pointer, Distance> p) { - if (p.first == 0) - return __inplace_stable_partition(first, last, pred, len); - Distance fill_pointer = 0; - ForwardIterator result = - __stable_partition_adaptive(first, last, pred, len, p.first, p.second, - fill_pointer, value_type(first)); - destroy(p.first, p.first + fill_pointer); - return_temporary_buffer(p.first); - return result; -} - -template <class ForwardIterator, class Predicate, class Distance> -inline ForwardIterator __stable_partition_aux(ForwardIterator first, - ForwardIterator last, - Predicate pred, Distance*) { - Distance len = 0; - distance(first, last, len); - return __stable_partition(first, last, pred, len, - get_temporary_buffer(len, value_type(first))); -} - -template <class ForwardIterator, class Predicate> -inline ForwardIterator stable_partition(ForwardIterator first, - ForwardIterator last, - Predicate pred) { - return __stable_partition_aux(first, last, pred, distance_type(first)); -} - -template <class RandomAccessIterator, class T> -RandomAccessIterator __unguarded_partition(RandomAccessIterator first, - RandomAccessIterator last, - T pivot) { - while (1) { - while (*first < pivot) ++first; - --last; - while (pivot < *last) --last; - if (!(first < last)) return first; - iter_swap(first, last); - ++first; - } -} - -template <class RandomAccessIterator, class T, class Compare> -RandomAccessIterator __unguarded_partition(RandomAccessIterator first, - RandomAccessIterator last, - T pivot, Compare comp) { - while (1) { - while (comp(*first, pivot)) ++first; - --last; - while (comp(pivot, *last)) --last; - if (!(first < last)) return first; - iter_swap(first, last); - ++first; - } -} - -const int __stl_threshold = 16; - -template <class RandomAccessIterator, class T> -void __quick_sort_loop_aux(RandomAccessIterator first, - RandomAccessIterator last, T*) { - while (last - first > __stl_threshold) { - RandomAccessIterator cut = __unguarded_partition - (first, last, T(__median(*first, *(first + (last - first)/2), - *(last - 1)))); - if (cut - first >= last - cut) { - __quick_sort_loop(cut, last); - last = cut; - } else { - __quick_sort_loop(first, cut); - first = cut; - } - } -} - -template <class RandomAccessIterator> -inline void __quick_sort_loop(RandomAccessIterator first, - RandomAccessIterator last) { - __quick_sort_loop_aux(first, last, value_type(first)); -} - -template <class RandomAccessIterator, class T, class Compare> -void __quick_sort_loop_aux(RandomAccessIterator first, - RandomAccessIterator last, T*, Compare comp) { - while (last - first > __stl_threshold) { - RandomAccessIterator cut = __unguarded_partition - (first, last, T(__median(*first, *(first + (last - first)/2), - *(last - 1), comp)), comp); - if (cut - first >= last - cut) { - __quick_sort_loop(cut, last, comp); - last = cut; - } else { - __quick_sort_loop(first, cut, comp); - first = cut; - } - } -} - -template <class RandomAccessIterator, class Compare> -inline void __quick_sort_loop(RandomAccessIterator first, - RandomAccessIterator last, Compare comp) { - __quick_sort_loop_aux(first, last, value_type(first), comp); -} - -template <class RandomAccessIterator, class T> -void __unguarded_linear_insert(RandomAccessIterator last, T value) { - RandomAccessIterator next = last; - --next; - while (value < *next) { - *last = *next; - last = next--; - } - *last = value; -} - -template <class RandomAccessIterator, class T, class Compare> -void __unguarded_linear_insert(RandomAccessIterator last, T value, - Compare comp) { - RandomAccessIterator next = last; - --next; - while (comp(value , *next)) { - *last = *next; - last = next--; - } - *last = value; -} - -template <class RandomAccessIterator, class T> -inline void __linear_insert(RandomAccessIterator first, - RandomAccessIterator last, T*) { - T value = *last; - if (value < *first) { - copy_backward(first, last, last + 1); - *first = value; - } else - __unguarded_linear_insert(last, value); -} - -template <class RandomAccessIterator, class T, class Compare> -inline void __linear_insert(RandomAccessIterator first, - RandomAccessIterator last, T*, Compare comp) { - T value = *last; - if (comp(value, *first)) { - copy_backward(first, last, last + 1); - *first = value; - } else - __unguarded_linear_insert(last, value, comp); -} - -template <class RandomAccessIterator> -void __insertion_sort(RandomAccessIterator first, RandomAccessIterator last) { - if (first == last) return; - for (RandomAccessIterator i = first + 1; i != last; ++i) - __linear_insert(first, i, value_type(first)); -} - -template <class RandomAccessIterator, class Compare> -void __insertion_sort(RandomAccessIterator first, - RandomAccessIterator last, Compare comp) { - if (first == last) return; - for (RandomAccessIterator i = first + 1; i != last; ++i) - __linear_insert(first, i, value_type(first), comp); -} - -template <class RandomAccessIterator, class T> -void __unguarded_insertion_sort_aux(RandomAccessIterator first, - RandomAccessIterator last, T*) { - for (RandomAccessIterator i = first; i != last; ++i) - __unguarded_linear_insert(i, T(*i)); -} - -template <class RandomAccessIterator> -inline void __unguarded_insertion_sort(RandomAccessIterator first, - RandomAccessIterator last) { - __unguarded_insertion_sort_aux(first, last, value_type(first)); -} - -template <class RandomAccessIterator, class T, class Compare> -void __unguarded_insertion_sort_aux(RandomAccessIterator first, - RandomAccessIterator last, - T*, Compare comp) { - for (RandomAccessIterator i = first; i != last; ++i) - __unguarded_linear_insert(i, T(*i), comp); -} - -template <class RandomAccessIterator, class Compare> -inline void __unguarded_insertion_sort(RandomAccessIterator first, - RandomAccessIterator last, - Compare comp) { - __unguarded_insertion_sort_aux(first, last, value_type(first), comp); -} - -template <class RandomAccessIterator> -void __final_insertion_sort(RandomAccessIterator first, - RandomAccessIterator last) { - if (last - first > __stl_threshold) { - __insertion_sort(first, first + __stl_threshold); - __unguarded_insertion_sort(first + __stl_threshold, last); - } else - __insertion_sort(first, last); -} - -template <class RandomAccessIterator, class Compare> -void __final_insertion_sort(RandomAccessIterator first, - RandomAccessIterator last, Compare comp) { - if (last - first > __stl_threshold) { - __insertion_sort(first, first + __stl_threshold, comp); - __unguarded_insertion_sort(first + __stl_threshold, last, comp); - } else - __insertion_sort(first, last, comp); -} - -template <class RandomAccessIterator> -void sort(RandomAccessIterator first, RandomAccessIterator last) { - __quick_sort_loop(first, last); - __final_insertion_sort(first, last); -} - -template <class RandomAccessIterator, class Compare> -void sort(RandomAccessIterator first, RandomAccessIterator last, - Compare comp) { - __quick_sort_loop(first, last, comp); - __final_insertion_sort(first, last, comp); -} - -template <class RandomAccessIterator> -void __inplace_stable_sort(RandomAccessIterator first, - RandomAccessIterator last) { - if (last - first < 15) { - __insertion_sort(first, last); - return; - } - RandomAccessIterator middle = first + (last - first) / 2; - __inplace_stable_sort(first, middle); - __inplace_stable_sort(middle, last); - __merge_without_buffer(first, middle, last, middle - first, last - middle); -} - -template <class RandomAccessIterator, class Compare> -void __inplace_stable_sort(RandomAccessIterator first, - RandomAccessIterator last, Compare comp) { - if (last - first < 15) { - __insertion_sort(first, last, comp); - return; - } - RandomAccessIterator middle = first + (last - first) / 2; - __inplace_stable_sort(first, middle, comp); - __inplace_stable_sort(middle, last, comp); - __merge_without_buffer(first, middle, last, middle - first, - last - middle, comp); -} - -template <class RandomAccessIterator1, class RandomAccessIterator2, - class RandomAccessIterator3, class Distance, class T> -RandomAccessIterator3 __merge_aux(RandomAccessIterator1 first1, - RandomAccessIterator1 last1, - RandomAccessIterator2 first2, - RandomAccessIterator2 last2, - RandomAccessIterator3 result, - Distance& fill_pointer, T*){ - Distance len = 0; - while (first1 != last1 && first2 != last2 && len < fill_pointer) { - ++len; - if (*first2 < *first1) - *result++ = *first2++; - else - *result++ = *first1++; - } - if (fill_pointer == len) { - raw_storage_iterator<RandomAccessIterator3, T> p = result; - result += (last1 - first1) + (last2 - first2); - fill_pointer += (last1 - first1) + (last2 - first2); - while (first1 != last1 && first2 != last2) - if (*first2 < *first1) - *p++ = *first2++; - else - *p++ = *first1++; - copy(first2, last2, copy(first1, last1, p)); - } else if (first2 == last2) { - while (first1 != last1 && len < fill_pointer) { - ++len; - *result++ = *first1++; - } - if (fill_pointer == len) { - raw_storage_iterator<RandomAccessIterator3, T> p = result; - result += last1 - first1; - fill_pointer += last1 - first1; - while (first1 != last1) *p++ = *first1++; - } - } else { - while (first2 != last2 && len < fill_pointer) { - ++len; - *result++ = *first2++; - } - if (fill_pointer == len) { - raw_storage_iterator<RandomAccessIterator3, T> p = result; - result += last2 - first2; - fill_pointer += last2 - first2; - while (first2 != last2) *p++ = *first2++; - } - } - return result; -} - -template <class RandomAccessIterator1, class RandomAccessIterator2, - class RandomAccessIterator3, class Distance, class T, class Compare> -RandomAccessIterator3 __merge_aux(RandomAccessIterator1 first1, - RandomAccessIterator1 last1, - RandomAccessIterator2 first2, - RandomAccessIterator2 last2, - RandomAccessIterator3 result, - Distance& fill_pointer, T*, Compare comp){ - Distance len = 0; - while (first1 != last1 && first2 != last2 && len < fill_pointer) { - ++len; - if (comp(*first2, *first1)) - *result++ = *first2++; - else - *result++ = *first1++; - } - if (fill_pointer <= len) { - raw_storage_iterator<RandomAccessIterator3, T> p = result; - result += (last1 - first1) + (last2 - first2); - fill_pointer += (last1 - first1) + (last2 - first2); - while (first1 != last1 && first2 != last2) - if (comp(*first2, *first1)) - *p++ = *first2++; - else - *p++ = *first1++; - copy(first2, last2, copy(first1, last1, p)); - } else if (first2 == last2) { - while (first1 != last1 && len < fill_pointer) { - ++len; - *result++ = *first1++; - } - if (fill_pointer == len) { - raw_storage_iterator<RandomAccessIterator3, T> p = result; - result += last1 - first1; - fill_pointer += last1 - first1; - while (first1 != last1) *p++ = *first1++; - } - } else { - while (first2 != last2 && len < fill_pointer) { - ++len; - *result++ = *first2++; - } - if (fill_pointer == len) { - raw_storage_iterator<RandomAccessIterator3, T> p = result; - result += last2 - first2; - fill_pointer += last2 - first2; - while (first2 != last2) *p++ = *first2++; - } - } - return result; -} - -template <class RandomAccessIterator1, class RandomAccessIterator2, - class Distance, class T> -void __merge_sort_loop_aux(RandomAccessIterator1 first, - RandomAccessIterator1 last, - RandomAccessIterator2 result, Distance step_size, - Distance& fill_pointer, T*) { - Distance two_step = 2 * step_size; - - while (last - first >= two_step) { - result = __merge_aux(first, first + step_size, first + step_size, - first + two_step, result, fill_pointer, (T*)0); - first += two_step; - } - step_size = min(Distance(last - first), step_size); - - __merge_aux(first, first + step_size, first + step_size, last, result, - fill_pointer, (T*)0); -} - -template <class RandomAccessIterator1, class RandomAccessIterator2, - class Distance, class T, class Compare> -void __merge_sort_loop_aux(RandomAccessIterator1 first, - RandomAccessIterator1 last, - RandomAccessIterator2 result, Distance step_size, - Distance& fill_pointer, T*, Compare comp) { - Distance two_step = 2 * step_size; - - while (last - first >= two_step) { - result = __merge_aux(first, first + step_size, first + step_size, - first + two_step, result, fill_pointer, (T*)0, - comp); - first += two_step; - } - step_size = min(Distance(last - first), step_size); - - __merge_aux(first, first + step_size, first + step_size, last, result, - fill_pointer, (T*)0, comp); -} - -template <class RandomAccessIterator1, class RandomAccessIterator2, - class Distance> -void __merge_sort_loop(RandomAccessIterator1 first, - RandomAccessIterator1 last, - RandomAccessIterator2 result, Distance step_size) { - Distance two_step = 2 * step_size; - - while (last - first >= two_step) { - result = merge(first, first + step_size, - first + step_size, first + two_step, result); - first += two_step; - } - step_size = min(Distance(last - first), step_size); - - merge(first, first + step_size, first + step_size, last, result); -} - -template <class RandomAccessIterator1, class RandomAccessIterator2, - class Distance, class Compare> -void __merge_sort_loop(RandomAccessIterator1 first, - RandomAccessIterator1 last, - RandomAccessIterator2 result, Distance step_size, - Compare comp) { - Distance two_step = 2 * step_size; - - while (last - first >= two_step) { - result = merge(first, first + step_size, - first + step_size, first + two_step, result, comp); - first += two_step; - } - step_size = min(Distance(last - first), step_size); - - merge(first, first + step_size, first + step_size, last, result, comp); -} - -const int __stl_chunk_size = 7; - -template <class RandomAccessIterator, class Distance> -void __chunk_insertion_sort(RandomAccessIterator first, - RandomAccessIterator last, Distance chunk_size) { - while (last - first >= chunk_size) { - __insertion_sort(first, first + chunk_size); - first += chunk_size; - } - __insertion_sort(first, last); -} - -template <class RandomAccessIterator, class Distance, class Compare> -void __chunk_insertion_sort(RandomAccessIterator first, - RandomAccessIterator last, - Distance chunk_size, Compare comp) { - while (last - first >= chunk_size) { - __insertion_sort(first, first + chunk_size, comp); - first += chunk_size; - } - __insertion_sort(first, last, comp); -} - -template <class RandomAccessIterator, class Pointer, class Distance, class T> -void __merge_sort_with_buffer(RandomAccessIterator first, - RandomAccessIterator last, - Pointer buffer, Distance& fill_pointer, T*) { - Distance len = last - first; - Pointer buffer_last = buffer + len; - - Distance step_size = __stl_chunk_size; - __chunk_insertion_sort(first, last, step_size); - while (step_size < len) { - __merge_sort_loop_aux(first, last, buffer, step_size, fill_pointer, - (T*)0); - step_size *= 2; - __merge_sort_loop(buffer, buffer_last, first, step_size); - step_size *= 2; - } -} - -template <class RandomAccessIterator, class Pointer, class Distance, class T, - class Compare> -void __merge_sort_with_buffer(RandomAccessIterator first, - RandomAccessIterator last, - Pointer buffer, Distance& fill_pointer, - T*, Compare comp) { - Distance len = last - first; - Pointer buffer_last = buffer + len; - - Distance step_size = __stl_chunk_size; - __chunk_insertion_sort(first, last, step_size, comp); - - while (step_size < len) { - __merge_sort_loop_aux(first, last, buffer, step_size, fill_pointer, - (T*)0, comp); - step_size *= 2; - __merge_sort_loop(buffer, buffer_last, first, step_size, comp); - step_size *= 2; - } -} - -template <class RandomAccessIterator, class Pointer, class Distance, class T> -void __stable_sort_adaptive(RandomAccessIterator first, - RandomAccessIterator last, Pointer buffer, - Distance buffer_size, Distance& fill_pointer, T*) { - Distance len = (last - first + 1) / 2; - RandomAccessIterator middle = first + len; - if (len > buffer_size) { - __stable_sort_adaptive(first, middle, buffer, buffer_size, - fill_pointer, (T*)0); - __stable_sort_adaptive(middle, last, buffer, buffer_size, - fill_pointer, (T*)0); - } else { - __merge_sort_with_buffer(first, middle, buffer, fill_pointer, (T*)0); - __merge_sort_with_buffer(middle, last, buffer, fill_pointer, (T*)0); - } - __merge_adaptive(first, middle, last, Distance(middle - first), - Distance(last - middle), buffer, buffer_size, - fill_pointer, (T*)0); -} - -template <class RandomAccessIterator, class Pointer, class Distance, class T, - class Compare> -void __stable_sort_adaptive(RandomAccessIterator first, - RandomAccessIterator last, Pointer buffer, - Distance buffer_size, Distance& fill_pointer, - T*, Compare comp) { - Distance len = (last - first + 1) / 2; - RandomAccessIterator middle = first + len; - if (len > buffer_size) { - __stable_sort_adaptive(first, middle, buffer, buffer_size, - fill_pointer, (T*)0, comp); - __stable_sort_adaptive(middle, last, buffer, buffer_size, - fill_pointer, (T*)0, comp); - } else { - __merge_sort_with_buffer(first, middle, buffer, fill_pointer, - (T*)0, comp); - __merge_sort_with_buffer(middle, last, buffer, fill_pointer, - (T*)0, comp); - } - __merge_adaptive(first, middle, last, Distance(middle - first), - Distance(last - middle), buffer, buffer_size, - fill_pointer, (T*)0, comp); -} - -template <class RandomAccessIterator, class Pointer, class Distance> -inline void __stable_sort(RandomAccessIterator first, - RandomAccessIterator last, - pair<Pointer, Distance> p) { - if (p.first == 0) { - __inplace_stable_sort(first, last); - return; - } - Distance fill_pointer = 0; - __stable_sort_adaptive(first, last, p.first, p.second, fill_pointer, - value_type(first)); - destroy(p.first, p.first + fill_pointer); - return_temporary_buffer(p.first); -} - -template <class RandomAccessIterator, class Pointer, class Distance, - class Compare> -inline void __stable_sort(RandomAccessIterator first, - RandomAccessIterator last, - pair<Pointer, Distance> p, Compare comp) { - if (p.first == 0) { - __inplace_stable_sort(first, last, comp); - return; - } - Distance fill_pointer = 0; - __stable_sort_adaptive(first, last, p.first, p.second, fill_pointer, - value_type(first), comp); - destroy(p.first, p.first + fill_pointer); - return_temporary_buffer(p.first); -} - -template <class RandomAccessIterator, class Distance> -inline void __stable_sort_aux(RandomAccessIterator first, - RandomAccessIterator last, Distance*) { - __stable_sort(first, last, get_temporary_buffer(Distance(last - first), - value_type(first))); -} - -template <class RandomAccessIterator, class Distance, class Compare> -inline void __stable_sort_aux(RandomAccessIterator first, - RandomAccessIterator last, Distance*, - Compare comp) { - __stable_sort(first, last, get_temporary_buffer(Distance(last - first), - value_type(first)), comp); -} - -template <class RandomAccessIterator> -inline void stable_sort(RandomAccessIterator first, - RandomAccessIterator last) { - __stable_sort_aux(first, last, distance_type(first)); -} - -template <class RandomAccessIterator, class Compare> -inline void stable_sort(RandomAccessIterator first, - RandomAccessIterator last, Compare comp) { - __stable_sort_aux(first, last, distance_type(first), comp); -} - -template <class RandomAccessIterator, class T> -void __partial_sort(RandomAccessIterator first, RandomAccessIterator middle, - RandomAccessIterator last, T*) { - make_heap(first, middle); - for (RandomAccessIterator i = middle; i < last; ++i) - if (*i < *first) - __pop_heap(first, middle, i, T(*i), distance_type(first)); - sort_heap(first, middle); -} - -template <class RandomAccessIterator> -inline void partial_sort(RandomAccessIterator first, - RandomAccessIterator middle, - RandomAccessIterator last) { - __partial_sort(first, middle, last, value_type(first)); -} - -template <class RandomAccessIterator, class T, class Compare> -void __partial_sort(RandomAccessIterator first, RandomAccessIterator middle, - RandomAccessIterator last, T*, Compare comp) { - make_heap(first, middle, comp); - for (RandomAccessIterator i = middle; i < last; ++i) - if (*i < *first) - __pop_heap(first, middle, i, T(*i), comp, distance_type(first)); - sort_heap(first, middle, comp); -} - -template <class RandomAccessIterator, class Compare> -inline void partial_sort(RandomAccessIterator first, - RandomAccessIterator middle, - RandomAccessIterator last, Compare comp) { - __partial_sort(first, middle, last, value_type(first), comp); -} - -template <class InputIterator, class RandomAccessIterator, class Distance, - class T> -RandomAccessIterator __partial_sort_copy(InputIterator first, - InputIterator last, - RandomAccessIterator result_first, - RandomAccessIterator result_last, - Distance*, T*) { - if (result_first == result_last) return result_last; - RandomAccessIterator result_real_last = result_first; - while(first != last && result_real_last != result_last) - *result_real_last++ = *first++; - make_heap(result_first, result_real_last); - while (first != last) { - if (*first < *result_first) - __adjust_heap(result_first, Distance(0), - Distance(result_real_last - result_first), T(*first)); - ++first; - } - sort_heap(result_first, result_real_last); - return result_real_last; -} - -template <class InputIterator, class RandomAccessIterator> -inline RandomAccessIterator -partial_sort_copy(InputIterator first, InputIterator last, - RandomAccessIterator result_first, - RandomAccessIterator result_last) { - return __partial_sort_copy(first, last, result_first, result_last, - distance_type(result_first), value_type(first)); -} - -template <class InputIterator, class RandomAccessIterator, class Compare, - class Distance, class T> -RandomAccessIterator __partial_sort_copy(InputIterator first, - InputIterator last, - RandomAccessIterator result_first, - RandomAccessIterator result_last, - Compare comp, Distance*, T*) { - if (result_first == result_last) return result_last; - RandomAccessIterator result_real_last = result_first; - while(first != last && result_real_last != result_last) - *result_real_last++ = *first++; - make_heap(result_first, result_real_last, comp); - while (first != last) { - if (*first < *result_first) - __adjust_heap(result_first, Distance(0), - Distance(result_real_last - result_first), T(*first), - comp); - ++first; - } - sort_heap(result_first, result_real_last, comp); - return result_real_last; -} - -template <class InputIterator, class RandomAccessIterator, class Compare> -inline RandomAccessIterator -partial_sort_copy(InputIterator first, InputIterator last, - RandomAccessIterator result_first, - RandomAccessIterator result_last, Compare comp) { - return __partial_sort_copy(first, last, result_first, result_last, comp, - distance_type(result_first), value_type(first)); -} - -template <class RandomAccessIterator, class T> -void __nth_element(RandomAccessIterator first, RandomAccessIterator nth, - RandomAccessIterator last, T*) { - while (last - first > 3) { - RandomAccessIterator cut = __unguarded_partition - (first, last, T(__median(*first, *(first + (last - first)/2), - *(last - 1)))); - if (cut <= nth) - first = cut; - else - last = cut; - } - __insertion_sort(first, last); -} - -template <class RandomAccessIterator> -inline void nth_element(RandomAccessIterator first, RandomAccessIterator nth, - RandomAccessIterator last) { - __nth_element(first, nth, last, value_type(first)); -} - -template <class RandomAccessIterator, class T, class Compare> -void __nth_element(RandomAccessIterator first, RandomAccessIterator nth, - RandomAccessIterator last, T*, Compare comp) { - while (last - first > 3) { - RandomAccessIterator cut = __unguarded_partition - (first, last, T(__median(*first, *(first + (last - first)/2), - *(last - 1), comp)), comp); - if (cut <= nth) - first = cut; - else - last = cut; - } - __insertion_sort(first, last, comp); -} - -template <class RandomAccessIterator, class Compare> -inline void nth_element(RandomAccessIterator first, RandomAccessIterator nth, - RandomAccessIterator last, Compare comp) { - __nth_element(first, nth, last, value_type(first), comp); -} - -template <class ForwardIterator, class T, class Distance> -ForwardIterator __lower_bound(ForwardIterator first, ForwardIterator last, - const T& value, Distance*, - forward_iterator_tag) { - Distance len = 0; - distance(first, last, len); - Distance half; - ForwardIterator middle; - - while (len > 0) { - half = len / 2; - middle = first; - advance(middle, half); - if (*middle < value) { - first = middle; - ++first; - len = len - half - 1; - } else - len = half; - } - return first; -} - -template <class ForwardIterator, class T, class Distance> -inline ForwardIterator __lower_bound(ForwardIterator first, - ForwardIterator last, - const T& value, Distance*, - bidirectional_iterator_tag) { - return __lower_bound(first, last, value, (Distance*)0, - forward_iterator_tag()); -} - -template <class RandomAccessIterator, class T, class Distance> -RandomAccessIterator __lower_bound(RandomAccessIterator first, - RandomAccessIterator last, const T& value, - Distance*, random_access_iterator_tag) { - Distance len = last - first; - Distance half; - RandomAccessIterator middle; - - while (len > 0) { - half = len / 2; - middle = first + half; - if (*middle < value) { - first = middle + 1; - len = len - half - 1; - } else - len = half; - } - return first; -} - -template <class ForwardIterator, class T> -inline ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, - const T& value) { - return __lower_bound(first, last, value, distance_type(first), - iterator_category(first)); -} - -template <class ForwardIterator, class T, class Compare, class Distance> -ForwardIterator __lower_bound(ForwardIterator first, ForwardIterator last, - const T& value, Compare comp, Distance*, - forward_iterator_tag) { - Distance len = 0; - distance(first, last, len); - Distance half; - ForwardIterator middle; - - while (len > 0) { - half = len / 2; - middle = first; - advance(middle, half); - if (comp(*middle, value)) { - first = middle; - ++first; - len = len - half - 1; - } else - len = half; - } - return first; -} - -template <class ForwardIterator, class T, class Compare, class Distance> -inline ForwardIterator __lower_bound(ForwardIterator first, - ForwardIterator last, - const T& value, Compare comp, Distance*, - bidirectional_iterator_tag) { - return __lower_bound(first, last, value, comp, (Distance*)0, - forward_iterator_tag()); -} - -template <class RandomAccessIterator, class T, class Compare, class Distance> -RandomAccessIterator __lower_bound(RandomAccessIterator first, - RandomAccessIterator last, - const T& value, Compare comp, Distance*, - random_access_iterator_tag) { - Distance len = last - first; - Distance half; - RandomAccessIterator middle; - - while (len > 0) { - half = len / 2; - middle = first + half; - if (comp(*middle, value)) { - first = middle + 1; - len = len - half - 1; - } else - len = half; - } - return first; -} - -template <class ForwardIterator, class T, class Compare> -inline ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, - const T& value, Compare comp) { - return __lower_bound(first, last, value, comp, distance_type(first), - iterator_category(first)); -} - -template <class ForwardIterator, class T, class Distance> -ForwardIterator __upper_bound(ForwardIterator first, ForwardIterator last, - const T& value, Distance*, - forward_iterator_tag) { - Distance len = 0; - distance(first, last, len); - Distance half; - ForwardIterator middle; - - while (len > 0) { - half = len / 2; - middle = first; - advance(middle, half); - if (value < *middle) - len = half; - else { - first = middle; - ++first; - len = len - half - 1; - } - } - return first; -} - -template <class ForwardIterator, class T, class Distance> -inline ForwardIterator __upper_bound(ForwardIterator first, - ForwardIterator last, - const T& value, Distance*, - bidirectional_iterator_tag) { - return __upper_bound(first, last, value, (Distance*)0, - forward_iterator_tag()); -} - -template <class RandomAccessIterator, class T, class Distance> -RandomAccessIterator __upper_bound(RandomAccessIterator first, - RandomAccessIterator last, const T& value, - Distance*, random_access_iterator_tag) { - Distance len = last - first; - Distance half; - RandomAccessIterator middle; - - while (len > 0) { - half = len / 2; - middle = first + half; - if (value < *middle) - len = half; - else { - first = middle + 1; - len = len - half - 1; - } - } - return first; -} - -template <class ForwardIterator, class T> -inline ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, - const T& value) { - return __upper_bound(first, last, value, distance_type(first), - iterator_category(first)); -} - -template <class ForwardIterator, class T, class Compare, class Distance> -ForwardIterator __upper_bound(ForwardIterator first, ForwardIterator last, - const T& value, Compare comp, Distance*, - forward_iterator_tag) { - Distance len = 0; - distance(first, last, len); - Distance half; - ForwardIterator middle; - - while (len > 0) { - half = len / 2; - middle = first; - advance(middle, half); - if (comp(value, *middle)) - len = half; - else { - first = middle; - ++first; - len = len - half - 1; - } - } - return first; -} - -template <class ForwardIterator, class T, class Compare, class Distance> -inline ForwardIterator __upper_bound(ForwardIterator first, - ForwardIterator last, - const T& value, Compare comp, Distance*, - bidirectional_iterator_tag) { - return __upper_bound(first, last, value, comp, (Distance*)0, - forward_iterator_tag()); -} - -template <class RandomAccessIterator, class T, class Compare, class Distance> -RandomAccessIterator __upper_bound(RandomAccessIterator first, - RandomAccessIterator last, - const T& value, Compare comp, Distance*, - random_access_iterator_tag) { - Distance len = last - first; - Distance half; - RandomAccessIterator middle; - - while (len > 0) { - half = len / 2; - middle = first + half; - if (comp(value, *middle)) - len = half; - else { - first = middle + 1; - len = len - half - 1; - } - } - return first; -} - -template <class ForwardIterator, class T, class Compare> -inline ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, - const T& value, Compare comp) { - return __upper_bound(first, last, value, comp, distance_type(first), - iterator_category(first)); -} - -template <class ForwardIterator, class T, class Distance> -pair<ForwardIterator, ForwardIterator> -__equal_range(ForwardIterator first, ForwardIterator last, const T& value, - Distance*, forward_iterator_tag) { - Distance len = 0; - distance(first, last, len); - Distance half; - ForwardIterator middle, left, right; - - while (len > 0) { - half = len / 2; - middle = first; - advance(middle, half); - if (*middle < value) { - first = middle; - ++first; - len = len - half - 1; - } else if (value < *middle) - len = half; - else { - left = lower_bound(first, middle, value); - advance(first, len); - right = upper_bound(++middle, first, value); - return pair<ForwardIterator, ForwardIterator>(left, right); - } - } - return pair<ForwardIterator, ForwardIterator>(first, first); -} - -template <class ForwardIterator, class T, class Distance> -inline pair<ForwardIterator, ForwardIterator> -__equal_range(ForwardIterator first, ForwardIterator last, const T& value, - Distance*, bidirectional_iterator_tag) { - return __equal_range(first, last, value, (Distance*)0, - forward_iterator_tag()); -} - -template <class RandomAccessIterator, class T, class Distance> -pair<RandomAccessIterator, RandomAccessIterator> -__equal_range(RandomAccessIterator first, RandomAccessIterator last, - const T& value, Distance*, random_access_iterator_tag) { - Distance len = last - first; - Distance half; - RandomAccessIterator middle, left, right; - - while (len > 0) { - half = len / 2; - middle = first + half; - if (*middle < value) { - first = middle + 1; - len = len - half - 1; - } else if (value < *middle) - len = half; - else { - left = lower_bound(first, middle, value); - right = upper_bound(++middle, first + len, value); - return pair<RandomAccessIterator, RandomAccessIterator>(left, - right); - } - } - return pair<RandomAccessIterator, RandomAccessIterator>(first, first); -} - -template <class ForwardIterator, class T> -inline pair<ForwardIterator, ForwardIterator> -equal_range(ForwardIterator first, ForwardIterator last, const T& value) { - return __equal_range(first, last, value, distance_type(first), - iterator_category(first)); -} - -template <class ForwardIterator, class T, class Compare, class Distance> -pair<ForwardIterator, ForwardIterator> -__equal_range(ForwardIterator first, ForwardIterator last, const T& value, - Compare comp, Distance*, forward_iterator_tag) { - Distance len = 0; - distance(first, last, len); - Distance half; - ForwardIterator middle, left, right; - - while (len > 0) { - half = len / 2; - middle = first; - advance(middle, half); - if (comp(*middle, value)) { - first = middle; - ++first; - len = len - half - 1; - } else if (comp(value, *middle)) - len = half; - else { - left = lower_bound(first, middle, value, comp); - advance(first, len); - right = upper_bound(++middle, first, value, comp); - return pair<ForwardIterator, ForwardIterator>(left, right); - } - } - return pair<ForwardIterator, ForwardIterator>(first, first); -} - -template <class ForwardIterator, class T, class Compare, class Distance> -inline pair<ForwardIterator, ForwardIterator> -__equal_range(ForwardIterator first, ForwardIterator last, const T& value, - Compare comp, Distance*, bidirectional_iterator_tag) { - return __equal_range(first, last, value, comp, (Distance*)0, - forward_iterator_tag()); -} - -template <class RandomAccessIterator, class T, class Compare, class Distance> -pair<RandomAccessIterator, RandomAccessIterator> -__equal_range(RandomAccessIterator first, RandomAccessIterator last, - const T& value, Compare comp, Distance*, - random_access_iterator_tag) { - Distance len = last - first; - Distance half; - RandomAccessIterator middle, left, right; - - while (len > 0) { - half = len / 2; - middle = first + half; - if (comp(*middle, value)) { - first = middle + 1; - len = len - half - 1; - } else if (comp(value, *middle)) - len = half; - else { - left = lower_bound(first, middle, value, comp); - right = upper_bound(++middle, first + len, value, comp); - return pair<RandomAccessIterator, RandomAccessIterator>(left, - right); - } - } - return pair<RandomAccessIterator, RandomAccessIterator>(first, first); -} - -template <class ForwardIterator, class T, class Compare> -inline pair<ForwardIterator, ForwardIterator> -equal_range(ForwardIterator first, ForwardIterator last, const T& value, - Compare comp) { - return __equal_range(first, last, value, comp, distance_type(first), - iterator_category(first)); -} - -template <class ForwardIterator, class T> -bool binary_search(ForwardIterator first, ForwardIterator last, - const T& value) { - ForwardIterator i = lower_bound(first, last, value); - return i != last && !(value < *i); -} - -template <class ForwardIterator, class T, class Compare> -bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, - Compare comp) { - ForwardIterator i = lower_bound(first, last, value, comp); - return i != last && !comp(value, *i); -} - -template <class InputIterator1, class InputIterator2, class OutputIterator> -OutputIterator merge(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result) { - while (first1 != last1 && first2 != last2) - if (*first2 < *first1) - *result++ = *first2++; - else - *result++ = *first1++; - return copy(first2, last2, copy(first1, last1, result)); -} - -template <class InputIterator1, class InputIterator2, class OutputIterator, - class Compare> -OutputIterator merge(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result, Compare comp) { - while (first1 != last1 && first2 != last2) - if (comp(*first2, *first1)) - *result++ = *first2++; - else - *result++ = *first1++; - return copy(first2, last2, copy(first1, last1, result)); -} - -template <class BidirectionalIterator, class Distance> -void __merge_without_buffer(BidirectionalIterator first, - BidirectionalIterator middle, - BidirectionalIterator last, - Distance len1, Distance len2) { - if (len1 == 0 || len2 == 0) return; - if (len1 + len2 == 2) { - if (*middle < *first) iter_swap(first, middle); - return; - } - BidirectionalIterator first_cut = first; - BidirectionalIterator second_cut = middle; - Distance len11 = 0; - Distance len22 = 0; - if (len1 > len2) { - len11 = len1 / 2; - advance(first_cut, len11); - second_cut = lower_bound(middle, last, *first_cut); - distance(middle, second_cut, len22); - } else { - len22 = len2 / 2; - advance(second_cut, len22); - first_cut = upper_bound(first, middle, *second_cut); - distance(first, first_cut, len11); - } - rotate(first_cut, middle, second_cut); - BidirectionalIterator new_middle = first_cut; - advance(new_middle, len22); - __merge_without_buffer(first, first_cut, new_middle, len11, len22); - __merge_without_buffer(new_middle, second_cut, last, len1 - len11, - len2 - len22); -} - -template <class BidirectionalIterator, class Distance, class Compare> -void __merge_without_buffer(BidirectionalIterator first, - BidirectionalIterator middle, - BidirectionalIterator last, - Distance len1, Distance len2, Compare comp) { - if (len1 == 0 || len2 == 0) return; - if (len1 + len2 == 2) { - if (comp(*middle, *first)) iter_swap(first, middle); - return; - } - BidirectionalIterator first_cut = first; - BidirectionalIterator second_cut = middle; - Distance len11 = 0; - Distance len22 = 0; - if (len1 > len2) { - len11 = len1 / 2; - advance(first_cut, len11); - second_cut = lower_bound(middle, last, *first_cut, comp); - distance(middle, second_cut, len22); - } else { - len22 = len2 / 2; - advance(second_cut, len22); - first_cut = upper_bound(first, middle, *second_cut, comp); - distance(first, first_cut, len11); - } - rotate(first_cut, middle, second_cut); - BidirectionalIterator new_middle = first_cut; - advance(new_middle, len22); - __merge_without_buffer(first, first_cut, new_middle, len11, len22, comp); - __merge_without_buffer(new_middle, second_cut, last, len1 - len11, - len2 - len22, comp); -} - - -template <class InputIterator, class OutputIterator> -OutputIterator __borland_bugfix_copy(InputIterator first, InputIterator last, - OutputIterator result) { -// this is used in __rotate_adaptive to work around some obscure Borland -// bug. It is the same as copy, but with a different (and appropriate) name. - while (first != last) *result++ = *first++; - return result; -} - -template <class BidirectionalIterator1, class BidirectionalIterator2, - class Distance> -BidirectionalIterator1 __rotate_adaptive(BidirectionalIterator1 first, - BidirectionalIterator1 middle, - BidirectionalIterator1 last, - Distance len1, Distance len2, - BidirectionalIterator2 buffer, - Distance buffer_size) { - BidirectionalIterator2 buffer_end; - if (len1 > len2 && len2 <= buffer_size) { - buffer_end = __borland_bugfix_copy(middle, last, buffer); - copy_backward(first, middle, last); - return copy(buffer, buffer_end, first); - } else if (len1 <= buffer_size) { - buffer_end = __borland_bugfix_copy(first, middle, buffer); - copy(middle, last, first); - return copy_backward(buffer, buffer_end, last); - } else { - rotate(first, middle, last); - advance(first, len2); - return first; - } -} - -template <class BidirectionalIterator1, class BidirectionalIterator2, - class BidirectionalIterator3> -BidirectionalIterator3 __merge_backward(BidirectionalIterator1 first1, - BidirectionalIterator1 last1, - BidirectionalIterator2 first2, - BidirectionalIterator2 last2, - BidirectionalIterator3 result) { - if (first1 == last1) return copy_backward(first2, last2, result); - if (first2 == last2) return copy_backward(first1, last1, result); - --last1; - --last2; - while (true) { - if (*last2 < *last1) { - *--result = *last1; - if (first1 == last1) return copy_backward(first2, ++last2, result); - --last1; - } else { - *--result = *last2; - if (first2 == last2) return copy_backward(first1, ++last1, result); - --last2; - } - } -} - -template <class BidirectionalIterator1, class BidirectionalIterator2, - class BidirectionalIterator3, class Compare> -BidirectionalIterator3 __merge_backward(BidirectionalIterator1 first1, - BidirectionalIterator1 last1, - BidirectionalIterator2 first2, - BidirectionalIterator2 last2, - BidirectionalIterator3 result, - Compare comp) { - if (first1 == last1) return copy_backward(first2, last2, result); - if (first2 == last2) return copy_backward(first1, last1, result); - --last1; - --last2; - while (true) { - if (comp(*last2, *last1)) { - *--result = *last1; - if (first1 == last1) return copy_backward(first2, ++last2, result); - --last1; - } else { - *--result = *last2; - if (first2 == last2) return copy_backward(first1, ++last1, result); - --last2; - } - } -} - -template <class BidirectionalIterator, class Distance, class Pointer, class T> -void __merge_adaptive(BidirectionalIterator first, - BidirectionalIterator middle, - BidirectionalIterator last, Distance len1, Distance len2, - Pointer buffer, Distance buffer_size, - Distance& fill_pointer, T*) { - if (len1 <= len2 && len1 <= buffer_size) { - BidirectionalIterator i = first; - Pointer j = buffer; - len2 = 0; - while (len2 < len1 && len2 < fill_pointer) { - *buffer++ = *first++; - ++len2; - } - raw_storage_iterator<Pointer, T> end_buffer = buffer; - while (len2++ < len1) { - *end_buffer++ = *first++; - ++fill_pointer; - } - merge(j, j + len1, middle, last, i); - } else if (len2 <= buffer_size) { - BidirectionalIterator i = middle; - Pointer j = buffer; - len1 = 0; - while (len1 < len2 && len1 < fill_pointer) { - *buffer++ = *middle++; - ++len1; - } - raw_storage_iterator<Pointer, T> end_buffer = buffer; - while (len1++ < len2) { - *end_buffer++ = *middle++; - ++fill_pointer; - } - __merge_backward(first, i, j, j + len2, last); - } else { - BidirectionalIterator first_cut = first; - BidirectionalIterator second_cut = middle; - Distance len11 = 0; - Distance len22 = 0; - if (len1 > len2) { - len11 = len1 / 2; - advance(first_cut, len11); - second_cut = lower_bound(middle, last, *first_cut); - distance(middle, second_cut, len22); - } else { - len22 = len2 / 2; - advance(second_cut, len22); - first_cut = upper_bound(first, middle, *second_cut); - distance(first, first_cut, len11); - } - BidirectionalIterator new_middle = - __rotate_adaptive(first_cut, middle, second_cut, len1 - len11, - len22, buffer, buffer_size); - __merge_adaptive(first, first_cut, new_middle, len11, len22, buffer, - buffer_size, fill_pointer, (T*)0); - __merge_adaptive(new_middle, second_cut, last, len1 - len11, - len2 - len22, buffer, buffer_size, fill_pointer, - (T*)0); - } -} - -template <class BidirectionalIterator, class Distance, class Pointer, class T, - class Compare> -void __merge_adaptive(BidirectionalIterator first, - BidirectionalIterator middle, - BidirectionalIterator last, Distance len1, Distance len2, - Pointer buffer, Distance buffer_size, - Distance& fill_pointer, T*, Compare comp) { - if (len1 <= len2 && len1 <= buffer_size) { - BidirectionalIterator i = first; - Pointer j = buffer; - len2 = 0; - while (len2 < len1 && len2 < fill_pointer) { - *buffer++ = *first++; - ++len2; - } - raw_storage_iterator<Pointer, T> end_buffer = buffer; - while (len2++ < len1) { - *end_buffer++ = *first++; - ++fill_pointer; - } - merge(j, j + len1, middle, last, i, comp); - } else if (len2 <= buffer_size) { - BidirectionalIterator i = middle; - Pointer j = buffer; - len1 = 0; - while (len1 < len2 && len1 < fill_pointer) { - *buffer++ = *middle++; - ++len1; - } - raw_storage_iterator<Pointer, T> end_buffer = buffer; - while (len1++ < len2) { - *end_buffer++ = *middle++; - ++fill_pointer; - } - __merge_backward(first, i, j, j + len2, last, comp); - } else { - BidirectionalIterator first_cut = first; - BidirectionalIterator second_cut = middle; - Distance len11 = 0; - Distance len22 = 0; - if (len1 > len2) { - len11 = len1 / 2; - advance(first_cut, len11); - second_cut = lower_bound(middle, last, *first_cut, comp); - distance(middle, second_cut, len22); - } else { - len22 = len2 / 2; - advance(second_cut, len22); - first_cut = upper_bound(first, middle, *second_cut, comp); - distance(first, first_cut, len11); - } - BidirectionalIterator new_middle = - __rotate_adaptive(first_cut, middle, second_cut, len1 - len11, - len22, buffer, buffer_size); - __merge_adaptive(first, first_cut, new_middle, len11, len22, buffer, - buffer_size, fill_pointer, (T*)0, comp); - __merge_adaptive(new_middle, second_cut, last, len1 - len11, - len2 - len22, buffer, buffer_size, fill_pointer, - (T*)0, comp); - } -} - -template <class BidirectionalIterator, class Distance, class Pointer> -void __inplace_merge(BidirectionalIterator first, - BidirectionalIterator middle, - BidirectionalIterator last, Distance len1, Distance len2, - pair<Pointer, Distance> p) { - if (p.first == 0) { - __merge_without_buffer(first, middle, last, len1, len2); - return; - } - Distance fill_pointer = 0; - __merge_adaptive(first, middle, last, len1, len2, p.first, p.second, - fill_pointer, value_type(first)); - destroy(p.first, p.first + fill_pointer); - return_temporary_buffer(p.first); -} - -template <class BidirectionalIterator, class Distance, class Pointer, - class Compare> -void __inplace_merge(BidirectionalIterator first, - BidirectionalIterator middle, - BidirectionalIterator last, Distance len1, Distance len2, - pair<Pointer, Distance> p, Compare comp) { - if (p.first == 0) { - __merge_without_buffer(first, middle, last, len1, len2, comp); - return; - } - Distance fill_pointer = 0; - __merge_adaptive(first, middle, last, len1, len2, p.first, p.second, - fill_pointer, value_type(first), comp); - destroy(p.first, p.first + fill_pointer); - return_temporary_buffer(p.first); -} - -template <class BidirectionalIterator, class Distance> -inline void __inplace_merge_aux(BidirectionalIterator first, - BidirectionalIterator middle, - BidirectionalIterator last, Distance*) { - Distance len1 = 0; - distance(first, middle, len1); - Distance len2 = 0; - distance(middle, last, len2); - __inplace_merge(first, middle, last, len1, len2, - get_temporary_buffer(len1 + len2, value_type(first))); -} - -template <class BidirectionalIterator, class Distance, class Compare> -inline void __inplace_merge_aux(BidirectionalIterator first, - BidirectionalIterator middle, - BidirectionalIterator last, Distance*, - Compare comp) { - Distance len1 = 0; - distance(first, middle, len1); - Distance len2 = 0; - distance(middle, last, len2); - __inplace_merge(first, middle, last, len1, len2, - get_temporary_buffer(len1 + len2, value_type(first)), - comp); -} - -template <class BidirectionalIterator> -inline void inplace_merge(BidirectionalIterator first, - BidirectionalIterator middle, - BidirectionalIterator last) { - __inplace_merge_aux(first, middle, last, distance_type(first)); -} - -template <class BidirectionalIterator, class Compare> -inline void inplace_merge(BidirectionalIterator first, - BidirectionalIterator middle, - BidirectionalIterator last, Compare comp) { - __inplace_merge_aux(first, middle, last, distance_type(first), comp); -} - -template <class InputIterator1, class InputIterator2> -bool includes(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2) { - while (first1 != last1 && first2 != last2) - if (*first2 < *first1) - return false; - else if(*first1 < *first2) - ++first1; - else - ++first1, ++first2; - - return first2 == last2; -} - -template <class InputIterator1, class InputIterator2, class Compare> -bool includes(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, Compare comp) { - while (first1 != last1 && first2 != last2) - if (comp(*first2, *first1)) - return false; - else if(comp(*first1, *first2)) - ++first1; - else - ++first1, ++first2; - - return first2 == last2; -} - -template <class InputIterator1, class InputIterator2, class OutputIterator> -OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result) { - while (first1 != last1 && first2 != last2) - if (*first1 < *first2) - *result++ = *first1++; - else if (*first2 < *first1) - *result++ = *first2++; - else { - *result++ = *first1++; - first2++; - } - return copy(first2, last2, copy(first1, last1, result)); -} - -template <class InputIterator1, class InputIterator2, class OutputIterator, - class Compare> -OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result, Compare comp) { - while (first1 != last1 && first2 != last2) - if (comp(*first1, *first2)) - *result++ = *first1++; - else if (comp(*first2, *first1)) - *result++ = *first2++; - else { - *result++ = *first1++; - ++first2; - } - return copy(first2, last2, copy(first1, last1, result)); -} - -template <class InputIterator1, class InputIterator2, class OutputIterator> -OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result) { - while (first1 != last1 && first2 != last2) - if (*first1 < *first2) - ++first1; - else if (*first2 < *first1) - ++first2; - else { - *result++ = *first1++; - ++first2; - } - return result; -} - -template <class InputIterator1, class InputIterator2, class OutputIterator, - class Compare> -OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result, Compare comp) { - while (first1 != last1 && first2 != last2) - if (comp(*first1, *first2)) - ++first1; - else if (comp(*first2, *first1)) - ++first2; - else { - *result++ = *first1++; - ++first2; - } - return result; -} - -template <class InputIterator1, class InputIterator2, class OutputIterator> -OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result) { - while (first1 != last1 && first2 != last2) - if (*first1 < *first2) - *result++ = *first1++; - else if (*first2 < *first1) - ++first2; - else { - ++first1; - ++first2; - } - return copy(first1, last1, result); -} - -template <class InputIterator1, class InputIterator2, class OutputIterator, - class Compare> -OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result, Compare comp) { - while (first1 != last1 && first2 != last2) - if (comp(*first1, *first2)) - *result++ = *first1++; - else if (comp(*first2, *first1)) - ++first2; - else { - ++first1; - ++first2; - } - return copy(first1, last1, result); -} - -template <class InputIterator1, class InputIterator2, class OutputIterator> -OutputIterator set_symmetric_difference(InputIterator1 first1, - InputIterator1 last1, - InputIterator2 first2, - InputIterator2 last2, - OutputIterator result) { - while (first1 != last1 && first2 != last2) - if (*first1 < *first2) - *result++ = *first1++; - else if (*first2 < *first1) - *result++ = *first2++; - else { - ++first1; - ++first2; - } - return copy(first2, last2, copy(first1, last1, result)); -} - -template <class InputIterator1, class InputIterator2, class OutputIterator, - class Compare> -OutputIterator set_symmetric_difference(InputIterator1 first1, - InputIterator1 last1, - InputIterator2 first2, - InputIterator2 last2, - OutputIterator result, Compare comp) { - while (first1 != last1 && first2 != last2) - if (comp(*first1, *first2)) - *result++ = *first1++; - else if (comp(*first2, *first1)) - *result++ = *first2++; - else { - ++first1; - ++first2; - } - return copy(first2, last2, copy(first1, last1, result)); -} - -template <class InputIterator> -InputIterator max_element(InputIterator first, InputIterator last) { - if (first == last) return first; - InputIterator result = first; - while (++first != last) - if (*result < *first) result = first; - return result; -} - -template <class InputIterator, class Compare> -InputIterator max_element(InputIterator first, InputIterator last, - Compare comp) { - if (first == last) return first; - InputIterator result = first; - while (++first != last) - if (comp(*result, *first)) result = first; - return result; -} - -template <class InputIterator> -InputIterator min_element(InputIterator first, InputIterator last) { - if (first == last) return first; - InputIterator result = first; - while (++first != last) - if (*first < *result) result = first; - return result; -} - -template <class InputIterator, class Compare> -InputIterator min_element(InputIterator first, InputIterator last, - Compare comp) { - if (first == last) return first; - InputIterator result = first; - while (++first != last) - if (comp(*first, *result)) result = first; - return result; -} - -template <class BidirectionalIterator> -bool next_permutation(BidirectionalIterator first, - BidirectionalIterator last) { - if (first == last) return false; - BidirectionalIterator i = first; - ++i; - if (i == last) return false; - i = last; - --i; - - for(;;) { - BidirectionalIterator ii = i--; - if (*i < *ii) { - BidirectionalIterator j = last; - while (!(*i < *--j)); - iter_swap(i, j); - reverse(ii, last); - return true; - } - if (i == first) { - reverse(first, last); - return false; - } - } -} - -template <class BidirectionalIterator, class Compare> -bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, - Compare comp) { - if (first == last) return false; - BidirectionalIterator i = first; - ++i; - if (i == last) return false; - i = last; - --i; - - for(;;) { - BidirectionalIterator ii = i--; - if (comp(*i, *ii)) { - BidirectionalIterator j = last; - while (!comp(*i, *--j)); - iter_swap(i, j); - reverse(ii, last); - return true; - } - if (i == first) { - reverse(first, last); - return false; - } - } -} - -template <class BidirectionalIterator> -bool prev_permutation(BidirectionalIterator first, - BidirectionalIterator last) { - if (first == last) return false; - BidirectionalIterator i = first; - ++i; - if (i == last) return false; - i = last; - --i; - - for(;;) { - BidirectionalIterator ii = i--; - if (!(*i < *ii)) { - BidirectionalIterator j = last; - while (*i < *--j); - iter_swap(i, j); - reverse(ii, last); - return true; - } - if (i == first) { - reverse(first, last); - return false; - } - } -} - -template <class BidirectionalIterator, class Compare> -bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, - Compare comp) { - if (first == last) return false; - BidirectionalIterator i = first; - ++i; - if (i == last) return false; - i = last; - --i; - - for(;;) { - BidirectionalIterator ii = i--; - if (!comp(*i, *ii)) { - BidirectionalIterator j = last; - while (comp(*i, *--j)); - iter_swap(i, j); - reverse(ii, last); - return true; - } - if (i == first) { - reverse(first, last); - return false; - } - } -} - -template <class InputIterator, class T> -T accumulate(InputIterator first, InputIterator last, T init) { - while (first != last) - init = init + *first++; - return init; -} - -template <class InputIterator, class T, class BinaryOperation> -T accumulate(InputIterator first, InputIterator last, T init, - BinaryOperation binary_op) { - while (first != last) - init = binary_op(init, *first++); - return init; -} - -template <class InputIterator1, class InputIterator2, class T> -T inner_product(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, T init) { - while (first1 != last1) - init = init + (*first1++ * *first2++); - return init; -} - -template <class InputIterator1, class InputIterator2, class T, - class BinaryOperation1, class BinaryOperation2> -T inner_product(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, T init, BinaryOperation1 binary_op1, - BinaryOperation2 binary_op2) { - while (first1 != last1) - init = binary_op1(init, binary_op2(*first1++, *first2++)); - return init; -} - -template <class InputIterator, class OutputIterator, class T> -OutputIterator __partial_sum(InputIterator first, InputIterator last, - OutputIterator result, T*) { - T value = *first; - while (++first != last) { - value = value + *first; - *++result = value; - } - return ++result; -} - -template <class InputIterator, class OutputIterator> -OutputIterator partial_sum(InputIterator first, InputIterator last, - OutputIterator result) { - if (first == last) return result; - *result = *first; - return __partial_sum(first, last, result, value_type(first)); -} - -template <class InputIterator, class OutputIterator, class T, - class BinaryOperation> -OutputIterator __partial_sum(InputIterator first, InputIterator last, - OutputIterator result, T*, - BinaryOperation binary_op) { - T value = *first; - while (++first != last) { - value = binary_op(value, *first); - *++result = value; - } - return ++result; -} - -template <class InputIterator, class OutputIterator, class BinaryOperation> -OutputIterator partial_sum(InputIterator first, InputIterator last, - OutputIterator result, BinaryOperation binary_op) { - if (first == last) return result; - *result = *first; - return __partial_sum(first, last, result, value_type(first), binary_op); -} - -template <class InputIterator, class OutputIterator, class T> -OutputIterator __adjacent_difference(InputIterator first, InputIterator last, - OutputIterator result, T*) { - T value = *first; - while (++first != last) { - T tmp = *first; - *++result = tmp - value; - value = tmp; - } - return ++result; -} - -template <class InputIterator, class OutputIterator> -OutputIterator adjacent_difference(InputIterator first, InputIterator last, - OutputIterator result) { - if (first == last) return result; - *result = *first; - return __adjacent_difference(first, last, result, value_type(first)); -} - -template <class InputIterator, class OutputIterator, class T, - class BinaryOperation> -OutputIterator __adjacent_difference(InputIterator first, InputIterator last, - OutputIterator result, T*, - BinaryOperation binary_op) { - T value = *first; - while (++first != last) { - T tmp = *first; - *++result = binary_op(tmp, value); - value = tmp; - } - return ++result; -} - -template <class InputIterator, class OutputIterator, class BinaryOperation> -OutputIterator adjacent_difference(InputIterator first, InputIterator last, - OutputIterator result, - BinaryOperation binary_op) { - if (first == last) return result; - *result = *first; - return __adjacent_difference(first, last, result, value_type(first), - binary_op); -} - -template <class ForwardIterator, class T> -void iota(ForwardIterator first, ForwardIterator last, T value) { - while (first != last) *first++ = value++; -} - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/algobase.h b/STL/algobase.h deleted file mode 100644 index 17816328155..00000000000 --- a/STL/algobase.h +++ /dev/null @@ -1,250 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef ALGOBASE_H -#define ALGOBASE_H - -#include <pair.h> -#include <iterator.h> - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class ForwardIterator1, class ForwardIterator2, class T> -inline void __iter_swap(ForwardIterator1 a, ForwardIterator2 b, T*) { - T tmp = *a; - *a = *b; - *b = tmp; -} - -template <class ForwardIterator1, class ForwardIterator2> -inline void iter_swap(ForwardIterator1 a, ForwardIterator2 b) { - __iter_swap(a, b, value_type(a)); -} - -template <class T> -inline void swap(T& a, T& b) { - T tmp = a; - a = b; - b = tmp; -} - -#if ! defined (VXWORKS) -template <class T> -inline const T& min(const T& a, const T& b) { - return b < a ? b : a; -} - -template <class T, class Compare> -inline const T& min(const T& a, const T& b, Compare comp) { - return comp(b, a) ? b : a; -} - -template <class T> -inline const T& max(const T& a, const T& b) { - return a < b ? b : a; -} - -template <class T, class Compare> -inline const T& max(const T& a, const T& b, Compare comp) { - return comp(a, b) ? b : a; -} -#endif /* VXWORKS */ - -template <class InputIterator, class Distance> -void __distance(InputIterator first, InputIterator last, Distance& n, - input_iterator_tag) { - while (first != last) { ++first; ++n; } -} - -template <class ForwardIterator, class Distance> -void __distance(ForwardIterator first, ForwardIterator last, Distance& n, - forward_iterator_tag) { - while (first != last) { ++first; ++n; } -} - -template <class BidirectionalIterator, class Distance> -void __distance(BidirectionalIterator first, BidirectionalIterator last, - Distance& n, bidirectional_iterator_tag) { - while (first != last) { ++first; ++n; } -} - -template <class RandomAccessIterator, class Distance> -inline void __distance(RandomAccessIterator first, RandomAccessIterator last, - Distance& n, random_access_iterator_tag) { - n = last - first; -} - -template <class InputIterator, class Distance> -inline void distance(InputIterator first, InputIterator last, Distance& n) { - __distance(first, last, n, iterator_category(first)); -} - -template <class InputIterator, class Distance> -void __advance(InputIterator& i, Distance n, input_iterator_tag) { - while (n--) ++i; -} - -template <class ForwardIterator, class Distance> -void __advance(ForwardIterator& i, Distance n, forward_iterator_tag) { - while (n--) ++i; -} - -template <class BidirectionalIterator, class Distance> -void __advance(BidirectionalIterator& i, Distance n, - bidirectional_iterator_tag) { - if (n >= 0) - while (n--) ++i; - else - while (n++) --i; -} - -template <class RandomAccessIterator, class Distance> -inline void __advance(RandomAccessIterator& i, Distance n, - random_access_iterator_tag) { - i += n; -} - -template <class InputIterator, class Distance> -inline void advance(InputIterator& i, Distance n) { - __advance(i, n, iterator_category(i)); -} - -template <class ForwardIterator> -void destroy(ForwardIterator first, ForwardIterator last) { - while (first != last) { - /* Borland bug */ - destroy(first); - ++first; - //destroy(first++); - } -} - -template <class InputIterator, class ForwardIterator> -ForwardIterator uninitialized_copy(InputIterator first, InputIterator last, - ForwardIterator result) { - while (first != last) construct(result++, *first++); - return result; -} - -template <class ForwardIterator, class T> -void uninitialized_fill(ForwardIterator first, ForwardIterator last, - const T& x) { - while (first != last) construct(first++, x); -} - -template <class ForwardIterator, class Size, class T> -void uninitialized_fill_n(ForwardIterator first, Size n, const T& x) { - while (n--) construct(first++, x); -} - -template <class InputIterator, class OutputIterator> -OutputIterator copy(InputIterator first, InputIterator last, - OutputIterator result) { - while (first != last) *result++ = *first++; - return result; -} - -template <class BidirectionalIterator1, class BidirectionalIterator2> -BidirectionalIterator2 copy_backward(BidirectionalIterator1 first, - BidirectionalIterator1 last, - BidirectionalIterator2 result) { - while (first != last) *--result = *--last; - return result; -} - -template <class ForwardIterator, class T> -void fill(ForwardIterator first, ForwardIterator last, const T& value) { - while (first != last) *first++ = value; -} - -template <class OutputIterator, class Size, class T> -void fill_n(OutputIterator first, Size n, const T& value) { - while (n-- > 0) *first++ = value; -} - -template <class InputIterator1, class InputIterator2> -pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, - InputIterator1 last1, - InputIterator2 first2) { - while (first1 != last1 && *first1 == *first2) { - ++first1; - ++first2; - } - return pair<InputIterator1, InputIterator2>(first1, first2); -} - -template <class InputIterator1, class InputIterator2, class BinaryPredicate> -pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, - InputIterator1 last1, - InputIterator2 first2, - BinaryPredicate binary_pred) { - while (first1 != last1 && binary_pred(*first1, *first2)) { - ++first1; - ++first2; - } - return pair<InputIterator1, InputIterator2>(first1, first2); -} - -template <class InputIterator1, class InputIterator2> -inline bool equal(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2) { - return mismatch(first1, last1, first2).first == last1; -} - -template <class InputIterator1, class InputIterator2, class BinaryPredicate> -inline bool equal(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, BinaryPredicate binary_pred) { - return mismatch(first1, last1, first2, binary_pred).first == last1; -} - -template <class InputIterator1, class InputIterator2> -bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2) { - while (first1 != last1 && first2 != last2) { - if (*first1 < *first2) return true; - if (*first2++ < *first1++) return false; - } - return first1 == last1 && first2 != last2; -} - -template <class InputIterator1, class InputIterator2, class Compare> -bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - Compare comp) { - while (first1 != last1 && first2 != last2) { - if (comp(*first1, *first2)) return true; - if (comp(*first2++, *first1++)) return false; - } - return first1 == last1 && first2 != last2; -} - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/bool.h b/STL/bool.h deleted file mode 100644 index 6049da9163d..00000000000 --- a/STL/bool.h +++ /dev/null @@ -1,58 +0,0 @@ -// $Id$ - -#if !defined (ACE_BOOL_H) -#define ACE_BOOL_H - -#if defined (_MSC_VER) - // Define bool out of the std namespace. -# if _MSC_VER > 1010 -# include /**/ <yvals.h> -# else /* _MSC_VER <= 1010 */ -# if !defined (bool) -# define bool int -# endif /* bool */ - -# if !defined (true) -# define true 1 -# endif /* true */ - -# if !defined (false) -# define false 0 -# endif /* false */ -# endif /* _MSC_VER <= 1010 */ -#endif /* _MSC_VER */ - - - /* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif /* ACE_BOOL_H */ diff --git a/STL/bstring.h b/STL/bstring.h deleted file mode 100644 index 04f6d9e6c01..00000000000 --- a/STL/bstring.h +++ /dev/null @@ -1,2516 +0,0 @@ -/** - ** Copyright (c) 1994-1995 Modena Software Inc., - ** - ** 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. Modena Software, Inc. makes no - ** representations about the suitability of this software for any - ** purpose. It is provided "as is" without express or implied warranty. - ** - **/ - -#ifndef __cplusplus -#error Must use C++ for BSTRING.H -#endif - -#ifndef __MBSTRING_H -#define __MBSTRING_H - -extern "C" { -#include <ctype.h> -#include <string.h> -#include <stddef.h> -#include <stdlib.h> -} - -#include <iostream.h> -#include <bool.h> - -// bc4const - -#ifdef __BC4_STL -#define __BC401_STL -#endif - -#ifdef __BC401_STL -#define __BC401_const -#else -#define __BC401_const const -#endif - -// bndchk.h -#ifdef BOUNDS_CHECK -void check_bounds - ( int index, - int container_size, - int lineno, - char *filename ); -#endif - -// mexcept.h - -#define _THROW_NONE -#define _THROW_DOMAIN -#define _THROW_INVALIDARG -#define _THROW_LENGTH -#define _THROW_OUTRANGE -#define _THROW_RANGE -#define _THROW_OVERFLOW -#define _THROW_ALLOC -#define _THROW_CAST -#define _THROW_TYPEID -#define _THROW_ALLOC_LENGTH -#define _THROW_ALLOC_OUTRANGE -#define _THROW_LENGTH_OUTRANGE -#define _THROW_ALLOC_LENGTH_OUTRANGE - -#include <vector.h> - -#ifdef __MMULTITHREAD -#include /**/ "mutex.h" -#endif - -const size_t NPOS = (size_t)(-1); - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -enum capacity { default_size, reserve }; - -template<class charT> -struct string_char_baggage { - - typedef charT char_type; - - // - // for users to acquire the basic character type - // - // constraints functions - // - static void - assign (char_type& c1, const char_type& c2) _THROW_NONE - { - c1 = c2; - } - static bool - eq (const char_type& c1, const char_type& c2) _THROW_NONE - { - return (c1 == c2); - } - static bool - ne (const char_type& c1, const char_type& c2) _THROW_NONE - { - return !(c1 == c2); - } - static bool - lt (const char_type& c1, const char_type& c2) _THROW_NONE - { - return (c1 < c2); - } - static char_type - eos () _THROW_NONE - { - return char_type(); // the null character - } - static istream& - char_in (istream& is, char_type& c) _THROW_NONE - { - return is >> c; // extractor for a char_type object - } - static ostream& - char_out (ostream& os, char_type c) _THROW_NONE - { - return os << c; // inserter for a char_type object - } - static bool - is_del (char_type c) _THROW_NONE - { - // characteristic function for delimiters of char_type - return isspace(c) != 0; - } - - // - // speed-up functions - // - static int - compare (const char_type* s1, const char_type* s2, size_t n) _THROW_NONE - { - for (size_t i = 0; i < n; ++i, ++s1, ++s2) - if (ne(*s1, *s2)) - { - return lt(*s1, *s2) ? -1 : 1; - } - return 0; - } - static size_t - length (const char_type* s) _THROW_NONE - { - size_t l = 0; - while (ne(*s++, eos())) - ++l; - return l; - } - static char_type* - copy (char_type* s1, const char_type* s2, size_t n) _THROW_NONE - { - char_type* s = s1; - for (size_t i = 0; i < n; ++i, s1++, s2++) - assign(*s1, *s2); - return s; - } -}; - -struct string_char_baggage<char> { - - typedef char char_type; - - // - // constraint member functions - // - static void - assign (char_type& c1, const char_type& c2) _THROW_NONE - { - c1 = c2; - } - static bool - eq (const char_type& c1, const char_type& c2) _THROW_NONE - { - return (c1 == c2); - } - static bool - ne (const char_type& c1, const char_type& c2) _THROW_NONE - { - return (c1 != c2); - } - static bool - lt (const char_type& c1, const char_type& c2) _THROW_NONE - { - return (c1 < c2); - } - static char_type - eos () _THROW_NONE - { - return 0; // the null character - } - static istream& - char_in (istream& is, char_type& c) _THROW_NONE - { - // extractor for a char_type object - // return is >> c; // this does not work - is.get(c); - return is; - } - static ostream& - char_out (ostream& os, char_type c) _THROW_NONE - { - return os << c; // inserter for a char_type object - } - static bool - is_del (char_type c) _THROW_NONE - { - // characteristic function for delimiters of char_type - return isspace(c) != 0; - } - - // - // speed-up functions - // - static int - compare (const char_type* s1, const char_type* s2, size_t n) _THROW_NONE - { - return memcmp(s1, s2, n); - } - static size_t - length (const char_type* s) _THROW_NONE - { - return strlen(s); - } - static char_type* - copy (char_type* s1, const char_type* s2, size_t n) _THROW_NONE - { - // type cast required as memcpy returns void* - return (char_type*)memcpy(s1, s2, n); - } -}; - -/* -struct string_char_baggage<wchar_t> { - - typedef wchar_t char_type; - - static void - assign (char_type& c1, const char_type& c2) _THROW_NONE - { - c1 = c2; - } - static bool - eq (const char_type& c1, const char_type& c2) _THROW_NONE - { - return (c1 == c2); - } - static bool - ne (const char_type& c1, const char_type& c2) _THROW_NONE - { - return (c1 != c2); - } - static bool - lt (const char_type& c1, const char_type& c2) _THROW_NONE - { - return (c1 < c2); - } - static char_type - eos () _THROW_NONE - { - return 0; // the null character - } - static istream& - char_in (istream& is, char_type& c) _THROW_NONE - { - return is >> c; // extractor for a char_type object - } - static ostream& - char_out (ostream& os, char_type c) _THROW_NONE - { - return os << c; // inserter for a char_type object - } - static bool - is_del (char_type c) _THROW_NONE - { - // characteristic function for delimiters of char_type - // using templatized locale::isspace function - return isspace(c); - } - - // - // speed-up functions - // - static int - compare (const char_type* s1, const char_type* s2, size_t n) _THROW_NONE - { - return wmemcmp(s1, s2, n); - } - static size_t - length (const char_type* s) _THROW_NONE - { - return wcslen(s); - // May use Koshida's overloaded MSE function strlen(s) - } - static char_type* - copy (char_type* s1, const char_type* s2, size_t n) _THROW_NONE - { - return (char_type*)wmemcpy(s1, s2, n); - } -}; -*/ - -template <class charT> -class basic_string; - -template <class charT> -class basic_string_ref { - -// -// friend class declaration -// -friend class basic_string<charT>; - -// -// typedef declarations -// -typedef string_char_baggage<charT> baggage_type; - -// -// private data members -// - charT* ptr; - size_t len; - size_t res; - -#ifdef __MMULTITHREAD - mutex_arith<size_t, mutex> count; // reference count -#else - size_t count; // reference count -#endif - -// -// private constructors and destructors -// - basic_string_ref () _THROW_NONE ; - - basic_string_ref (size_t size, capacity cap) _THROW_ALLOC_LENGTH ; - - basic_string_ref (const basic_string<charT>& str, size_t pos , size_t rlen) - _THROW_ALLOC ; - - basic_string_ref (const charT* s, size_t rlen, size_t rres) _THROW_ALLOC ; - - basic_string_ref (const charT* s, size_t n) _THROW_ALLOC_LENGTH ; - - basic_string_ref (const charT* s) _THROW_ALLOC ; - - basic_string_ref (charT c, size_t rep) _THROW_ALLOC_LENGTH ; - - basic_string_ref (const vector<charT>& vec) _THROW_ALLOC_LENGTH ; - - ~basic_string_ref () _THROW_NONE ; - - inline void - delete_ptr () _THROW_NONE ; - - inline static - charT - eos () _THROW_NONE ; - - inline static - void - throwlength () _THROW_LENGTH; - - inline static - void - throwrange () _THROW_OUTRANGE; - -}; - -template<class charT> -class basic_string { - -private: - -// -// typedef declaration -// - typedef basic_string_ref<charT> reference_class; - typedef basic_string_ref<charT>* reference_pointer; - -// -// data member -// - charT* c_str_ptr; - reference_pointer reference; - -// -// private member functions -// - inline charT* - point () _THROW_NONE ; - - inline size_t& - len () _THROW_NONE ; - - inline size_t - ref_count () const _THROW_NONE ; - - inline static - charT - eos () _THROW_NONE ; - - void - assign_str (const charT* s, size_t slen) _THROW_ALLOC_LENGTH ; - - void - append_str (const charT* s, size_t slen) _THROW_ALLOC_LENGTH ; - - void - insert_str (size_t pos, const charT* s, size_t slen) - _THROW_ALLOC_LENGTH_OUTRANGE ; - - void - replace_str (size_t xlen, size_t pos, const charT* s, size_t slen) - _THROW_ALLOC_LENGTH_OUTRANGE ; - - int - compare_str (size_t pos, const charT* str, size_t slen, size_t strlen) - const _THROW_OUTRANGE ; - - size_t - find_str (const charT* s, size_t pos, size_t len) const _THROW_NONE ; - - size_t - rfind_str (const charT* s, size_t pos, size_t len) const _THROW_NONE ; - - size_t - find_first_of_str (const charT* s, size_t pos, size_t len) const - _THROW_NONE ; - - size_t - find_last_of_str (const charT* s, size_t pos, size_t len) const - _THROW_NONE ; - - size_t - find_first_not_of_str (const charT* s, size_t pos, size_t len) const - _THROW_NONE ; - - size_t - find_last_not_of_str (const charT* s, size_t pos, size_t len) const - _THROW_NONE ; - - -protected: - - basic_string (const charT* s, size_t rlen, size_t xlen) _THROW_ALLOC_LENGTH; - - inline void - delete_ref () _THROW_NONE ; - -public: - - static const size_t npos; - - typedef charT char_type; - typedef string_char_baggage<charT> baggage_type; - - basic_string () _THROW_ALLOC ; - - basic_string (size_t size, capacity cap) _THROW_ALLOC_LENGTH ; - - basic_string (const basic_string<charT>& str, size_t pos = 0, size_t n = NPOS) - _THROW_ALLOC_OUTRANGE ; - - basic_string (const charT* s, size_t n) _THROW_ALLOC_LENGTH ; - - basic_string (const charT* s) _THROW_ALLOC ; - - basic_string (charT c, size_t rep = 1) _THROW_ALLOC_LENGTH ; - - basic_string (const vector<charT>& vec) _THROW_ALLOC_LENGTH ; - - ~basic_string () _THROW_NONE ; - - basic_string<charT>& - operator= (const basic_string<charT>& str) _THROW_ALLOC ; - - basic_string<charT>& - operator= (const charT* s) _THROW_ALLOC ; - - basic_string<charT>& - operator= (charT c) _THROW_ALLOC ; - - basic_string<charT>& - operator+= (const basic_string<charT>& rhs) _THROW_ALLOC_LENGTH ; - - basic_string<charT>& - operator+= (const charT* s) _THROW_ALLOC_LENGTH ; - - basic_string<charT>& - operator+= (charT c) _THROW_ALLOC_LENGTH ; - - operator vector<charT> () const _THROW_ALLOC - { - return vector<charT> (data(), data()+length()); - } - - - basic_string<charT>& - append (const basic_string<charT>& str, size_t pos = 0, size_t n = NPOS) - _THROW_ALLOC_LENGTH_OUTRANGE ; - - basic_string<charT>& - append (const charT* s, size_t n) _THROW_ALLOC_LENGTH ; - - basic_string<charT>& - append (const charT* s) _THROW_ALLOC_LENGTH ; - - basic_string<charT>& - append (charT c, size_t rep = 1) _THROW_ALLOC_LENGTH ; - - basic_string<charT>& - assign (const basic_string<charT>& str, size_t pos = 0, size_t n = NPOS) - _THROW_ALLOC_LENGTH_OUTRANGE ; - - basic_string<charT>& - assign (const charT* s, size_t n) _THROW_ALLOC_LENGTH ; - - basic_string<charT>& - assign (const charT* s) _THROW_ALLOC_LENGTH ; - - basic_string<charT>& - assign (charT c, size_t rep = 1) _THROW_ALLOC_LENGTH ; - - basic_string<charT>& - insert (size_t pos1, const basic_string<charT>& str, size_t pos2 = 0, - size_t n = NPOS) _THROW_ALLOC_LENGTH_OUTRANGE ; - - basic_string<charT>& - insert (size_t pos, const charT* s, size_t n) _THROW_ALLOC_LENGTH_OUTRANGE ; - - basic_string<charT>& - insert (size_t pos, const charT* s) _THROW_ALLOC_LENGTH_OUTRANGE ; - - basic_string<charT>& - insert (size_t pos, charT c, size_t rep = 1) _THROW_ALLOC_LENGTH_OUTRANGE ; - - basic_string<charT>& - remove (size_t pos = 0, size_t n = NPOS) _THROW_ALLOC_OUTRANGE ; - - basic_string<charT>& - replace (size_t pos1, size_t n1, const basic_string<charT>& str, size_t pos2 = 0, - size_t n2 = NPOS) _THROW_ALLOC_LENGTH_OUTRANGE ; - - basic_string<charT>& - replace (size_t pos, size_t n1, const charT* s, size_t n2) - _THROW_ALLOC_LENGTH_OUTRANGE ; - - basic_string<charT>& - replace (size_t pos, size_t n1, const charT* s) - _THROW_ALLOC_LENGTH_OUTRANGE ; - - basic_string<charT>& - replace (size_t pos, size_t n, charT c, size_t rep = 1) - _THROW_ALLOC_LENGTH_OUTRANGE ; - - inline charT - get_at (size_t pos) const _THROW_OUTRANGE ; - - void - put_at (size_t pos, charT c) _THROW_ALLOC_OUTRANGE ; - - inline charT - operator[] (size_t pos) const _THROW_NONE ; - - charT& - operator[] (size_t pos) _THROW_ALLOC_OUTRANGE ; - - const charT* - c_str () const _THROW_ALLOC ; - - inline const charT* - data () const _THROW_NONE ; - - inline size_t - length () const _THROW_NONE ; - - void - resize (size_t n, charT c) _THROW_ALLOC_LENGTH ; - - void - resize (size_t n) _THROW_ALLOC_LENGTH ; - - inline size_t - reserve () const _THROW_NONE ; - - void - reserve (size_t res_arg) _THROW_ALLOC_LENGTH ; - - size_t - copy (charT* s, size_t n, size_t pos = 0) const _THROW_OUTRANGE ; - - size_t - find (const basic_string<charT>& str, size_t pos = 0) const _THROW_NONE ; - - size_t - find (const charT* s, size_t pos, size_t n) const _THROW_NONE ; - - size_t - find (const charT* s, size_t pos = 0) const _THROW_NONE ; - - size_t - find (charT c, size_t pos = 0) const _THROW_NONE ; - - size_t - rfind (const basic_string<charT>& str, size_t pos = NPOS) const _THROW_NONE ; - - size_t - rfind (const charT* s, size_t pos, size_t n) const _THROW_NONE ; - - size_t - rfind (const charT* s, size_t pos = NPOS) const _THROW_NONE ; - - size_t - rfind (charT c, size_t pos = NPOS) const _THROW_NONE ; - - size_t - find_first_of (const basic_string<charT>& str, size_t pos = 0) const _THROW_NONE ; - - size_t - find_first_of (const charT* s, size_t pos, size_t n) const _THROW_NONE ; - - size_t - find_first_of (const charT* s, size_t pos = 0) const _THROW_NONE ; - - size_t - find_first_of (charT c, size_t pos = 0) const _THROW_NONE ; - - - size_t - find_last_of (const basic_string<charT>& str, size_t pos = NPOS) const - _THROW_NONE ; - - size_t - find_last_of (const charT* s, size_t pos, size_t n) const _THROW_NONE ; - - size_t - find_last_of (const charT* s, size_t pos = NPOS) const _THROW_NONE ; - - size_t - find_last_of (charT c, size_t pos = NPOS) const _THROW_NONE ; - - size_t - find_first_not_of (const basic_string<charT>& str, size_t pos = 0) const - _THROW_NONE ; - - size_t - find_first_not_of (const charT* s, size_t pos, size_t n) const _THROW_NONE ; - - size_t - find_first_not_of (const charT* s, size_t pos = 0) const _THROW_NONE ; - - size_t - find_first_not_of (charT c, size_t pos = 0) const _THROW_NONE ; - - size_t - find_last_not_of (const basic_string<charT>& str, size_t pos = NPOS) const - _THROW_NONE ; - - size_t - find_last_not_of (const charT* s, size_t pos, size_t n) const _THROW_NONE ; - - size_t - find_last_not_of (const charT* s, size_t pos = NPOS) const _THROW_NONE ; - - size_t - find_last_not_of (charT c, size_t pos = NPOS) const _THROW_NONE ; - - basic_string<charT> - substr (size_t pos = 0, size_t n = NPOS) const _THROW_ALLOC_OUTRANGE ; - - int - compare (const basic_string<charT>& str, size_t pos = 0, size_t n = NPOS) const - _THROW_OUTRANGE ; - - int - compare (const charT* s, size_t pos, size_t n) const - _THROW_LENGTH_OUTRANGE ; - - int - compare (const charT* s, size_t pos = 0) const _THROW_OUTRANGE ; - - int - compare (charT c, size_t pos = 0, size_t rep = 1) const - _THROW_LENGTH_OUTRANGE ; - - friend - ostream& - operator<< (ostream& o, const basic_string<charT>& s) _THROW_NONE ; - - friend - istream& - operator>> (istream& i, basic_string<charT>& s) _THROW_ALLOC_LENGTH ; - - friend - basic_string<charT> - operator+ (const basic_string<charT>& lhs, const basic_string<charT>& rhs) - _THROW_ALLOC_LENGTH ; - - friend - basic_string<charT> - operator+ (const charT* lhs, const basic_string<charT>& rhs) - _THROW_ALLOC_LENGTH ; - - friend - basic_string<charT> - operator+ (charT lhs, const basic_string<charT>& rhs) _THROW_ALLOC_LENGTH ; - - friend - basic_string<charT> - operator+ (const basic_string<charT>& lhs, const charT* rhs) - _THROW_ALLOC_LENGTH ; - - friend - basic_string<charT> - operator+ (const basic_string<charT>& lhs, charT rhs) _THROW_ALLOC_LENGTH ; - -}; - -template <class charT> -inline void -basic_string_ref<charT>::delete_ptr () _THROW_NONE -{ - if (res) - { - delete[] ptr; - res = 0; - ptr = 0; - } -} - -template <class charT> -inline void -basic_string_ref<charT>::throwlength () _THROW_LENGTH -{ -#ifdef __MEXCEPT - throw length_error("Length exception occurred"); -#else - cout << "Length exception occurred" << endl; - exit(1); -#endif -} - -template <class charT> -inline void -basic_string_ref<charT>::throwrange () _THROW_OUTRANGE -{ -#ifdef __MEXCEPT - throw out_of_range("Out of range exception occurred"); -#else - cout << "Out of range exception occurred" << endl; - exit(1); -#endif -} - -template <class charT> -inline void -basic_string<charT>::delete_ref () _THROW_NONE -{ - --(reference->count); - if (!(reference->count)) - delete reference; -} - -template <class charT> -inline size_t -basic_string<charT>::ref_count () const _THROW_NONE -{ - return reference->count; -} - -template <class charT> -inline const charT* -basic_string<charT>::data () const _THROW_NONE -{ - if (length()) - return reference->ptr; - else - return 0; -} - -template <class charT> -inline charT* -basic_string<charT>::point () _THROW_NONE -{ - return reference->ptr; -} - -template <class charT> -inline size_t& -basic_string<charT>::len () _THROW_NONE -{ - return reference->len; -} - -template <class charT> -inline size_t -basic_string<charT>::length () const _THROW_NONE -{ - return reference->len; -} - -template <class charT> -inline size_t -basic_string<charT>::reserve () const _THROW_NONE -{ - return reference->res; -} - -template <class charT> -inline charT -basic_string<charT>::get_at (size_t pos) const _THROW_OUTRANGE -{ - if (pos >= length()) - { - reference_class::throwrange(); - } - return *(data()+pos); -} - -template <class charT> -inline charT -basic_string<charT>::operator[] (size_t pos) const _THROW_NONE -{ - if (pos < length()) - return *(data()+pos); - else - return 0; -} - -template <class charT> -inline bool -operator== (const basic_string<charT>& lhs, const basic_string<charT>& rhs) - _THROW_NONE -{ - return !(lhs.compare(rhs)); -} - -template <class charT> -inline bool -operator== (const charT* lhs, const basic_string<charT>& rhs) _THROW_NONE -{ - return !(rhs.compare(lhs)); -} - -template <class charT> -inline bool -operator== (charT lhs, const basic_string<charT>& rhs) _THROW_NONE -{ - return !(rhs.compare(lhs)); -} - -template <class charT> -inline bool -operator== (const basic_string<charT>& lhs, const charT* rhs) _THROW_NONE -{ - return !(lhs.compare(rhs)); -} - -template <class charT> -inline bool -operator== (const basic_string<charT>& lhs, charT rhs) _THROW_NONE -{ - return !(lhs.compare(rhs)); -} - -#ifdef __MNONDEF -template <class charT> -inline bool -operator!= (const basic_string<charT>& lhs, const basic_string<charT>& rhs) - _THROW_NONE -{ - return lhs.compare(rhs); -} -#endif - -template <class charT> -inline bool -operator!= (const charT* lhs, const basic_string<charT>& rhs) _THROW_NONE -{ - return rhs.compare(lhs); -} - -template <class charT> -inline bool -operator!= (charT lhs, const basic_string<charT>& rhs) _THROW_NONE -{ - return rhs.compare(lhs); -} - -template <class charT> -inline bool -operator!= (const basic_string<charT>& lhs, const charT* rhs) _THROW_NONE -{ - return lhs.compare(rhs); -} - -template <class charT> -inline bool -operator!= (const basic_string<charT>& lhs, charT rhs) _THROW_NONE -{ - return lhs.compare(rhs); -} - -template <class charT> -inline bool -operator< (const basic_string<charT>& lhs, const basic_string<charT>& rhs) - _THROW_NONE -{ - if (lhs.compare(rhs) < 0) - return true; - else - return false; -} - -template <class charT> -inline bool -operator< (const charT* lhs, const basic_string<charT>& rhs) _THROW_NONE -{ - if (rhs.compare(lhs) > 0) - return true; - else - return false; -} - -template <class charT> -inline bool -operator< (charT lhs, const basic_string<charT>& rhs) _THROW_NONE -{ - if (rhs.compare(lhs) > 0) - return true; - else - return false; -} - -template <class charT> -inline bool -operator< (const basic_string<charT>& lhs, const charT* rhs) _THROW_NONE -{ - if (lhs.compare(rhs) < 0) - return true; - else - return false; -} - -template <class charT> -inline bool -operator< (const basic_string<charT>& lhs, charT rhs) _THROW_NONE -{ - if (lhs.compare(rhs) < 0) - return true; - else - return false; -} - -#ifdef __MNONDEF -template <class charT> -inline bool -operator> (const basic_string<charT>& lhs, const basic_string<charT>& rhs) - _THROW_NONE -{ - return (rhs < lhs); -} -#endif - -template <class charT> -inline bool -operator> (const charT* lhs, const basic_string<charT>& rhs) _THROW_NONE -{ - return (rhs < lhs); -} - -template <class charT> -inline bool -operator> (charT lhs, const basic_string<charT>& rhs) _THROW_NONE -{ - return (rhs < lhs); -} - -template <class charT> -inline bool -operator> (const basic_string<charT>& lhs, const charT* rhs) _THROW_NONE -{ - return (rhs < lhs); -} - -template <class charT> -inline bool -operator> (const basic_string<charT>& lhs, charT rhs) _THROW_NONE -{ - return (rhs < lhs); -} - -#ifdef __MNONDEF -template <class charT> -inline bool -operator>= (const basic_string<charT>& lhs, const basic_string<charT>& rhs) - _THROW_NONE -{ - return !(lhs < rhs); -} -#endif - -template <class charT> -inline bool -operator>= (const charT* lhs, const basic_string<charT>& rhs) _THROW_NONE -{ - return !(lhs < rhs); -} - -template <class charT> -inline bool -operator>= (charT lhs, const basic_string<charT>& rhs) _THROW_NONE -{ - return !(lhs < rhs); -} - -template <class charT> -inline bool -operator>= (const basic_string<charT>& lhs, const charT* rhs) _THROW_NONE -{ - return !(lhs < rhs); -} - -template <class charT> -inline bool -operator>= (const basic_string<charT>& lhs, charT rhs) _THROW_NONE -{ - return !(lhs < rhs); -} - -#ifdef __MNONDEF -template <class charT> -inline bool -operator<= (const basic_string<charT>& lhs, const basic_string<charT>& rhs) - _THROW_NONE -{ - return !(rhs < lhs); -} -#endif - -template <class charT> -inline bool -operator<= (const charT* lhs, const basic_string<charT>& rhs) _THROW_NONE -{ - return !(rhs < lhs); -} - -template <class charT> -inline bool -operator<= (charT lhs, const basic_string<charT>& rhs) _THROW_NONE -{ - return !(rhs < lhs); -} - -template <class charT> -inline bool -operator<= (const basic_string<charT>& lhs, const charT* rhs) _THROW_NONE -{ - return !(rhs < lhs); -} - -template <class charT> -inline bool -operator<= (const basic_string<charT>& lhs, charT rhs) _THROW_NONE -{ - return !(rhs < lhs); -} - -// definitions : can be in a .c file -// - -template <class charT> -charT -basic_string_ref<charT>::eos () _THROW_NONE -{ - return baggage_type::eos(); -} - -template <class charT> -basic_string_ref<charT>::basic_string_ref () _THROW_NONE -{ - res = len = 0; - ptr = 0; - count = 1; -} - -template <class charT> -basic_string_ref<charT>::basic_string_ref (size_t size, capacity cap) - _THROW_ALLOC_LENGTH -{ - /* - * This should be correctly scoped - * - * if (cap == ::reserve) - */ - - if (cap == std::reserve) - { - len = 0; - res = size; - ptr = new charT [res]; - } - /* - * This should be correctly scoped - * - * else if ((cap == ::default_size) && (size != NPOS)) - */ - - else if ((cap == std::default_size) && (size != NPOS)) - { - res = len = size; - if (res) - { - ptr = new charT [res]; - for (size_t position = 0; position < len; ++position) - baggage_type::assign (*(ptr+position), eos()); - } - else - ptr = 0; - } - else - { - throwlength(); - } - count = 1; -} - -template <class charT> -basic_string_ref<charT>::basic_string_ref (const basic_string<charT>& str, - size_t pos, size_t rlen) _THROW_ALLOC -{ - res = len = rlen; - if (res) - { - ptr = new charT [res]; - baggage_type::copy (ptr, str.data()+pos, len); - } - else - ptr = 0; - count = 1; -} - -template <class charT> -basic_string_ref<charT>::basic_string_ref (const charT* s, size_t rlen, - size_t rres) _THROW_ALLOC -{ - res = rres; - len = rlen; - if (res) - { - ptr = new charT [res]; - if (len) - baggage_type::copy (ptr, s, len); - } - else - ptr = 0; - count = 1; -} - -template <class charT> -basic_string_ref<charT>::basic_string_ref (const charT* s, size_t n) - _THROW_ALLOC_LENGTH -{ - if (n == NPOS) - { - throwlength(); - } - res = len = n; - if (res) - { - ptr = new charT [res]; - baggage_type::copy (ptr, s, len); - } - else - ptr = 0; - count = 1; -} - -template <class charT> -basic_string_ref<charT>::basic_string_ref (const charT* s) _THROW_ALLOC -{ - res = len = baggage_type::length(s); - if (res) - { - ptr = new charT [res]; - baggage_type::copy (ptr, s, len); - } - else - ptr = 0; - count = 1; -} - -template <class charT> -basic_string_ref<charT>::basic_string_ref (charT c, size_t rep) - _THROW_ALLOC_LENGTH -{ - if (rep == NPOS) - { - throwlength(); - } - res = len = rep; - if (res) - { - ptr = new charT [res]; - for (size_t position = 0; position < len; ++position) - baggage_type::assign (*(ptr+position), c); - } - else - ptr = 0; - count = 1; -} - -template <class charT> -basic_string_ref<charT>::basic_string_ref (const vector<charT>& vec) - _THROW_ALLOC_LENGTH -{ - size_t n = vec.size(); - if (n == NPOS) - { - throwlength(); - } - res = len = n; - if (res) - { - ptr = new charT [res]; - baggage_type::copy (ptr, vec.begin(), len); - } - else - ptr = 0; - count = 1; -} - -template <class charT> -basic_string_ref<charT>::~basic_string_ref () _THROW_NONE -{ - delete_ptr(); -} - -template <class charT> -charT -basic_string<charT>::eos () _THROW_NONE -{ - return baggage_type::eos(); -} - -template <class charT> -void -basic_string<charT>::assign_str (const charT* s, size_t slen) - _THROW_ALLOC_LENGTH -{ - if (slen == NPOS) - { - reference_class::throwlength(); - } - if ((ref_count() > 1) || (slen && (reserve() < slen))) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (s, slen); - delete_ref(); - reference = tmp; - } - else if (slen) - { - baggage_type::copy (point(), s, slen); - } - reference->len = slen; -} - -template <class charT> -void -basic_string<charT>::append_str (const charT* s, size_t slen) - _THROW_ALLOC_LENGTH -{ - if (length() >= (NPOS-slen)) - { - reference_class::throwlength(); - } - if ((ref_count() > 1) || (slen > (reserve()-length()))) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (data(), length(), length()+slen); - delete_ref(); - reference = tmp; - } - if (slen) - baggage_type::copy (point()+length(), s, slen); - reference->len += slen; -} - -template <class charT> -void -basic_string<charT>::insert_str (size_t pos, const charT* s, size_t slen) - _THROW_ALLOC_LENGTH_OUTRANGE -{ - if (pos > length()) - { - reference_class::throwrange(); - } - if (length() >= (NPOS-slen)) - { - reference_class::throwlength(); - } - if ((ref_count() > 1) || (slen > (reserve()-length()))) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (data(), pos, length()+slen); - baggage_type::copy (tmp->ptr+pos+slen, data()+pos, length()-pos); - tmp->len = length(); - delete_ref(); - reference = tmp; - } - else - { - for (size_t count = length()-pos; count > 0; --count) - baggage_type::assign (*(point()+pos+slen+count-1), - *(data()+pos+count-1)); - } - if (slen) - baggage_type::copy (point()+pos, s, slen); - reference->len += slen; -} - -template <class charT> -void -basic_string<charT>::replace_str (size_t xlen, size_t pos, const charT* s, - size_t slen) _THROW_ALLOC_LENGTH_OUTRANGE -{ - if (pos > length()) - { - reference_class::throwrange(); - } - if ((length()-xlen) >= (NPOS-slen)) - { - reference_class::throwlength(); - } - if ((ref_count() > 1) || (reserve() < (length()+slen-xlen))) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (data(), pos, length()+slen-xlen); - baggage_type::copy (tmp->ptr+pos+slen, data()+pos+xlen, - length()-pos-xlen); - tmp->len = length(); - delete_ref(); - reference = tmp; - } - else - { - if (slen < xlen) - baggage_type::copy (point()+pos+slen, data()+pos+xlen, - length()-pos-xlen); - else - { - for (size_t count = length()-pos-xlen; count > 0; --count) - baggage_type::assign (*(point()+pos+slen+count-1), - *(data()+pos+xlen+count-1)); - } - } - if (slen) - baggage_type::copy (point()+pos, s, slen); - reference->len += (slen-xlen); -} - -template <class charT> -int -basic_string<charT>::compare_str (size_t pos, const charT* str, size_t slen, - size_t strlen) const _THROW_OUTRANGE -{ - if (pos > length()) - { - reference_class::throwrange(); - } - size_t rlen = (slen > strlen ) ? strlen : slen; - int result; - if (!length()) - return str ? (eos()- *str) : eos(); - result = baggage_type::compare (data()+pos, str, rlen); - return result ? result : (length()-pos-strlen); -} - -template <class charT> -size_t -basic_string<charT>::find_str (const charT* s, size_t pos, size_t len) - const _THROW_NONE -{ - size_t count = pos; - size_t shift; - size_t place; - if ((length() == 0) || (len == 0)) - return NPOS; - while (len <= (length()-count)) - { - for (place = 0; place < len; ++place) - { - if (baggage_type::ne(*(s+len-1-place), *(data()+count+(len-1-place)))) - break; - } - if (place == len) - return count; - shift = find(*(s+len-1-place), count+(len-place)); - if (shift == NPOS) - return NPOS; - count = shift-(len-place-1); - } - return NPOS; -} - -template <class charT> -size_t -basic_string<charT>::rfind_str (const charT* s, size_t pos, size_t len) - const _THROW_NONE -{ - size_t count = (pos < (length()-len)) ? (pos+1) : (length()-len); - size_t shift; - size_t place; - if ((length() < len) || (len == 0)) - return NPOS; - while (count > 0) - { - for (place = 0; place < len; ++place) - { - if (baggage_type::ne(*(s+len-1-place), *(data()+count+(len-place)-2))) - break; - } - if (place == len) - return count-1; - shift = rfind(*(s+len-1-place), count+(len-place)-3); - if (shift == NPOS) - return NPOS; - count = shift+place-len+2; - } - return NPOS; - -} - -template <class charT> -size_t -basic_string<charT>::find_first_of_str (const charT* s, size_t pos, size_t len) - const _THROW_NONE -{ - size_t temp; - size_t count = pos; - size_t result = NPOS; - while (count < length()) - { - temp = 0; - while ((temp < len) && baggage_type::ne(*(data()+count), *(s+temp))) - ++temp; - if (temp != len) - break; - ++count; - } - temp = (count >= length()) ? NPOS : count; - return ((result > temp) ? temp : result); -} - -template <class charT> -size_t -basic_string<charT>::find_last_of_str (const charT* s, size_t pos, size_t len) - const _THROW_NONE -{ - size_t temp = 0; - size_t count = (pos < length()) ? (pos+1) : length(); - if (length()) - { - while (count > 0) - { - temp = 0; - --count; - while ((temp != len) && baggage_type::ne(*(data()+count), *(s+temp))) - ++temp; - if (temp != len) - break; - } - } - return ((temp != len) && length()) ? count : NPOS; -} - -template <class charT> -size_t -basic_string<charT>::find_first_not_of_str (const charT* s, size_t pos, - size_t len) const _THROW_NONE -{ - size_t count = pos; - while (count < length()) - { - size_t temp = 0; - while (temp < len) - { - if (baggage_type::eq(*(data()+count), *(s+temp))) - break; - ++temp; - } - if (temp == len) - break; - ++count; - } - return ((count >= length()) ? NPOS : count); -} - -template <class charT> -size_t -basic_string<charT>::find_last_not_of_str (const charT* s, size_t pos, - size_t len) const _THROW_NONE -{ - size_t temp = 0; - size_t count = (pos < length()) ? (pos+1) : length(); - - if (length()) - { - while (count > 0) - { - temp = 0; - while (temp != len) - { - if (baggage_type::eq(*(data()+count-1), *(s+temp))) - break; - ++temp; - } - if (temp == len) - break; - --count; - } - } - return ((temp == len) && length()) ? count-1 : NPOS; -} - -template <class charT> -basic_string<charT>::basic_string () _THROW_ALLOC -{ - reference = new basic_string_ref<charT> (); - c_str_ptr = 0; -} - -template <class charT> -basic_string<charT>::basic_string (size_t size, capacity cap) - _THROW_ALLOC_LENGTH -{ - reference = new basic_string_ref<charT> (size, cap); - c_str_ptr = 0; -} - -template <class charT> -basic_string<charT>::basic_string (const basic_string<charT>& str, - size_t pos, size_t n) _THROW_ALLOC_OUTRANGE -{ - if (pos > str.length()) - { - reference_class::throwrange(); - } - size_t rlen = (n > (str.length() - pos)) ? str.length() - pos : n; - if ((rlen == str.length()) && (str.ref_count() != NPOS)) - (reference = str.reference)->count++; - else - reference = new basic_string_ref<charT> (str, pos, rlen); - c_str_ptr = 0; -} - -template <class charT> -basic_string<charT>::basic_string (const charT* s, size_t rlen, size_t xlen) - _THROW_ALLOC_LENGTH -{ - if (rlen >= (NPOS - xlen)) - { - reference_class::throwlength(); - } - reference = new basic_string_ref<charT> (s, rlen, rlen+xlen); - c_str_ptr = 0; -} - -template <class charT> -basic_string<charT>::basic_string (const charT* s, size_t n) _THROW_ALLOC_LENGTH -{ - reference = new basic_string_ref<charT> (s, n); - c_str_ptr = 0; -} - -template <class charT> -basic_string<charT>::basic_string (const charT* s) _THROW_ALLOC -{ - reference = new basic_string_ref<charT> (s); - c_str_ptr = 0; -} - -template <class charT> -basic_string<charT>::basic_string (charT c, size_t rep) _THROW_ALLOC_LENGTH -{ - reference = new basic_string_ref<charT> (c, rep); - c_str_ptr = 0; -} - -template <class charT> -basic_string<charT>::basic_string (const vector<charT>& vec) _THROW_ALLOC_LENGTH -{ - reference = new basic_string_ref<charT> (vec); - c_str_ptr = 0; -} - -template <class charT> -basic_string<charT>::~basic_string () _THROW_NONE -{ - delete_ref(); - if (c_str_ptr) - delete[] c_str_ptr; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::operator= (const basic_string<charT>& str) _THROW_ALLOC -{ - if (this != &str) - { - delete_ref(); - if (str.ref_count() != NPOS) - (reference = str.reference)->count++; - else - reference = new basic_string_ref<charT> (str, 0, str.length()); - } - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::operator= (const charT* s) _THROW_ALLOC -{ - assign_str (s, baggage_type::length(s)); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::operator= (charT c) _THROW_ALLOC -{ - if ((ref_count() == 1) && (reserve() >= 1)) - { - baggage_type::assign (*(point()), c); - reference->len = 1; - } - else - { - delete_ref(); - reference = new basic_string_ref<charT> (c, 1); - } - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::operator+= (const basic_string<charT>& rhs) _THROW_ALLOC_LENGTH -{ - append_str (rhs.data(), rhs.length()); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::operator+= (const charT* s) _THROW_ALLOC_LENGTH -{ - append_str (s, baggage_type::length(s)); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::operator+= (charT c) _THROW_ALLOC_LENGTH -{ - if (length() >= (NPOS-1)) - { - reference_class::throwlength(); - } - if (!((ref_count() == 1) && (reserve() > length()))) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (data(), length(), length()+1); - delete_ref(); - reference = tmp; - } - baggage_type::assign (*(point()+length()), c); - reference->len++; - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::append (const basic_string<charT>& str, size_t pos, size_t n) - _THROW_ALLOC_LENGTH_OUTRANGE -{ - if (pos > str.length()) - { - reference_class::throwrange(); - } - append_str (str.data() + pos, (n>(str.length()-pos))?(str.length()-pos):n); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::append (const charT* s, size_t n) _THROW_ALLOC_LENGTH -{ - append_str (s, n); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::append (const charT* s) _THROW_ALLOC_LENGTH -{ - append_str (s, baggage_type::length(s)); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::append (charT c, size_t rep) _THROW_ALLOC_LENGTH -{ - if (length() >= (NPOS-rep)) - { - reference_class::throwlength(); - } - if (rep) - { - if ((ref_count() > 1) || (reserve() < (length() + rep))) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (data(), length(), length()+rep); - delete_ref(); - reference = tmp; - } - for (size_t count = 0; count < rep; ++count) - baggage_type::assign (*(point()+length()+count), c); - reference->len += rep; - } - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::assign (const basic_string<charT>& str, size_t pos, size_t n) - _THROW_ALLOC_LENGTH_OUTRANGE -{ - if (pos > str.length()) - { - reference_class::throwrange(); - } - size_t rlen = (n > (str.length() - pos)) ? str.length() - pos : n; - if ((rlen == str.length()) && (str.ref_count() != NPOS)) - { - delete_ref(); - (reference = str.reference)->count++; - } - else - assign_str (str.data()+pos, rlen); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::assign (const charT* s, size_t n) _THROW_ALLOC_LENGTH -{ - assign_str (s, n); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::assign (const charT* s) _THROW_ALLOC_LENGTH -{ - assign_str (s, baggage_type::length(s)); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::assign (charT c, size_t rep) _THROW_ALLOC_LENGTH -{ - if (rep == NPOS) - { - reference_class::throwlength(); - } - if ((ref_count() > 1) || (rep && (reserve() < rep))) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (c, rep); - delete_ref(); - reference = tmp; - } - else - { - for (size_t count = 0; count < rep; ++count) - baggage_type::assign (*(point()+count), c); - reference->len = rep; - } - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::insert (size_t pos1, const basic_string<charT>& str, - size_t pos2, size_t n) _THROW_ALLOC_LENGTH_OUTRANGE -{ - if (pos2 > str.length()) - { - reference_class::throwrange(); - } - size_t rlen = (n > (str.length() - pos2)) ? str.length() - pos2 : n; - insert_str (pos1, str.data()+pos2, rlen); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::insert (size_t pos, const charT* s, size_t n) - _THROW_ALLOC_LENGTH_OUTRANGE -{ - insert_str(pos, s, n); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::insert (size_t pos, const charT* s) - _THROW_ALLOC_LENGTH_OUTRANGE -{ - insert_str(pos, s, baggage_type::length(s)); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::insert (size_t pos, charT c, size_t rep) - _THROW_ALLOC_LENGTH_OUTRANGE -{ - if (pos > length()) - { - reference_class::throwrange(); - } - if ((rep == NPOS) || (length() >= (NPOS - rep))) - { - reference_class::throwlength(); - } - if (rep) - { - size_t count; - if ((ref_count() > 1) || (reserve() < (length()+rep))) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (data(), pos, length()+rep); - if (length()) - for (count = length()-pos; count > 0; --count) - baggage_type::assign (*(tmp->ptr+pos+rep+count-1), - *(data()+pos+count-1)); - tmp->len = length(); - delete_ref(); - reference = tmp; - } - else - { - for (count = length()-pos; count > 0; --count) - baggage_type::assign (*(point()+pos+rep+count-1), - *(data()+pos+count-1)); - } - for (count = 0; count < rep; ++count) - baggage_type::assign (*(point()+pos+count), c); - reference->len += rep; - } - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::remove (size_t pos, size_t n) _THROW_ALLOC_OUTRANGE -{ - if (pos > length()) - { - reference_class::throwrange(); - } - size_t xlen = (n > (length()-pos)) ? (length()-pos) : n; - if (ref_count() > 1) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (data(), pos, length()); - baggage_type::copy (tmp->ptr+pos, data()+pos+xlen, length()-xlen-pos); - tmp->len = length()-xlen; - delete_ref(); - reference = tmp; - } - else if (xlen == length()) - reference->len = 0; - else if (xlen) - { - baggage_type::copy (point()+pos, data()+pos+xlen, length()-xlen-pos); - reference->len -= xlen; - } - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::replace (size_t pos1, size_t n1, const basic_string<charT>& str, - size_t pos2, size_t n2) _THROW_ALLOC_LENGTH_OUTRANGE -{ - if (pos2 > str.length()) - { - reference_class::throwrange(); - } - size_t xlen = (n1 > (length()-pos1)) ? (length()-pos1) : n1; - size_t rlen = (n2 > (str.length()-pos2)) ? (str.length()-pos2) : n2; - replace_str (xlen, pos1, str.data()+pos2, rlen); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::replace (size_t pos, size_t n1, const charT* s, size_t n2) - _THROW_ALLOC_LENGTH_OUTRANGE -{ - size_t xlen = (n1 > (length()-pos)) ? (length()-pos) : n1; - replace_str (xlen, pos, s, n2); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::replace (size_t pos, size_t n1, const charT* s) - _THROW_ALLOC_LENGTH_OUTRANGE -{ - size_t xlen = (n1 > (length()-pos)) ? (length()-pos) : n1; - replace_str (xlen, pos, s, baggage_type::length(s)); - return *this; -} - -template <class charT> -basic_string<charT>& -basic_string<charT>::replace (size_t pos, size_t n, charT c, size_t rep) - _THROW_ALLOC_LENGTH_OUTRANGE -{ - if (pos > length()) - { - reference_class::throwrange(); - } - size_t xlen = (n > (length()-pos)) ? (length()-pos) : n; - if ((length()-xlen) >= (NPOS-rep)) - { - reference_class::throwlength(); - } - if (!rep) - return remove (pos, n); - else - { - size_t count; - if ((ref_count() > 1) || (reserve() < (length()-xlen+rep))) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (data(), pos, - length()+((xlen > rep) ? (xlen-rep) : 0)); - if (rep < xlen) - baggage_type::copy (tmp->ptr+pos+rep, data()+pos+xlen, - length()-pos-xlen); - else - { - for (count = length()-xlen-pos; count > 0; --count) - baggage_type::assign (*(tmp->ptr+pos+rep+count-1), - *(data()+pos+xlen+count-1)); - } - tmp->len = length(); - delete_ref(); - reference = tmp; - } - else - { - if (rep < xlen) - baggage_type::copy (point()+pos+rep, data()+pos+xlen, - length()-pos-xlen); - else - { - for (count = length()-xlen-pos; count > 0; --count) - baggage_type::assign (*(point()+pos+rep+count-1), - *(data()+pos+xlen+count-1)); - } - } - for (count = 0; count < rep; ++count) - baggage_type::assign (*(point()+pos+count), c); - reference->len += (rep-xlen); - } - return *this; -} - -template <class charT> -void -basic_string<charT>::put_at (size_t pos, charT c) _THROW_ALLOC_OUTRANGE -{ - if (pos > length()) - { - reference_class::throwrange(); - } - if ((ref_count() > 1) || (pos == reserve())) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (data(), length(), - length()+((pos==length())?1:0)); - delete_ref(); - reference = tmp; - } - if (pos == length()) - ++reference->len; - baggage_type::assign (*(point()+pos), c); -} - -template <class charT> -charT& -basic_string<charT>::operator[] (size_t pos) _THROW_ALLOC_OUTRANGE -{ - if (pos >= length()) - { - reference_class::throwrange(); - } - if (ref_count() > 1) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (data(), length(), length()); - delete_ref(); - reference = tmp; - } - return *(point()+pos); -} - -template <class charT> -const charT* -basic_string<charT>::c_str () const _THROW_ALLOC -{ - if (c_str_ptr) - delete[] ((basic_string<charT>*)this)->c_str_ptr; - ((basic_string<charT>*)this)->c_str_ptr = new charT [length()+1]; - if (length()) - baggage_type::copy (((basic_string<charT>*)this)->c_str_ptr, data(), - length()); - baggage_type::assign (*(((basic_string<charT>*)this)->c_str_ptr+length()), - eos()); - return c_str_ptr; -} - -template <class charT> -void -basic_string<charT>::resize (size_t n, charT c) _THROW_ALLOC_LENGTH -{ - if (n == NPOS) - { - reference_class::throwlength(); - } - if ((ref_count() > 1) || (n > reserve())) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (data(), - ((n > length()) ? length() : n), n); - delete_ref(); - reference = tmp; - } - while (reference->len < n) - { - baggage_type::assign (*(reference->ptr+length()), c); - ++reference->len; - } - reference->len = n; -} - -template <class charT> -void -basic_string<charT>::resize (size_t n) _THROW_ALLOC_LENGTH -{ - resize (n, eos()); -} - -template <class charT> -void -basic_string<charT>::reserve (size_t res_arg) _THROW_ALLOC_LENGTH -{ - if (res_arg == NPOS) - { - reference_class::throwlength(); - } - if (res_arg > reserve()) - { - reference_pointer tmp; - tmp = new basic_string_ref<charT> (data(), length(), res_arg); - delete_ref(); - reference = tmp; - } -} - -template <class charT> -size_t -basic_string<charT>::copy (charT* s, size_t n, size_t pos) const _THROW_OUTRANGE -{ - if (pos > length()) - { - reference_class::throwrange(); - } - size_t rlen = (n > (length()-pos)) ? (length()-pos) : n; - if (length()) - baggage_type::copy (s, data()+pos, rlen); - return rlen; -} - -template <class charT> -size_t -basic_string<charT>::find (const basic_string<charT>& str, size_t pos) const - _THROW_NONE -{ - return find_str (str.data(), pos, str.length()); -} - -template <class charT> -size_t -basic_string<charT>::find (const charT* s, size_t pos, size_t n) const - _THROW_NONE -{ - return find_str (s, pos, n); -} - -template <class charT> -size_t -basic_string<charT>::find (const charT* s, size_t pos) const _THROW_NONE -{ - return find_str (s, pos, baggage_type::length(s)); -} - -template <class charT> -size_t -basic_string<charT>::find (charT c, size_t pos) const _THROW_NONE -{ - while ((pos < length()) && (baggage_type::ne(*(data()+pos), c))) - ++pos; - return ((pos < length()) ? pos : NPOS); -} - -template <class charT> -size_t -basic_string<charT>::rfind (const basic_string<charT>& str, size_t pos) const - _THROW_NONE -{ - return rfind_str (str.data(), pos, str.length()); -} - -template <class charT> -size_t -basic_string<charT>::rfind (const charT* s, size_t pos, size_t n) const - _THROW_NONE -{ - return rfind_str (s, pos, n); -} - -template <class charT> -size_t -basic_string<charT>::rfind (const charT* s, size_t pos) const _THROW_NONE -{ - return rfind_str (s, pos, baggage_type::length(s)); -} - -template <class charT> -size_t -basic_string<charT>::rfind (charT c, size_t pos) const _THROW_NONE -{ - size_t count = ((pos < length()) ? pos+1 : length()); - if (length() == 0) - return NPOS; - while ((baggage_type::ne(*(data()+count-1), c)) && (count > 1)) - --count; - if ((count == 1) && (baggage_type::ne(*(data()), c))) - return NPOS; - else - return count-1; -} - -template <class charT> -size_t -basic_string<charT>::find_first_of (const basic_string<charT>& str, size_t pos) const - _THROW_NONE -{ - return find_first_of_str (str.data(), pos, str.length()); -} - -template <class charT> -size_t -basic_string<charT>::find_first_of (const charT* s, size_t pos, size_t n) const - _THROW_NONE -{ - return find_first_of_str (s, pos, n); -} - -template <class charT> -size_t -basic_string<charT>::find_first_of (const charT* s, size_t pos) const - _THROW_NONE -{ - return find_first_of_str (s, pos, baggage_type::length(s)); -} - -template <class charT> -size_t -basic_string<charT>::find_first_of (charT c, size_t pos) const _THROW_NONE -{ - return find (c, pos); -} - -template <class charT> -size_t -basic_string<charT>::find_last_of (const basic_string<charT>& str, size_t pos) const - _THROW_NONE -{ - return find_last_of_str (str.data(), pos, str.length()); -} - -template <class charT> -size_t -basic_string<charT>::find_last_of (const charT* s, size_t pos, size_t n) const - _THROW_NONE -{ - return find_last_of_str (s, pos, n); -} - -template <class charT> -size_t -basic_string<charT>::find_last_of (const charT* s, size_t pos) const _THROW_NONE -{ - return find_last_of_str (s, pos, baggage_type::length(s)); -} - -template <class charT> -size_t -basic_string<charT>::find_last_of (charT c, size_t pos) const _THROW_NONE -{ - return rfind (c, pos); -} - -template <class charT> -size_t -basic_string<charT>::find_first_not_of (const basic_string<charT>& str, size_t pos) - const _THROW_NONE -{ - return find_first_not_of_str (str.data(), pos, str.length()); -} - -template <class charT> -size_t -basic_string<charT>::find_first_not_of (const charT* s, size_t pos, size_t n) - const _THROW_NONE -{ - return find_first_not_of_str (s, pos, n); -} - -template <class charT> -size_t -basic_string<charT>::find_first_not_of (const charT* s, size_t pos) const - _THROW_NONE -{ - return find_first_not_of_str (s, pos, baggage_type::length(s)); -} - -template <class charT> -size_t -basic_string<charT>::find_first_not_of (charT c, size_t pos) const _THROW_NONE -{ - while ((pos < length()) && (baggage_type::eq(*(data()+pos), c))) - ++pos; - return ((pos < length()) ? pos : NPOS); -} - -template <class charT> -size_t -basic_string<charT>::find_last_not_of (const basic_string<charT>& str, size_t pos) - const _THROW_NONE -{ - return find_last_not_of_str (str.data(), pos, str.length()); -} - -template <class charT> -size_t -basic_string<charT>::find_last_not_of (const charT* s, size_t pos, size_t n) - const _THROW_NONE -{ - return find_last_not_of_str (s, pos, n); -} - -template <class charT> -size_t -basic_string<charT>::find_last_not_of (const charT* s, size_t pos) const - _THROW_NONE -{ - return find_last_not_of_str (s, pos, baggage_type::length(s)); -} - -template <class charT> -size_t -basic_string<charT>::find_last_not_of (charT c, size_t pos) const _THROW_NONE -{ - size_t count = ((pos < length()) ? pos+1 : length()); - if (length() == 0) - return NPOS; - while ((baggage_type::eq(*(data()+count-1), c)) && (count > 1)) - --count; - if ((count == 1) && (baggage_type::eq(*(data()), c))) - return NPOS; - else - return count-1; -} - -template <class charT> -basic_string<charT> -basic_string<charT>::substr (size_t pos, size_t n) const _THROW_ALLOC_OUTRANGE -{ - if (pos > length()) - { - reference_class::throwrange(); - } - if (length()) - return basic_string<charT> (data()+pos, - (n > (length()-pos)) ? (length()-pos) : n); - else - return basic_string<charT>(); -} - -template <class charT> -int -basic_string<charT>::compare (const basic_string<charT>& str, size_t pos, - size_t n) const _THROW_OUTRANGE -{ - size_t slen = (n > (length()-pos)) ? (length()-pos) : n; - return compare_str (pos, str.data(), slen, str.length()); -} - -template <class charT> -int -basic_string<charT>::compare (const charT* s, size_t pos, size_t n) const - _THROW_LENGTH_OUTRANGE -{ - if (n == NPOS) - { - reference_class::throwlength(); - } - return compare_str (pos, s, length()-pos, n); -} - -template <class charT> -int -basic_string<charT>::compare (const charT* s, size_t pos) const _THROW_OUTRANGE -{ - return compare_str (pos, s, length()-pos, baggage_type::length(s)); -} - -template <class charT> -int -basic_string<charT>::compare (charT c, size_t pos, size_t rep) const - _THROW_LENGTH_OUTRANGE -{ - if (pos > length()) - { - reference_class::throwrange(); - } - if (rep == NPOS) - { - reference_class::throwlength(); - } - if (rep) - { - size_t count = 0; - while ((count < rep) && (count < (length()-pos)) && - baggage_type::eq (*(data()+pos+count), c)) - ++count; - if ((count == rep) || (count == (length()-pos))) - return (length()-pos-count); - else - return (*(data()+pos+count)-c); - } - else - { - return (length()-pos); - } -} - -template <class charT> -basic_string<charT> -operator+ (const basic_string<charT>& lhs, const basic_string<charT>& rhs) - _THROW_ALLOC_LENGTH -{ - typedef basic_string<charT>::baggage_type baggage_type; - basic_string<charT> tmp(lhs.data(), lhs.length(), rhs.length()); - if (rhs.length()) - baggage_type::copy (tmp.point()+lhs.length(), rhs.data(), rhs.length()); - tmp.len() += rhs.length(); - return tmp; -} - -template <class charT> -basic_string<charT> -operator+ (const charT* lhs, const basic_string<charT>& rhs) _THROW_ALLOC_LENGTH -{ - typedef basic_string<charT>::baggage_type baggage_type; - size_t slen = baggage_type::length(lhs); - basic_string<charT> tmp(lhs, slen, rhs.length()); - if (rhs.length()) - baggage_type::copy (tmp.point()+slen, rhs.data(), rhs.length()); - tmp.len() += rhs.length(); - return tmp; -} - -template <class charT> -basic_string<charT> -operator+ (charT lhs, const basic_string<charT>& rhs) _THROW_ALLOC_LENGTH -{ - typedef basic_string<charT>::baggage_type baggage_type; - basic_string<charT> tmp(&lhs, 1, rhs.length()); - if (rhs.length()) - baggage_type::copy (tmp.point()+1, rhs.data(), rhs.length()); - tmp.len() += rhs.length(); - return tmp; -} - -template <class charT> -basic_string<charT> -operator+ (const basic_string<charT>& lhs, const charT* rhs) _THROW_ALLOC_LENGTH -{ - typedef basic_string<charT>::baggage_type baggage_type; - size_t slen = baggage_type::length(rhs); - basic_string<charT> tmp(lhs.data(), lhs.length(), slen); - if (slen) - baggage_type::copy (tmp.point()+lhs.length(), rhs, slen); - tmp.len() += slen; - return tmp; -} - -template <class charT> -basic_string<charT> -operator+ (const basic_string<charT>& lhs, charT rhs) _THROW_ALLOC_LENGTH -{ - typedef basic_string<charT>::baggage_type baggage_type; - basic_string<charT> tmp(lhs.data(), lhs.length(), 1); - baggage_type::assign (*(tmp.point()+lhs.length()), rhs); - ++tmp.len(); - return tmp; -} - -template <class charT> -ostream& -operator<< (ostream& o, const basic_string<charT>& s) _THROW_NONE -{ - typedef basic_string<charT>::baggage_type baggage_type; - for (size_t count = 0; count < s.length(); ++count) - baggage_type::char_out (o, *(s.data()+count)); - return o; -} - -template <class charT> -istream& -operator>> (istream& i, basic_string<charT>& s) _THROW_ALLOC_LENGTH -{ - typedef basic_string<charT>::baggage_type baggage_type; - s.remove(); - while (true) - { - charT value; - baggage_type::char_in (i, value); - if (!i.operator void*()) - break; - if (!baggage_type::is_del (value)) - { - s.append(value); - while (true) - { - baggage_type::char_in (i, value); - if (!i.operator void*()) - break; - if (!baggage_type::is_del (value)) - { - s.append(value); - } - else - break; - } - break; - } - } - return i; -} - -#if ! defined (ghs) -// GreenHills 1.8.8 doesn't like this template specialization . . . -template class basic_string<char>; -#endif /* ghs */ -/* static */ -template<class TYPE> -const size_t basic_string<TYPE>::npos = NPOS; -typedef basic_string<char> cstring; -typedef basic_string<char> string; -//typedef basic_string<wchar_t> wstring; - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/bvector.cpp b/STL/bvector.cpp deleted file mode 100644 index 86b134c4b5e..00000000000 --- a/STL/bvector.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#define STL_BVECTOR -#define SA_STD std -#include <bvector.h> - -namespace std -{ - -Allocator<unsigned int> bit_vector::static_allocator; - -inline bool operator==(const bit_vector& x, const bit_vector& y) { - return x.size() == y.size() && equal(x.begin(), x.end(), y.begin()); -} - -inline bool operator<(const bit_vector& x, const bit_vector& y) { - return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); -} - -void swap(bit_vector::reference x, bit_vector::reference y) { - bool tmp = x; - x = y; - y = tmp; -} - -void bit_vector::insert_aux(iterator position, bool x) { - if (finish.p != end_of_storage) { - copy_backward(position, finish - 1, finish); - *position = x; - ++finish; - } else { - size_type len = size() ? 2 * size() : __WORD_BIT; - unsigned int* q = bit_alloc(len); - iterator i = copy(begin(), position, iterator(q, 0)); - *i++ = x; - finish = copy(position, end(), i); - static_allocator.deallocate(start.p); - end_of_storage = q + (len + __WORD_BIT - 1)/__WORD_BIT; - start = iterator(q, 0); - } -} - -void bit_vector::insert(iterator position, size_type n, bool x) { - if (n == 0) return; - if (capacity() - size() >= n) { - copy_backward(position, end(), finish + n); - fill(position, position + n, x); - finish += n; - } else { - size_type len = size() + max(size(), n); - unsigned int* q = bit_alloc(len); - iterator i = copy(begin(), position, iterator(q, 0)); - fill_n(i, n, x); - finish = copy(position, end(), i + n); - static_allocator.deallocate(start.p); - end_of_storage = q + (n + __WORD_BIT - 1)/__WORD_BIT; - start = iterator(q, 0); - } -} - -void bit_vector::insert(iterator position, const_iterator first, - const_iterator last) { - if (first == last) return; - size_type n = 0; - distance(first, last, n); - if (capacity() - size() >= n) { - copy_backward(position, end(), finish + n); - copy(first, last, position); - finish += n; - } else { - size_type len = size() + max(size(), n); - unsigned int* q = bit_alloc(len); - iterator i = copy(begin(), position, iterator(q, 0)); - i = copy(first, last, i); - finish = copy(position, end(), i); - static_allocator.deallocate(start.p); - end_of_storage = q + (len + __WORD_BIT - 1)/__WORD_BIT; - start = iterator(q, 0); - } -} - -}
\ No newline at end of file diff --git a/STL/bvector.h b/STL/bvector.h deleted file mode 100644 index 01f66ecddd3..00000000000 --- a/STL/bvector.h +++ /dev/null @@ -1,378 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -// vector<bool> is replaced by bit_vector at present because bool is not -// implemented. - -#ifndef BVECTOR_H -#define BVECTOR_H - -#include <function.h> -#include <algobase.h> -#include <iterator.h> -#include <bool.h> - -#ifndef Allocator -#define Allocator allocator -#include <defalloc.h> -#endif - -#define __WORD_BIT (int(CHAR_BIT*sizeof(unsigned int))) - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -class bit_vector { -public: - typedef Allocator<unsigned int> vector_allocator; - typedef bool value_type; - typedef vector_allocator::size_type size_type; - typedef vector_allocator::difference_type difference_type; - - class iterator; - class const_iterator; - - class reference { - friend class iterator; - friend class const_iterator; - protected: - unsigned int* p; - unsigned int mask; - reference(unsigned int* x, unsigned int y) : p(x), mask(y) {} - public: - reference() : p(0), mask(0) {} - operator bool() const { return !(!(*p & mask)); } - reference& operator=(bool x) { - if (x) - *p |= mask; - else - *p &= ~mask; - return *this; - } - reference& operator=(const reference& x) { return *this = bool(x); } - bool operator==(const reference& x) const { - return bool(*this) == bool(x); - } - bool operator<(const reference& x) const { - return bool(*this) < bool(x); - } - void flip() { *p ^= mask; } - }; - typedef bool const_reference; - class iterator : public random_access_iterator<bool, difference_type> { - friend class bit_vector; - friend class const_iterator; - protected: - unsigned int* p; - unsigned int offset; - void bump_up() { - if (offset++ == __WORD_BIT - 1) { - offset = 0; - ++p; - } - } - void bump_down() { - if (offset-- == 0) { - offset = __WORD_BIT - 1; - --p; - } - } - public: - iterator() : p(0), offset(0) {} - iterator(unsigned int* x, unsigned int y) : p(x), offset(y) {} - reference operator*() const { return reference(p, 1U << offset); } - iterator& operator++() { - bump_up(); - return *this; - } - iterator operator++(int) { - iterator tmp = *this; - bump_up(); - return tmp; - } - iterator& operator--() { - bump_down(); - return *this; - } - iterator operator--(int) { - iterator tmp = *this; - bump_down(); - return tmp; - } - iterator& operator+=(difference_type i) { - difference_type n = i + offset; - p += n / __WORD_BIT; - n = n % __WORD_BIT; - if (n < 0) { - offset = n + __WORD_BIT; - --p; - } else - offset = n; - return *this; - } - iterator& operator-=(difference_type i) { - *this += -i; - return *this; - } - iterator operator+(difference_type i) const { - iterator tmp = *this; - return tmp += i; - } - iterator operator-(difference_type i) const { - iterator tmp = *this; - return tmp -= i; - } - difference_type operator-(iterator x) const { - return __WORD_BIT * (p - x.p) + offset - x.offset; - } - reference operator[](difference_type i) { return *(*this + i); } - bool operator==(const iterator& x) const { - return p == x.p && offset == x.offset; - } - bool operator<(iterator x) const { - return p < x.p || (p == x.p && offset < x.offset); - } - }; - - class const_iterator - : public random_access_iterator<bool, difference_type> { - friend class bit_vector; - protected: - unsigned int* p; - unsigned int offset; - void bump_up() { - if (offset++ == __WORD_BIT - 1) { - offset = 0; - ++p; - } - } - void bump_down() { - if (offset-- == 0) { - offset = __WORD_BIT - 1; - --p; - } - } - public: - const_iterator() : p(0), offset(0) {} - const_iterator(unsigned int* x, unsigned int y) : p(x), offset(y) {} - const_iterator(const iterator& x) : p(x.p), offset(x.offset) {} - const_reference operator*() const { - return reference(p, 1U << offset); - } - const_iterator& operator++() { - bump_up(); - return *this; - } - const_iterator operator++(int) { - const_iterator tmp = *this; - bump_up(); - return tmp; - } - const_iterator& operator--() { - bump_down(); - return *this; - } - const_iterator operator--(int) { - const_iterator tmp = *this; - bump_down(); - return tmp; - } - const_iterator& operator+=(difference_type i) { - difference_type n = i + offset; - p += n / __WORD_BIT; - n = n % __WORD_BIT; - if (n < 0) { - offset = n + __WORD_BIT; - --p; - } else - offset = n; - return *this; - } - const_iterator& operator-=(difference_type i) { - *this += -i; - return *this; - } - const_iterator operator+(difference_type i) const { - const_iterator tmp = *this; - return tmp += i; - } - const_iterator operator-(difference_type i) const { - const_iterator tmp = *this; - return tmp -= i; - } - difference_type operator-(const_iterator x) const { - return __WORD_BIT * (p - x.p) + offset - x.offset; - } - const_reference operator[](difference_type i) { - return *(*this + i); - } - bool operator==(const const_iterator& x) const { - return p == x.p && offset == x.offset; - } - bool operator<(const_iterator x) const { - return p < x.p || (p == x.p && offset < x.offset); - } - }; - - typedef reverse_iterator<const_iterator, value_type, const_reference, - difference_type> const_reverse_iterator; - typedef reverse_iterator<iterator, value_type, reference, difference_type> - reverse_iterator; - -protected: - static Allocator<unsigned int> static_allocator; - iterator start; - iterator finish; - unsigned int* end_of_storage; - unsigned int* bit_alloc(size_type n) { - return static_allocator.allocate((n + __WORD_BIT - 1)/__WORD_BIT); - } - void initialize(size_type n) { - unsigned int* q = bit_alloc(n); - end_of_storage = q + (n + __WORD_BIT - 1)/__WORD_BIT; - start = iterator(q, 0); - finish = start + n; - } - void insert_aux(iterator position, bool x); - typedef bit_vector self; -public: - iterator begin() { return start; } - const_iterator begin() const { return start; } - iterator end() { return finish; } - const_iterator end() const { return finish; } - - reverse_iterator rbegin() { return reverse_iterator(end()); } - const_reverse_iterator rbegin() const { - return const_reverse_iterator(end()); - } - reverse_iterator rend() { return reverse_iterator(begin()); } - const_reverse_iterator rend() const { - return const_reverse_iterator(begin()); - } - - size_type size() const { return size_type(end() - begin()); } - size_type max_size() const { return static_allocator.max_size(); } - size_type capacity() const { - return size_type(const_iterator(end_of_storage, 0) - begin()); - } - bool empty() const { return begin() == end(); } - reference operator[](size_type n) { return *(begin() + n); } - const_reference operator[](size_type n) const { return *(begin() + n); } - bit_vector() : start(iterator()), finish(iterator()), end_of_storage(0) {} - bit_vector(size_type n, bool value = bool()) { - initialize(n); - fill(start.p, end_of_storage, value ? ~0 : 0); - } - bit_vector(const self& x) { - initialize(x.size()); - copy(x.begin(), x.end(), start); - } - bit_vector(const_iterator first, const_iterator last) { - size_type n = 0; - distance(first, last, n); - initialize(n); - copy(first, last, start); - } - ~bit_vector() { static_allocator.deallocate(start.p); } - self& operator=(const self& x) { - if (&x == this) return *this; - if (x.size() > capacity()) { - static_allocator.deallocate(start.p); - initialize(x.size()); - } - copy(x.begin(), x.end(), begin()); - finish = begin() + x.size(); - return *this; - } - void reserve(size_type n) { - if (capacity() < n) { - unsigned int* q = bit_alloc(n); - finish = copy(begin(), end(), iterator(q, 0)); - static_allocator.deallocate(start.p); - start = iterator(q, 0); - end_of_storage = q + (n + __WORD_BIT - 1)/__WORD_BIT; - } - } - reference front() { return *begin(); } - const_reference front() const { return *begin(); } - reference back() { return *(end() - 1); } - const_reference back() const { return *(end() - 1); } - void push_back(bool x) { - if (finish.p != end_of_storage) - *finish++ = x; - else - insert_aux(end(), x); - } - void swap(bit_vector& x) { - std::swap(start, x.start); - std::swap(finish, x.finish); - std::swap(end_of_storage, x.end_of_storage); - } - iterator insert(iterator position, bool x) { - size_type n = position - begin(); - if (finish.p != end_of_storage && position == end()) - *finish++ = x; - else - insert_aux(position, x); - return begin() + n; - } - void insert(iterator position, const_iterator first, - const_iterator last); - void insert(iterator position, size_type n, bool x); - void pop_back() { --finish; } - void erase(iterator position) { - if (position + 1 != end()) - copy(position + 1, end(), position); - --finish; - } - void erase(iterator first, iterator last) { - finish = copy(last, end(), first); - } -}; - -// Code moved to bvector.cpp by Terris - -// Added by Terris --begin-- -bool operator==(const bit_vector& x, const bit_vector& y); -bool operator<(const bit_vector& x, const bit_vector& y); -void swap(bit_vector::reference x, bit_vector::reference y); -// Added by Terris --end-- - -// Added by Terris --begin-- - -#ifndef STL_BVECTOR -#undef Allocator -#undef __WORD_BIT -#endif - -// Added by Terris --end-- - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/defalloc.h b/STL/defalloc.h deleted file mode 100644 index c0e2e04998d..00000000000 --- a/STL/defalloc.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef DEFALLOC_H -#define DEFALLOC_H - -#include <new.h> -#include <stddef.h> -#include <stdlib.h> -#include <limits.h> -#include <iostream.h> -#include <algobase.h> - -#if 0 -inline void* operator new(size_t, void* p) {return p;} -#endif - -/* - * the following template function is replaced by the following two functions - * due to the fact that the Borland compiler doesn't change prediff_t type - * to type long when compile with -ml or -mh. - - -template <class T> -inline T* allocate(ptrdiff_t size, T*) { - set_new_handler(0); - T* tmp = (T*)(::operator new((size_t)(size * sizeof(T)))); - if (tmp == 0) { - cerr << "out of memory" << endl; - exit(1); - } - return tmp; -} -*/ - -/* - * Begin change by Terris - */ -namespace std { -/* - * End change by Terris - */ - -/* -* Added by Terris (#if out code) - */ -#if 0 -/* - * Added by Terris End - */ -template <class T> -inline T* allocate(int size, T*) { - set_new_handler(0); - T* tmp = (T*)(::operator new((unsigned int)(size * sizeof(T)))); - if (tmp == 0) { - cerr << "out of memory" << endl; - exit(1); - } - return tmp; -} -/* - * Added by Terris - */ -#endif -/* - * Added by Terris End - */ - -template <class T> -inline T* allocate(int size, T*) { // Changed by Terris -- was long. -/* - * Begin Change by Terris - */ -// set_new_handler(0); -// T* tmp = (T*)(::operator new((unsigned long)(size * sizeof(T)))); -// if (tmp == 0) { -// cerr << "out of memory" << endl; -// exit(1); -// } -// return tmp; -/* - * End Change by Terris - */ - return (T*)(::operator new((unsigned long)(size * sizeof(T)))); -} - -template <class T> -inline void deallocate(T* buffer) { - ::operator delete(buffer); -} - -template <class T> -inline void destroy(T* pointer) { - pointer->~T(); -} - -inline void destroy(char*) {} -inline void destroy(unsigned char*) {} -inline void destroy(short*) {} -inline void destroy(unsigned short*) {} -inline void destroy(int*) {} -inline void destroy(unsigned int*) {} -inline void destroy(long*) {} -inline void destroy(unsigned long*) {} -inline void destroy(float*) {} -inline void destroy(double*) {} -inline void destroy(char**) {} -inline void destroy(unsigned char**) {} -inline void destroy(short**) {} -inline void destroy(unsigned short**) {} -inline void destroy(int**) {} -inline void destroy(unsigned int**) {} -inline void destroy(long**) {} -inline void destroy(unsigned long**) {} -inline void destroy(float**) {} -inline void destroy(double**) {} - -inline void destroy(char*, char*) {} -inline void destroy(unsigned char*, unsigned char*) {} -inline void destroy(short*, short*) {} -inline void destroy(unsigned short*, unsigned short*) {} -inline void destroy(int*, int*) {} -inline void destroy(unsigned int*, unsigned int*) {} -inline void destroy(long*, long*) {} -inline void destroy(unsigned long*, unsigned long*) {} -inline void destroy(float*, float*) {} -inline void destroy(double*, double*) {} -inline void destroy(char**, char**) {} -inline void destroy(unsigned char**, unsigned char**) {} -inline void destroy(short**, short**) {} -inline void destroy(unsigned short**, unsigned short**) {} -inline void destroy(int**, int**) {} -inline void destroy(unsigned int**, unsigned int**) {} -inline void destroy(long**, long**) {} -inline void destroy(unsigned long**, unsigned long**) {} -inline void destroy(float**, float**) {} -inline void destroy(double**, double**) {} - -template <class T1, class T2> -inline void construct(T1* p, const T2& value) { - new (p) T1(value); -} - -template <class T> -class allocator { -public: - typedef T value_type; - typedef T* pointer; - typedef const T* const_pointer; - typedef T& reference; - typedef const T& const_reference; - - /* - * Begin change by Terris - * - * This removes compile-time warnings about signed/unsigned mismatch - * and negating unsigned values. - * typedef size_t size_type; - */ - typedef long size_type; - /* - * End change by Terris - */ - - typedef ptrdiff_t difference_type; - pointer allocate(size_type n) { - return std::allocate((difference_type)n, (pointer)0); - } - void deallocate(pointer p) { std::deallocate(p); } - pointer address(reference x) { return (pointer)&x; } - const_pointer const_address(const_reference x) { - return (const_pointer)&x; - } - size_type init_page_size() { - return max(size_type(1), size_type(4096/sizeof(T))); - } - size_type max_size() const { - return max(size_type(1), size_type(UINT_MAX/sizeof(T))); - } -}; - -class allocator<void> { -public: - typedef void* pointer; -}; - - - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/deque.h b/STL/deque.h deleted file mode 100644 index 1eddbc7f7c8..00000000000 --- a/STL/deque.h +++ /dev/null @@ -1,586 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef DEQUE_H -#define DEQUE_H - -#include <function.h> -#include <algobase.h> -#include <iterator.h> -#include <bool.h> - -#ifndef Allocator -#define Allocator allocator -#include <defalloc.h> -#endif - -#ifndef deque -#define deque deque -#endif - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class T> -class deque { -public: - class iterator; - class const_iterator; - friend class iterator; - friend class const_iterator; -public: - typedef T value_type; - typedef Allocator<T> data_allocator_type; - typedef Allocator<T>::pointer pointer; - typedef Allocator<T>::reference reference; - typedef Allocator<T>::const_reference const_reference; - typedef Allocator<T>::size_type size_type; - typedef Allocator<T>::difference_type difference_type; - typedef Allocator<pointer> map_allocator_type; -protected: - static data_allocator_type data_allocator; - static size_type buffer_size; - static map_allocator_type map_allocator; - typedef Allocator<pointer>::pointer map_pointer; -public: - class iterator : public random_access_iterator<T, difference_type> { - friend class deque<T>; - friend class const_iterator; - protected: - pointer current; - pointer first; - pointer last; - map_pointer node; - iterator(pointer x, map_pointer y) - : current(x), first(*y), last(*y + buffer_size), node(y) {} - public: - iterator() : current(0), first(0), last(0), node(0) {} - reference operator*() const { return *current; } - difference_type operator-(const iterator& x) const { - return node == x.node - ? current - x.current - : difference_type(buffer_size * (node - x.node - 1) + - (current - first) + (x.last - x.current)); - } - iterator& operator++() { - if (++current == last) { - first = *(++node); - current = first; - last = first + buffer_size; - } - return *this; - } - iterator operator++(int) { - iterator tmp = *this; - ++*this; - return tmp; - } - iterator& operator--() { - if (current == first) { - first = *(--node); - last = first + buffer_size; - current = last; - } - --current; - return *this; - } - iterator operator--(int) { - iterator tmp = *this; - --*this; - return tmp; - } - iterator& operator+=(difference_type n) { - difference_type offset = n + (current - first); - difference_type num_node_to_jump = offset >= 0 - ? offset / buffer_size - : -((-offset + buffer_size - 1) / buffer_size); - if (num_node_to_jump == 0) - current += n; - else { - node = node + num_node_to_jump; - first = *node; - last = first + buffer_size; - current = first + (offset - num_node_to_jump * buffer_size); - } - return *this; - } - iterator& operator-=(difference_type n) { return *this += -n; } - iterator operator+(difference_type n) const { - iterator tmp = *this; - return tmp += n; - } - iterator operator-(difference_type n) const { - iterator tmp = *this; - return tmp -= n; - } - reference operator[](difference_type n) { return *(*this + n); } - bool operator==(const iterator& x) const { - return current == x.current || - ((current == first || x.current == x.first) && - *this - x == 0); - } - bool operator<(const iterator& x) const { - return (node == x.node) ? (current < x.current) : (node < x.node); - } - }; - class const_iterator : public random_access_iterator<T, difference_type> { - friend class deque<T>; - protected: - pointer current; - pointer first; - pointer last; - map_pointer node; - const_iterator(pointer x, map_pointer y) - : current(x), first(*y), last(*y + buffer_size), node(y) {} - public: - const_iterator() : current(0), first(0), last(0), node(0) {} - const_iterator(const iterator& x) - : current(x.current), first(x.first), last(x.last), node(x.node) {} - const_reference operator*() const { return *current; } - difference_type operator-(const const_iterator& x) const { - return node == x.node - ? current - x.current - : difference_type(buffer_size * (node - x.node - 1) + - (current - first) + (x.last - x.current)); - } - const_iterator& operator++() { - if (++current == last) { - first = *(++node); - current = first; - last = first + buffer_size; - } - return *this; - } - const_iterator operator++(int) { - const_iterator tmp = *this; - ++*this; - return tmp; - } - const_iterator& operator--() { - if (current == first) { - first = *(--node); - last = first + buffer_size; - current = last; - } - --current; - return *this; - } - const_iterator operator--(int) { - const_iterator tmp = *this; - --*this; - return tmp; - } - const_iterator& operator+=(difference_type n) { - difference_type offset = n + (current - first); - difference_type num_node_to_jump = offset >= 0 - ? offset / buffer_size - : -((-offset + buffer_size - 1) / buffer_size); - if (num_node_to_jump == 0) - current += n; - else { - node = node + num_node_to_jump; - first = *node; - last = first + buffer_size; - current = first + (offset - num_node_to_jump * buffer_size); - } - return *this; - } - const_iterator& operator-=(difference_type n) { return *this += -n; } - const_iterator operator+(difference_type n) const { - const_iterator tmp = *this; - return tmp += n; - } - const_iterator operator-(difference_type n) const { - const_iterator tmp = *this; - return tmp -= n; - } - const_reference operator[](difference_type n) { - return *(*this + n); - } - bool operator==(const const_iterator& x) const { - return current == x.current || - ((current == first || x.current == x.first) && - *this - x == 0); - } - bool operator<(const const_iterator& x) const { - return (node == x.node) ? (current < x.current) : (node < x.node); - } - }; - typedef reverse_iterator<const_iterator, value_type, const_reference, - difference_type> const_reverse_iterator; - typedef reverse_iterator<iterator, value_type, reference, difference_type> - reverse_iterator; -protected: - iterator start; - iterator finish; - size_type length; - map_pointer map; - size_type map_size; - - void allocate_at_begin(); - void allocate_at_end(); - void deallocate_at_begin(); - void deallocate_at_end(); - -public: - deque() : start(), finish(), length(0), map(0), map_size(0) { -/* - * Changed by Terris - */ - /*buffer_size = data_allocator.init_page_size();*/ - } - iterator begin() { return start; } - const_iterator begin() const { return start; } - iterator end() { return finish; } - const_iterator end() const { return finish; } - reverse_iterator rbegin() { return reverse_iterator(end()); } - const_reverse_iterator rbegin() const { - return const_reverse_iterator(end()); - } - reverse_iterator rend() { return reverse_iterator(begin()); } - const_reverse_iterator rend() const { - return const_reverse_iterator(begin()); - } - bool empty() const { return length == 0; } - size_type size() const { return length; } - size_type max_size() const { return data_allocator.max_size(); } - reference operator[](size_type n) { return *(begin() + n); } - const_reference operator[](size_type n) const { return *(begin() + n); } - reference front() { return *begin(); } - const_reference front() const { return *begin(); } - reference back() { return *(end() - 1); } - const_reference back() const { return *(end() - 1); } - void push_front(const T& x) { - if (empty() || begin().current == begin().first) - allocate_at_begin(); - --start.current; - construct(start.current, x); - ++length; - } - void push_back(const T& x) { - if (empty() || end().current == end().last) - allocate_at_end(); - construct(finish.current, x); - ++finish.current; - ++length; - } - void pop_front() { - destroy(start.current); - ++start.current; - --length; - if (empty() || begin().current == begin().last) - deallocate_at_begin(); - } - void pop_back() { - --finish.current; - destroy(finish.current); - --length; - if (empty() || end().current == end().first) - deallocate_at_end(); - } - void swap(deque<T>& x) { - std::swap(start, x.start); - std::swap(finish, x.finish); - std::swap(length, x.length); - std::swap(map, x.map); - std::swap(map_size, x.map_size); - } - iterator insert(iterator position, const T& x); - void insert(iterator position, size_type n, const T& x); -// template <class Iterator> void insert(iterator position, -// Iterator first, Iterator last); - void insert(iterator position, const T* first, const T* last); - void erase(iterator position); - void erase(iterator first, iterator last); - deque(size_type n, const T& value = T()) - : start(), finish(), length(0), map(0), map_size(0) { -/* - * Changed by Terris - */ - /*buffer_size = data_allocator.init_page_size();*/ - insert(begin(), n, value); - } -// template <class Iterator> deque(Iterator first, Iterator last); - deque(const T* first, const T* last) - : start(), finish(), length(0), map(0), map_size(0) { -/* - * Changed by Terris - */ - /*buffer_size = data_allocator.init_page_size();*/ - copy(first, last, back_inserter(*this)); - } - deque(const deque<T>& x) - : start(), finish(), length(0), map(0), map_size(0) { -/* - * Changed by Terris - */ - /*buffer_size = data_allocator.init_page_size();*/ - copy(x.begin(), x.end(), back_inserter(*this)); - } - deque<T>& operator=(const deque<T>& x) { - if (this != &x) - if (size() >= x.size()) - erase(copy(x.begin(), x.end(), begin()), end()); - else - copy(x.begin() + size(), x.end(), - inserter(*this, copy(x.begin(), x.begin() + size(), - begin()))); - return *this; - } - ~deque(); -}; - -template <class T> -deque<T>::data_allocator_type deque<T>::data_allocator; - -template <class T> -deque<T>::map_allocator_type deque<T>::map_allocator; - -/* - * Changed by Terris - */ -#if 0 -template <class T> -deque<T>::size_type deque<T>::buffer_size = 0; -// should be data_allocator.init_page_size(); // Borland bug -#endif - -/* - * Added by Terris - */ -template <class T> -deque<T>::size_type deque<T>::buffer_size = data_allocator.init_page_size(); - -template <class T> -bool operator==(const deque<T>& x, const deque<T>& y) { - return x.size() == y.size() && equal(x.begin(), x.end(), y.begin()); -} - -template <class T> -bool operator<(const deque<T>& x, const deque<T>& y) { - return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); -} - -template <class T> -deque<T>::~deque() { while (!empty()) pop_front(); } - -template <class T> -void deque<T>::allocate_at_begin() { - pointer p = data_allocator.allocate(buffer_size); - if (!empty()) { - if (start.node == map) { - difference_type i = finish.node - start.node; - map_size = (i + 1) * 2; - map_pointer tmp = map_allocator.allocate(map_size); - copy(start.node, finish.node + 1, tmp + map_size / 4 + 1); - map_allocator.deallocate(map); - map = tmp; - map[map_size / 4] = p; - start = iterator(p + buffer_size, map + map_size / 4); - finish = iterator(finish.current, map + map_size / 4 + i + 1); - } else { - *--start.node = p; - start = iterator(p + buffer_size, start.node); - } - } else { - map_size = map_allocator.init_page_size(); - map = map_allocator.allocate(map_size); - map[map_size / 2] = p; - start = iterator(p + buffer_size / 2 + 1, map + map_size / 2); - finish = start; - } -} - -template <class T> -void deque<T>::allocate_at_end() { - pointer p = data_allocator.allocate(buffer_size); - if (!empty()) { - if (finish.node == map + map_size - 1) { - difference_type i = finish.node - start.node; - map_size = (i + 1) * 2; - map_pointer tmp = map_allocator.allocate(map_size); - copy(start.node, finish.node + 1, tmp + map_size / 4); - map_allocator.deallocate(map); - map = tmp; - map[map_size / 4 + i + 1] = p; - start = iterator(start.current, map + map_size / 4); - finish = iterator(p, map + map_size / 4 + i + 1); - } else { - *++finish.node = p; - finish = iterator(p, finish.node); - } - } else { - map_size = map_allocator.init_page_size(); - map = map_allocator.allocate(map_size); - map[map_size / 2] = p; - start = iterator(p + buffer_size / 2, map + map_size / 2); - finish = start; - } -} - -template <class T> -void deque<T>::deallocate_at_begin() { - data_allocator.deallocate(*start.node++); - if (empty()) { - start = iterator(); - finish = start; - map_allocator.deallocate(map); - } else - start = iterator(*start.node, start.node); -} - -template <class T> -void deque<T>::deallocate_at_end() { - data_allocator.deallocate(*finish.node--); - if (empty()) { - start = iterator(); - finish = start; - map_allocator.deallocate(map); - } else - finish = iterator(*finish.node + buffer_size, finish.node); -} - -template <class T> -deque<T>::iterator deque<T>::insert(iterator position, const T& x) { - if (position == begin()) { - push_front(x); - return begin(); - } else if (position == end()) { - push_back(x); - return end() - 1; - } else if (end() - position > position - begin()) { - push_front(*begin()); - copy(begin() + 2, position, begin() + 1); - *(position - 1) = x; - return position - 1; - } else { - push_back(*(end() - 1)); - copy_backward(position, end() - 2, end() - 1); - *position = x; - return position; - } -} - -template <class T> -void deque<T>::insert(iterator position, size_type n, const T& x) { - if (end() - position > position - begin()) { - iterator old_begin = begin(); - if (n > position - old_begin) { - size_type m = n - (position - old_begin); - while (m-- > 0) push_front(x); - iterator i = position; - while (i != old_begin) push_front(*--i); - fill(old_begin, position, x); - } else { - iterator i = old_begin + n; - while (i != old_begin) push_front(*--i); - copy(old_begin + n, position, old_begin); - fill(position - n, position, x); - } - } else { - iterator old_end = end(); - if (n > old_end - position) { - size_type m = n - (old_end - position); - while (m-- > 0) push_back(x); - iterator i = position; - while (i != old_end) push_back(*i++); - fill(position, old_end, x); - } else { - iterator i = old_end - n; - while (i != old_end) push_back(*i++); - copy_backward(position, old_end - n, old_end); - fill(position, position + n, x); - } - } -} - -template <class T> -void deque<T>::insert(iterator position, const T* first, const T* last) { - size_type n = 0; - distance(first, last, n); - if (end() - position > position - begin()) { - iterator old_begin = begin(); - if (n > position - old_begin) { - const T* m = last - (position - old_begin); - while (m != first) push_front(*--m); - iterator i = position; - while (i != old_begin) push_front(*--i); - copy(last - (position - old_begin), last, old_begin); - } else { - iterator i = old_begin + n; - while (i != old_begin) push_front(*--i); - copy(old_begin + n, position, old_begin); - copy(first, last, position - n); - } - } else { - iterator old_end = end(); - if (n > old_end - position) { - const T* m = first + (old_end - position); - while (m != last) push_back(*m++); - iterator i = position; - while (i != old_end) push_back(*i++); - copy(first, first + (old_end - position), position); - } else { - iterator i = old_end - n; - while (i != old_end) push_back(*i++); - copy_backward(position, old_end - n, old_end); - copy(first, last, position); - } - } -} - -template <class T> -void deque<T>::erase(iterator position) { - if (end() - position > position - begin()) { - copy_backward(begin(), position, position + 1); - pop_front(); - } else { - copy(position + 1, end(), position); - pop_back(); - } -} - -template <class T> -void deque<T>::erase(iterator first, iterator last) { - difference_type n = last - first; - if (end() - last > first - begin()) { - copy_backward(begin(), first, last); - while(n-- > 0) pop_front(); - } else { - copy(last, end(), first); - while(n-- > 0) pop_back(); - } -} - -#undef Allocator -#undef deque - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/function.h b/STL/function.h deleted file mode 100644 index b6f87a69706..00000000000 --- a/STL/function.h +++ /dev/null @@ -1,287 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef FUNCTION_H -#define FUNCTION_H - -#include <bool.h> - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class T> -inline bool operator!=(const T& x, const T& y) { - return !(x == y); -} - -template <class T> -inline bool operator>(const T& x, const T& y) { - return y < x; -} - -template <class T> -inline bool operator<=(const T& x, const T& y) { - return !(y < x); -} - -template <class T> -inline bool operator>=(const T& x, const T& y) { - return !(x < y); -} - -template <class Arg, class Result> -struct unary_function { - typedef Arg argument_type; - typedef Result result_type; -}; - -template <class Arg1, class Arg2, class Result> -struct binary_function { - typedef Arg1 first_argument_type; - typedef Arg2 second_argument_type; - typedef Result result_type; -}; - -template <class T> -struct plus : binary_function<T, T, T> { - T operator()(const T& x, const T& y) const { return x + y; } -}; - -template <class T> -struct minus : binary_function<T, T, T> { - T operator()(const T& x, const T& y) const { return x - y; } -}; - -template <class T> -struct times : binary_function<T, T, T> { - T operator()(const T& x, const T& y) const { return x * y; } -}; - -template <class T> -struct divides : binary_function<T, T, T> { - T operator()(const T& x, const T& y) const { return x / y; } -}; - -template <class T> -struct modulus : binary_function<T, T, T> { - T operator()(const T& x, const T& y) const { return x % y; } -}; - -template <class T> -struct negate : unary_function<T, T> { - T operator()(const T& x) const { return -x; } -}; - -template <class T> -struct equal_to : binary_function<T, T, bool> { - bool operator()(const T& x, const T& y) const { return x == y; } -}; - -template <class T> -struct not_equal_to : binary_function<T, T, bool> { - bool operator()(const T& x, const T& y) const { return x != y; } -}; - -template <class T> -struct greater : binary_function<T, T, bool> { - bool operator()(const T& x, const T& y) const { return x > y; } -}; - -template <class T> -struct less : binary_function<T, T, bool> { - bool operator()(const T& x, const T& y) const { return x < y; } -}; - -template <class T> -struct greater_equal : binary_function<T, T, bool> { - bool operator()(const T& x, const T& y) const { return x >= y; } -}; - -template <class T> -struct less_equal : binary_function<T, T, bool> { - bool operator()(const T& x, const T& y) const { return x <= y; } -}; - -template <class T> -struct logical_and : binary_function<T, T, bool> { - bool operator()(const T& x, const T& y) const { return x && y; } -}; - -template <class T> -struct logical_or : binary_function<T, T, bool> { - bool operator()(const T& x, const T& y) const { return x || y; } -}; - -template <class T> -struct logical_not : unary_function<T, bool> { - bool operator()(const T& x) const { return !x; } -}; - -template <class Predicate> -class unary_negate : public unary_function<Predicate::argument_type, bool> { -protected: - Predicate pred; -public: - unary_negate(const Predicate& x) : pred(x) {} - bool operator()(const argument_type& x) const { return !pred(x); } -}; - -template <class Predicate> -unary_negate<Predicate> not1(const Predicate& pred) { - return unary_negate<Predicate>(pred); -} - -template <class Predicate> -class binary_negate - : public binary_function<Predicate::first_argument_type, - Predicate::second_argument_type, bool> { -protected: - Predicate pred; -public: - binary_negate(const Predicate& x) : pred(x) {} - bool operator()(const first_argument_type& x, - const second_argument_type& y) const { - return !pred(x, y); - } -}; - -template <class Predicate> -binary_negate<Predicate> not2(const Predicate& pred) { - return binary_negate<Predicate>(pred); -} - -template <class Operation> -class binder1st : public unary_function<Operation::second_argument_type, - Operation::result_type> { -protected: - Operation op; - Operation::first_argument_type value; -public: - binder1st(const Operation& x, const Operation::first_argument_type& y) - : op(x), value(y) {} - result_type operator()(const argument_type& x) const { - return op(value, x); - } -}; - -template <class Operation, class T> -binder1st<Operation> bind1st(const Operation& op, const T& x) { - return binder1st<Operation>(op, Operation::first_argument_type(x)); -} - -template <class Operation> -class binder2nd : public unary_function<Operation::first_argument_type, - Operation::result_type> { -protected: - Operation op; - Operation::second_argument_type value; -public: - binder2nd(const Operation& x, const Operation::second_argument_type& y) - : op(x), value(y) {} - result_type operator()(const argument_type& x) const { - return op(x, value); - } -}; - -template <class Operation, class T> -binder2nd<Operation> bind2nd(const Operation& op, const T& x) { - return binder2nd<Operation>(op, Operation::second_argument_type(x)); -} - -template <class Operation1, class Operation2> -class unary_compose : public unary_function<Operation2::argument_type, - Operation1::result_type> { -protected: - Operation1 op1; - Operation2 op2; -public: - unary_compose(const Operation1& x, const Operation2& y) : op1(x), op2(y) {} - result_type operator()(const argument_type& x) const { - return op1(op2(x)); - } -}; - -template <class Operation1, class Operation2> -unary_compose<Operation1, Operation2> compose1(const Operation1& op1, - const Operation2& op2) { - return unary_compose<Operation1, Operation2>(op1, op2); -} - -template <class Operation1, class Operation2, class Operation3> -class binary_compose : public unary_function<Operation2::argument_type, - Operation1::result_type> { -protected: - Operation1 op1; - Operation2 op2; - Operation3 op3; -public: - binary_compose(const Operation1& x, const Operation2& y, - const Operation3& z) : op1(x), op2(y), op3(z) { } - result_type operator()(const argument_type& x) const { - return op1(op2(x), op3(x)); - } -}; - -template <class Operation1, class Operation2, class Operation3> -binary_compose<Operation1, Operation2, Operation3> -compose2(const Operation1& op1, const Operation2& op2, const Operation3& op3) { - return binary_compose<Operation1, Operation2, Operation3>(op1, op2, op3); -} - -template <class Arg, class Result> -class pointer_to_unary_function : public unary_function<Arg, Result> { -protected: - Result (*ptr)(Arg); -public: - pointer_to_unary_function(Result (*x)(Arg)) : ptr(x) {} - Result operator()(Arg x) const { return ptr(x); } -}; - -template <class Arg, class Result> -pointer_to_unary_function<Arg, Result> ptr_fun(Result (*x)(Arg)) { - return pointer_to_unary_function<Arg, Result>(x); -} - -template <class Arg1, class Arg2, class Result> -class pointer_to_binary_function : public binary_function<Arg1, Arg2, Result> { -protected: - Result (*ptr)(Arg1, Arg2); -public: - pointer_to_binary_function(Result (*x)(Arg1, Arg2)) : ptr(x) {} - Result operator()(Arg1 x, Arg2 y) const { return ptr(x, y); } -}; - -template <class Arg1, class Arg2, class Result> -pointer_to_binary_function<Arg1, Arg2, Result> -ptr_fun(Result (*x)(Arg1, Arg2)) { - return pointer_to_binary_function<Arg1, Arg2, Result>(x); -} - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/heap.h b/STL/heap.h deleted file mode 100644 index 75e1796beea..00000000000 --- a/STL/heap.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef HEAP_H -#define HEAP_H - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class RandomAccessIterator, class Distance, class T> -void __push_heap(RandomAccessIterator first, Distance holeIndex, - Distance topIndex, T value) { - Distance parent = (holeIndex - 1) / 2; - while (holeIndex > topIndex && *(first + parent) < value) { - *(first + holeIndex) = *(first + parent); - holeIndex = parent; - parent = (holeIndex - 1) / 2; - } - *(first + holeIndex) = value; -} - -template <class RandomAccessIterator, class T> -inline void __push_heap_aux(RandomAccessIterator first, - RandomAccessIterator last, T*) { - __push_heap(first, (last - first) - 1, 0, T(*(last - 1))); -} - -template <class RandomAccessIterator> -inline void push_heap(RandomAccessIterator first, RandomAccessIterator last) { - __push_heap_aux(first, last, value_type(first)); -} - -template <class RandomAccessIterator, class Distance, class T, class Compare> -void __push_heap(RandomAccessIterator first, Distance holeIndex, - Distance topIndex, T value, Compare comp) { - Distance parent = (holeIndex - 1) / 2; - while (holeIndex > topIndex && comp(*(first + parent), value)) { - *(first + holeIndex) = *(first + parent); - holeIndex = parent; - parent = (holeIndex - 1) / 2; - } - *(first + holeIndex) = value; -} - -template <class RandomAccessIterator, class Compare, class T> -inline void __push_heap_aux(RandomAccessIterator first, - RandomAccessIterator last, Compare comp, T*) { - __push_heap(first, (last - first) - 1, 0, T(*(last - 1)), comp); -} - -template <class RandomAccessIterator, class Compare> -inline void push_heap(RandomAccessIterator first, RandomAccessIterator last, - Compare comp) { - __push_heap_aux(first, last, comp, value_type(first)); -} - -template <class RandomAccessIterator, class Distance, class T> -void __adjust_heap(RandomAccessIterator first, Distance holeIndex, - Distance len, T value) { - Distance topIndex = holeIndex; - Distance secondChild = 2 * holeIndex + 2; - while (secondChild < len) { - if (*(first + secondChild) < *(first + (secondChild - 1))) - secondChild--; - *(first + holeIndex) = *(first + secondChild); - holeIndex = secondChild; - secondChild = 2 * (secondChild + 1); - } - if (secondChild == len) { - *(first + holeIndex) = *(first + (secondChild - 1)); - holeIndex = secondChild - 1; - } - __push_heap(first, holeIndex, topIndex, value); -} - -template <class RandomAccessIterator, class T, class Distance> -inline void __pop_heap(RandomAccessIterator first, RandomAccessIterator last, - RandomAccessIterator result, T value, Distance*) { - *result = *first; - __adjust_heap(first, Distance(0), Distance(last - first), value); -} - -template <class RandomAccessIterator, class T> -inline void __pop_heap_aux(RandomAccessIterator first, - RandomAccessIterator last, T*) { - __pop_heap(first, last - 1, last - 1, T(*(last - 1)), distance_type(first)); -} - -template <class RandomAccessIterator> -inline void pop_heap(RandomAccessIterator first, RandomAccessIterator last) { - __pop_heap_aux(first, last, value_type(first)); -} - -template <class RandomAccessIterator, class Distance, class T, class Compare> -void __adjust_heap(RandomAccessIterator first, Distance holeIndex, - Distance len, T value, Compare comp) { - Distance topIndex = holeIndex; - Distance secondChild = 2 * holeIndex + 2; - while (secondChild < len) { - if (comp(*(first + secondChild), *(first + (secondChild - 1)))) - secondChild--; - *(first + holeIndex) = *(first + secondChild); - holeIndex = secondChild; - secondChild = 2 * (secondChild + 1); - } - if (secondChild == len) { - *(first + holeIndex) = *(first + (secondChild - 1)); - holeIndex = secondChild - 1; - } - __push_heap(first, holeIndex, topIndex, value, comp); -} - -template <class RandomAccessIterator, class T, class Compare, class Distance> -inline void __pop_heap(RandomAccessIterator first, RandomAccessIterator last, - RandomAccessIterator result, T value, Compare comp, - Distance*) { - *result = *first; - __adjust_heap(first, Distance(0), Distance(last - first), value, comp); -} - -template <class RandomAccessIterator, class T, class Compare> -inline void __pop_heap_aux(RandomAccessIterator first, - RandomAccessIterator last, T*, Compare comp) { - __pop_heap(first, last - 1, last - 1, T(*(last - 1)), comp, - distance_type(first)); -} - -template <class RandomAccessIterator, class Compare> -inline void pop_heap(RandomAccessIterator first, RandomAccessIterator last, - Compare comp) { - __pop_heap_aux(first, last, value_type(first), comp); -} - -template <class RandomAccessIterator, class T, class Distance> -void __make_heap(RandomAccessIterator first, RandomAccessIterator last, T*, - Distance*) { - if (last - first < 2) return; - Distance len = last - first; - Distance parent = (len - 2)/2; - - while (true) { - __adjust_heap(first, parent, len, T(*(first + parent))); - if (parent == 0) return; - parent--; - } -} - -template <class RandomAccessIterator> -inline void make_heap(RandomAccessIterator first, RandomAccessIterator last) { - __make_heap(first, last, value_type(first), distance_type(first)); -} - -template <class RandomAccessIterator, class Compare, class T, class Distance> -void __make_heap(RandomAccessIterator first, RandomAccessIterator last, - Compare comp, T*, Distance*) { - if (last - first < 2) return; - Distance len = last - first; - Distance parent = (len - 2)/2; - - while (true) { - __adjust_heap(first, parent, len, T(*(first + parent)), comp); - if (parent == 0) return; - parent--; - } -} - -template <class RandomAccessIterator, class Compare> -inline void make_heap(RandomAccessIterator first, RandomAccessIterator last, - Compare comp) { - __make_heap(first, last, comp, value_type(first), distance_type(first)); -} - -template <class RandomAccessIterator> -void sort_heap(RandomAccessIterator first, RandomAccessIterator last) { - while (last - first > 1) pop_heap(first, last--); -} - -template <class RandomAccessIterator, class Compare> -void sort_heap(RandomAccessIterator first, RandomAccessIterator last, - Compare comp) { - while (last - first > 1) pop_heap(first, last--, comp); -} - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/iterator.h b/STL/iterator.h deleted file mode 100644 index bf16eb0f40e..00000000000 --- a/STL/iterator.h +++ /dev/null @@ -1,414 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef ITERATOR_H -#define ITERATOR_H - -#include <stddef.h> -#include <iostream.h> -#include <bool.h> -#include <function.h> - -struct input_iterator_tag {}; -struct output_iterator_tag {}; -struct forward_iterator_tag {}; -struct bidirectional_iterator_tag {}; -struct random_access_iterator_tag {}; - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class T, class Distance> struct input_iterator {}; -struct output_iterator {}; -template <class T, class Distance> struct forward_iterator {}; -template <class T, class Distance> struct bidirectional_iterator {}; -template <class T, class Distance> struct random_access_iterator {}; - -template <class T, class Distance> -inline input_iterator_tag -iterator_category(const input_iterator<T, Distance>&) { - return input_iterator_tag(); -} - -inline output_iterator_tag iterator_category(const output_iterator&) { - return output_iterator_tag(); -} - -template <class T, class Distance> -inline forward_iterator_tag -iterator_category(const forward_iterator<T, Distance>&) { - return forward_iterator_tag(); -} - -template <class T, class Distance> -inline bidirectional_iterator_tag -iterator_category(const bidirectional_iterator<T, Distance>&) { - return bidirectional_iterator_tag(); -} - -template <class T, class Distance> -inline random_access_iterator_tag -iterator_category(const random_access_iterator<T, Distance>&) { - return random_access_iterator_tag(); -} - -template <class T> -inline random_access_iterator_tag iterator_category(const T*) { - return random_access_iterator_tag(); -} - -template <class T, class Distance> -inline T* value_type(const input_iterator<T, Distance>&) { - return (T*)(0); -} - -template <class T, class Distance> -inline T* value_type(const forward_iterator<T, Distance>&) { - return (T*)(0); -} - -template <class T, class Distance> -inline T* value_type(const bidirectional_iterator<T, Distance>&) { - return (T*)(0); -} - -template <class T, class Distance> -inline T* value_type(const random_access_iterator<T, Distance>&) { - return (T*)(0); -} - -template <class T> -inline T* value_type(const T*) { return (T*)(0); } - -template <class T, class Distance> -inline Distance* distance_type(const input_iterator<T, Distance>&) { - return (Distance*)(0); -} - -template <class T, class Distance> -inline Distance* distance_type(const forward_iterator<T, Distance>&) { - return (Distance*)(0); -} - -template <class T, class Distance> -inline Distance* -distance_type(const bidirectional_iterator<T, Distance>&) { - return (Distance*)(0); -} - -template <class T, class Distance> -inline Distance* -distance_type(const random_access_iterator<T, Distance>&) { - return (Distance*)(0); -} - -template <class T> -inline ptrdiff_t* distance_type(const T*) { return (ptrdiff_t*)(0); } - -template <class Container> -class back_insert_iterator : public output_iterator { -protected: - Container& container; -public: - back_insert_iterator(Container& x) : container(x) {} - back_insert_iterator & - operator=(const Container::value_type& value) { - container.push_back(value); - return *this; - } - back_insert_iterator & operator*() { return *this; } - back_insert_iterator & operator++() { return *this; } - back_insert_iterator & operator++(int) { return *this; } -}; - -template <class Container> -back_insert_iterator<Container> back_inserter(Container& x) { - return back_insert_iterator<Container>(x); -} - -template <class Container> -class front_insert_iterator : public output_iterator { -protected: - Container& container; -public: - front_insert_iterator(Container& x) : container(x) {} - front_insert_iterator& - operator=(const Container::value_type& value) { - container.push_front(value); - return *this; - } - front_insert_iterator& operator*() { return *this; } - front_insert_iterator& operator++() { return *this; } - front_insert_iterator& operator++(int) { return *this; } -}; - -template <class Container> -front_insert_iterator<Container> front_inserter(Container& x) { - return front_insert_iterator<Container>(x); -} - -template <class Container> -class insert_iterator : public output_iterator { -protected: - Container& container; - Container::iterator iter; -public: - insert_iterator(Container& x, Container::iterator i) - : container(x), iter(i) {} - insert_iterator & - operator=(const Container::value_type& value) { - iter = container.insert(iter, value); - ++iter; - return *this; - } - insert_iterator& operator*() { return *this; } - insert_iterator& operator++() { return *this; } - insert_iterator& operator++(int) { return *this; } -}; - -template <class Container, class Iterator> -insert_iterator<Container> inserter(Container& x, Iterator i) { - return insert_iterator<Container>(x, Container::iterator(i)); -} - -template <class BidirectionalIterator, class T, class Reference, - class Distance> -// Reference = T& -// Distance = ptrdiff_t -class reverse_bidirectional_iterator - : public bidirectional_iterator<T, Distance> { - typedef reverse_bidirectional_iterator<BidirectionalIterator, T, Reference, - Distance> self; - friend bool operator==(const self& x, const self& y); -protected: - BidirectionalIterator current; -public: - reverse_bidirectional_iterator() {} - reverse_bidirectional_iterator(BidirectionalIterator x) : current(x) {} - BidirectionalIterator base() { return current; } - Reference operator*() const { - BidirectionalIterator tmp = current; - return *--tmp; - } - self& operator++() { - --current; - return *this; - } - self operator++(int) { - self tmp = *this; - --current; - return tmp; - } - self& operator--() { - ++current; - return *this; - } - self operator--(int) { - self tmp = *this; - ++current; - return tmp; - } -}; - -template <class BidirectionalIterator, class T, class Reference, - class Distance> -inline bool operator==( - const reverse_bidirectional_iterator<BidirectionalIterator, T, Reference, - Distance>& x, - const reverse_bidirectional_iterator<BidirectionalIterator, T, Reference, - Distance>& y) { - return x.current == y.current; -} - -template <class RandomAccessIterator, class T, class Reference, - class Distance> -// Reference = T& -// Distance = ptrdiff_t -class reverse_iterator : public random_access_iterator<T, Distance> { - typedef reverse_iterator<RandomAccessIterator, T, Reference, Distance> - self; - friend bool operator==(const self& x, const self& y); - friend bool operator<(const self& x, const self& y); - friend Distance operator-(const self& x, const self& y); - friend self operator+(Distance n, const self& x); -protected: - RandomAccessIterator current; -public: - reverse_iterator() {} - reverse_iterator(RandomAccessIterator x) : current(x) {} - RandomAccessIterator base() { return current; } - Reference operator*() const { return *(current - 1); } - self& operator++() { - --current; - return *this; - } - self operator++(int) { - self tmp = *this; - --current; - return tmp; - } - self& operator--() { - ++current; - return *this; - } - self operator--(int) { - self tmp = *this; - ++current; - return tmp; - } - self operator+(Distance n) const { - return self(current - n); - } - self& operator+=(Distance n) { - current -= n; - return *this; - } - self operator-(Distance n) const { - return self(current + n); - } - self& operator-=(Distance n) { - current += n; - return *this; - } - Reference operator[](Distance n) { return *(*this + n); } -}; - -template <class RandomAccessIterator, class T, class Reference, class Distance> -inline bool operator==(const reverse_iterator<RandomAccessIterator, T, - Reference, Distance>& x, - const reverse_iterator<RandomAccessIterator, T, - Reference, Distance>& y) { - return x.current == y.current; -} - -template <class RandomAccessIterator, class T, class Reference, class Distance> -inline bool operator<(const reverse_iterator<RandomAccessIterator, T, - Reference, Distance>& x, - const reverse_iterator<RandomAccessIterator, T, - Reference, Distance>& y) { - return y.current < x.current; -} - -template <class RandomAccessIterator, class T, class Reference, class Distance> -inline Distance operator-(const reverse_iterator<RandomAccessIterator, T, - Reference, Distance>& x, - const reverse_iterator<RandomAccessIterator, T, - Reference, Distance>& y) { - return y.current - x.current; -} - -template <class RandomAccessIterator, class T, class Reference, class Distance> -inline reverse_iterator<RandomAccessIterator, T, Reference, Distance> -operator+(Distance n, - const reverse_iterator<RandomAccessIterator, T, Reference, - Distance>& x) { - return reverse_iterator<RandomAccessIterator, T, Reference, Distance> - (x.current - n); -} - - -template <class OutputIterator, class T> -class raw_storage_iterator : public output_iterator { -protected: - OutputIterator iter; -public: - raw_storage_iterator(OutputIterator x) : iter(x) {} - raw_storage_iterator<OutputIterator, T>& operator*() { return *this; } - raw_storage_iterator<OutputIterator, T>& operator=(const T& element) { - construct(iter, element); - return *this; - } - raw_storage_iterator<OutputIterator, T>& operator++() { - ++iter; - return *this; - } - raw_storage_iterator<OutputIterator, T> operator++(int) { - raw_storage_iterator<OutputIterator, T> tmp = *this; - ++iter; - return tmp; - } -}; - - -template <class T, class Distance> // Distance == ptrdiff_t -class istream_iterator : public input_iterator<T, Distance> { -friend bool operator==(const istream_iterator<T, Distance>& x, - const istream_iterator<T, Distance>& y); -protected: - istream* stream; - T value; - bool end_marker; - void read() { - end_marker = (*stream) ? true : false; - if (end_marker) *stream >> value; - end_marker = (*stream) ? true : false; - } -public: - istream_iterator() : stream(&cin), end_marker(false) {} - istream_iterator(istream& s) : stream(&s) { read(); } - const T& operator*() const { return value; } - istream_iterator<T, Distance>& operator++() { - read(); - return *this; - } - istream_iterator<T, Distance> operator++(int) { - istream_iterator<T, Distance> tmp = *this; - read(); - return tmp; - } -}; - -template <class T, class Distance> -bool operator==(const istream_iterator<T, Distance>& x, - const istream_iterator<T, Distance>& y) { - return x.stream == y.stream && x.end_marker == y.end_marker || - x.end_marker == false && y.end_marker == false; -} - -template <class T> -class ostream_iterator : public output_iterator { -protected: - ostream* stream; - char* string; -public: - ostream_iterator(ostream& s) : stream(&s), string(0) {} - ostream_iterator(ostream& s, char* c) : stream(&s), string(c) {} - ostream_iterator<T>& operator=(const T& value) { - *stream << value; - if (string) *stream << string; - return *this; - } - ostream_iterator<T>& operator*() { return *this; } - ostream_iterator<T>& operator++() { return *this; } - ostream_iterator<T>& operator++(int) { return *this; } -}; - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/list.h b/STL/list.h deleted file mode 100644 index b86184a777f..00000000000 --- a/STL/list.h +++ /dev/null @@ -1,520 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef LIST_H -#define LIST_H - -#include <function.h> -#include <algobase.h> -#include <iterator.h> -#include <bool.h> - -#ifndef Allocator -#define Allocator allocator -#include <defalloc.h> -#endif - -#ifndef list -#define list list -#endif - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class T> -class list { -protected: - typedef Allocator<void>::pointer void_pointer; - struct list_node; - friend list_node; - struct list_node { - void_pointer next; - void_pointer prev; - T data; - }; - static Allocator<list_node> list_node_allocator; - static Allocator<T> value_allocator; -public: - typedef T value_type; - typedef Allocator<T> value_allocator_type; - typedef Allocator<T>::pointer pointer; - typedef Allocator<T>::reference reference; - typedef Allocator<T>::const_reference const_reference; - typedef Allocator<list_node> list_node_allocator_type; - typedef Allocator<list_node>::pointer link_type; - typedef Allocator<list_node>::size_type size_type; - typedef Allocator<list_node>::difference_type difference_type; -protected: - size_type buffer_size() { - return list_node_allocator.init_page_size(); - } - struct list_node_buffer; - friend list_node_buffer; - struct list_node_buffer { - void_pointer next_buffer; - link_type buffer; - }; -public: - typedef Allocator<list_node_buffer> buffer_allocator_type; - typedef Allocator<list_node_buffer>::pointer buffer_pointer; -protected: - static Allocator<list_node_buffer> buffer_allocator; -/* - * Changed by Terris - */ - /*static*/ buffer_pointer buffer_list; - /*static*/ link_type free_list; - /*static*/ link_type next_avail; - /*static*/ link_type last; - void add_new_buffer() { - buffer_pointer tmp = buffer_allocator.allocate((size_type)1); - tmp->buffer = list_node_allocator.allocate(buffer_size()); - tmp->next_buffer = buffer_list; - buffer_list = tmp; - next_avail = buffer_list->buffer; - last = next_avail + buffer_size(); - } -/* - * Changed by Terris - */ - /*static*/ size_type number_of_lists; - void deallocate_buffers(); - link_type get_node() { - link_type tmp = free_list; - return free_list ? (free_list = (link_type)(free_list->next), tmp) - : (next_avail == last ? (add_new_buffer(), next_avail++) - : next_avail++); - // ugly code for inlining - avoids multiple returns - } - void put_node(link_type p) { - p->next = free_list; - free_list = p; - } - -protected: - link_type node; - size_type length; -public: - class iterator; - class const_iterator; - class iterator : public bidirectional_iterator<T, difference_type> { - friend class list<T>; - friend class const_iterator; -// friend bool operator==(const iterator& x, const iterator& y); - protected: - link_type node; - iterator(link_type x) : node(x) {} - public: - iterator() {} - bool operator==(const iterator& x) const { return node == x.node; } - reference operator*() const { return (*node).data; } - iterator& operator++() { - node = (link_type)((*node).next); - return *this; - } - iterator operator++(int) { - iterator tmp = *this; - ++*this; - return tmp; - } - iterator& operator--() { - node = (link_type)((*node).prev); - return *this; - } - iterator operator--(int) { - iterator tmp = *this; - --*this; - return tmp; - } - }; - class const_iterator : public bidirectional_iterator<T, difference_type> { - friend class list<T>; - protected: - link_type node; - const_iterator(link_type x) : node(x) {} - public: - const_iterator() {} - const_iterator(const iterator& x) : node(x.node) {} - bool operator==(const const_iterator& x) const { return node == x.node; } - const_reference operator*() const { return (*node).data; } - const_iterator& operator++() { - node = (link_type)((*node).next); - return *this; - } - const_iterator operator++(int) { - const_iterator tmp = *this; - ++*this; - return tmp; - } - const_iterator& operator--() { - node = (link_type)((*node).prev); - return *this; - } - const_iterator operator--(int) { - const_iterator tmp = *this; - --*this; - return tmp; - } - }; - typedef reverse_bidirectional_iterator<const_iterator, value_type, - const_reference, difference_type> - const_reverse_iterator; - typedef reverse_bidirectional_iterator<iterator, value_type, reference, - difference_type> - reverse_iterator; -/* - * Changed by Terris - */ - list() : length(0), free_list(0), buffer_list(0), next_avail(0), last(0), number_of_lists(0) { - ++number_of_lists; - node = get_node(); - (*node).next = node; - (*node).prev = node; - } - iterator begin() { return (link_type)((*node).next); } - const_iterator begin() const { return (link_type)((*node).next); } - iterator end() { return node; } - const_iterator end() const { return node; } - reverse_iterator rbegin() { return reverse_iterator(end()); } - const_reverse_iterator rbegin() const { - return const_reverse_iterator(end()); - } - reverse_iterator rend() { return reverse_iterator(begin()); } - const_reverse_iterator rend() const { - return const_reverse_iterator(begin()); - } - bool empty() const { return length == 0; } - size_type size() const { return length; } - size_type max_size() const { return list_node_allocator.max_size(); } - reference front() { return *begin(); } - const_reference front() const { return *begin(); } - reference back() { return *(--end()); } - const_reference back() const { return *(--end()); } - void swap(list<T>& x) { - std::swap(node, x.node); - std::swap(length, x.length); - /* - * Added By Terris - */ - std::swap(buffer_list, x.buffer_list); - std::swap(free_list, x.free_list); - std::swap(next_avail, x.next_avail); - std::swap(last, x.last); - /* - * Added By Terris - */ - } - iterator insert(iterator position, const T& x) { - link_type tmp = get_node(); - construct(value_allocator.address((*tmp).data), x); - (*tmp).next = position.node; - (*tmp).prev = (*position.node).prev; - (*(link_type((*position.node).prev))).next = tmp; - (*position.node).prev = tmp; - ++length; - return tmp; - } - void insert(iterator position, const T* first, const T* last); - void insert(iterator position, const_iterator first, - const_iterator last); - void insert(iterator position, size_type n, const T& x); - void push_front(const T& x) { insert(begin(), x); } - void push_back(const T& x) { insert(end(), x); } - void erase(iterator position) { - (*(link_type((*position.node).prev))).next = (*position.node).next; - (*(link_type((*position.node).next))).prev = (*position.node).prev; - destroy(value_allocator.address((*position.node).data)); - put_node(position.node); - --length; - } - void erase(iterator first, iterator last); - void pop_front() { erase(begin()); } - void pop_back() { - iterator tmp = end(); - erase(--tmp); - } -/* - * Changed by Terris - */ - list(size_type n, const T& value = T()) : length(0), free_list(0), buffer_list(0), next_avail(0), last(0), number_of_lists(0) { - ++number_of_lists; - node = get_node(); - (*node).next = node; - (*node).prev = node; - insert(begin(), n, value); - } -/* - * Changed by Terris - */ - list(const T* first, const T* last) : length(0), free_list(0), buffer_list(0), next_avail(0), last(0), number_of_lists(0) { - ++number_of_lists; - node = get_node(); - (*node).next = node; - (*node).prev = node; - insert(begin(), first, last); - } -/* - * Changed by Terris - */ - list(const list<T>& x) : length(0), free_list(0), buffer_list(0), next_avail(0), last(0), number_of_lists(0) { - ++number_of_lists; - node = get_node(); - (*node).next = node; - (*node).prev = node; - insert(begin(), x.begin(), x.end()); - } - ~list() { - erase(begin(), end()); - put_node(node); - if (--number_of_lists == 0) deallocate_buffers(); - } - list<T>& operator=(const list<T>& x); -protected: - void transfer(iterator position, iterator first, iterator last) { - (*(link_type((*last.node).prev))).next = position.node; - (*(link_type((*first.node).prev))).next = last.node; - (*(link_type((*position.node).prev))).next = first.node; - link_type tmp = link_type((*position.node).prev); - (*position.node).prev = (*last.node).prev; - (*last.node).prev = (*first.node).prev; - (*first.node).prev = tmp; - } -public: - void splice(iterator position, list<T>& x) { - if (!x.empty()) { - transfer(position, x.begin(), x.end()); - length += x.length; - x.length = 0; - } - } - void splice(iterator position, list<T>& x, iterator i) { - iterator j = i; - if (position == i || position == ++j) return; - transfer(position, i, j); - ++length; - --x.length; - } - void splice(iterator position, list<T>& x, iterator first, iterator last) { - if (first != last) { - if (&x != this) { - difference_type n = 0; - distance(first, last, n); - x.length -= n; - length += n; - } - transfer(position, first, last); - } - } - void remove(const T& value); - void unique(); - void merge(list<T>& x); - void reverse(); - void sort(); -}; - -/* - * Added by Terris - */ -#if 0 -template <class T> -list<T>::buffer_pointer list<T>::buffer_list = 0; - -template <class T> -list<T>::link_type list<T>::free_list = 0; - -template <class T> -list<T>::link_type list<T>::next_avail = 0; - -template <class T> -list<T>::link_type list<T>::last = 0; - -template <class T> -list<T>::size_type list<T>::number_of_lists = 0; -/* - * Added by Terris - */ -#endif - -template <class T> -list<T>::list_node_allocator_type list<T>::list_node_allocator; - -template <class T> -list<T>::value_allocator_type list<T>::value_allocator; - -template <class T> -list<T>::buffer_allocator_type list<T>::buffer_allocator; - -/* - * currently the following does not work - made into a member function - -template <class T> -inline bool operator==(const list<T>::iterator& x, const list<T>::iterator& y) { - return x.node == y.node; -} -*/ - -template <class T> -inline bool operator==(const list<T>& x, const list<T>& y) { - return x.size() == y.size() && equal(x.begin(), x.end(), y.begin()); -} - -template <class T> -inline bool operator<(const list<T>& x, const list<T>& y) { - return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); -} - -template <class T> -void list<T>::deallocate_buffers() { - while (buffer_list) { - buffer_pointer tmp = buffer_list; - buffer_list = (buffer_pointer)(buffer_list->next_buffer); - list_node_allocator.deallocate(tmp->buffer); - buffer_allocator.deallocate(tmp); - } - free_list = 0; - next_avail = 0; - last = 0; -} - -template <class T> -void list<T>::insert(iterator position, const T* first, const T* last) { - while (first != last) insert(position, *first++); -} - -template <class T> -void list<T>::insert(iterator position, const_iterator first, - const_iterator last) { - while (first != last) insert(position, *first++); -} - -template <class T> -void list<T>::insert(iterator position, size_type n, const T& x) { - while (n--) insert(position, x); -} - -template <class T> -void list<T>::erase(iterator first, iterator last) { - while (first != last) erase(first++); -} - -template <class T> -list<T>& list<T>::operator=(const list<T>& 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 <class T> -void list<T>::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 <class T> -void list<T>::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 <class T> -void list<T>::merge(list<T>& 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); - first2 = next; - } else - ++first1; - if (first2 != last2) transfer(last1, first2, last2); - length += x.length; - x.length= 0; -} - -template <class T> -void list<T>::reverse() { - if (size() < 2) return; - for (iterator first = ++begin(); first != end();) { - iterator old = first++; - transfer(begin(), old, first); - } -} - -template <class T> -void list<T>::sort() { - if (size() < 2) return; - list<T> carry; - list<T> counter[64]; - int fill = 0; - while (!empty()) { - carry.splice(carry.begin(), *this, begin()); - int i = 0; - while(i < fill && !counter[i].empty()) { - counter[i].merge(carry); - carry.swap(counter[i++]); - } - carry.swap(counter[i]); - if (i == fill) ++fill; - } - while(fill--) merge(counter[fill]); -} - -#undef Allocator -#undef list - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/map.h b/STL/map.h deleted file mode 100644 index 2cf7e543269..00000000000 --- a/STL/map.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef MAP_H -#define MAP_H - -#ifndef Allocator -#define Allocator allocator -#include <defalloc.h> -#endif - -#include <tree.h> - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class Key, class T, class Compare> -class map { -public: - -// typedefs: - - typedef Key key_type; - typedef pair<const Key, T> value_type; - typedef Compare key_compare; - - class value_compare - : public binary_function<value_type, value_type, bool> { - friend class map<Key, T, Compare>; - protected : - Compare comp; - value_compare(Compare c) : comp(c) {} - public: - bool operator()(const value_type& x, const value_type& y) const { - return comp(x.first, y.first); - } - }; - -private: - typedef rb_tree<key_type, value_type, - select1st<value_type, key_type>, key_compare> rep_type; - rep_type t; // red-black tree representing map -public: - typedef rep_type::pointer pointer; - typedef rep_type::reference reference; - typedef rep_type::const_reference const_reference; - typedef rep_type::iterator iterator; - typedef rep_type::const_iterator const_iterator; - typedef rep_type::reverse_iterator reverse_iterator; - typedef rep_type::const_reverse_iterator const_reverse_iterator; - typedef rep_type::size_type size_type; - typedef rep_type::difference_type difference_type; - -// allocation/deallocation - - map(const Compare& comp = Compare()) : t(comp, false) {} - map(const value_type* first, const value_type* last, - const Compare& comp = Compare()) : t(first, last, comp, false) {} - map(const map<Key, T, Compare>& x) : t(x.t, false) {} - map<Key, T, Compare>& operator=(const map<Key, T, Compare>& x) { - t = x.t; - return *this; - } - -// accessors: - - key_compare key_comp() const { return t.key_comp(); } - value_compare value_comp() const { return value_compare(t.key_comp()); } - iterator begin() { return t.begin(); } - const_iterator begin() const { return t.begin(); } - iterator end() { return t.end(); } - const_iterator end() const { return t.end(); } - reverse_iterator rbegin() { return t.rbegin(); } - const_reverse_iterator rbegin() const { return t.rbegin(); } - reverse_iterator rend() { return t.rend(); } - const_reverse_iterator rend() const { return t.rend(); } - bool empty() const { return t.empty(); } - size_type size() const { return t.size(); } - size_type max_size() const { return t.max_size(); } - Allocator<T>::reference operator[](const key_type& k) { - return (*((insert(value_type(k, T()))).first)).second; - } - void swap(map<Key, T, Compare>& x) { t.swap(x.t); } - -// insert/erase - - typedef pair<iterator, bool> pair_iterator_bool; - // typedef done to get around compiler bug - pair_iterator_bool insert(const value_type& x) { return t.insert(x); } - iterator insert(iterator position, const value_type& x) { - return t.insert(position, x); - } - void insert(const value_type* first, const value_type* last) { - t.insert(first, last); - } - void erase(iterator position) { t.erase(position); } - size_type erase(const key_type& x) { return t.erase(x); } - void erase(iterator first, iterator last) { t.erase(first, last); } - -// map operations: - - iterator find(const key_type& x) { return t.find(x); } - const_iterator find(const key_type& x) const { return t.find(x); } - size_type count(const key_type& x) const { return t.count(x); } - iterator lower_bound(const key_type& x) {return t.lower_bound(x); } - const_iterator lower_bound(const key_type& x) const { - return t.lower_bound(x); - } - iterator upper_bound(const key_type& x) {return t.upper_bound(x); } - const_iterator upper_bound(const key_type& x) const { - return t.upper_bound(x); - } - typedef pair<iterator, iterator> pair_iterator_iterator; - // typedef done to get around compiler bug - pair_iterator_iterator equal_range(const key_type& x) { - return t.equal_range(x); - } - typedef pair<const_iterator, const_iterator> pair_citerator_citerator; - // typedef done to get around compiler bug - pair_citerator_citerator equal_range(const key_type& x) const { - return t.equal_range(x); - } -}; - -template <class Key, class T, class Compare> -inline bool operator==(const map<Key, T, Compare>& x, - const map<Key, T, Compare>& y) { - return x.size() == y.size() && equal(x.begin(), x.end(), y.begin()); -} - -template <class Key, class T, class Compare> -inline bool operator<(const map<Key, T, Compare>& x, - const map<Key, T, Compare>& y) { - return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); -} - -#undef Allocator - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/multimap.h b/STL/multimap.h deleted file mode 100644 index 570aa521999..00000000000 --- a/STL/multimap.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef MULTIMAP_H -#define MULTIMAP_H - -#ifndef Allocator -#define Allocator allocator -#include <defalloc.h> -#endif - -#include <tree.h> - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class Key, class T, class Compare> -class multimap { -public: - -// typedefs: - - typedef Key key_type; - typedef pair<const Key, T> value_type; - typedef Compare key_compare; - - class value_compare - : public binary_function<value_type, value_type, bool> { - friend class multimap<Key, T, Compare>; - protected: - Compare comp; - value_compare(Compare c) : comp(c) {} - public: - bool operator()(const value_type& x, const value_type& y) const { - return comp(x.first, y.first); - } - }; - -private: - typedef rb_tree<key_type, value_type, - select1st<value_type, key_type>, key_compare> rep_type; - rep_type t; // red-black tree representing multimap -public: - typedef rep_type::reference reference; - typedef rep_type::const_reference const_reference; - typedef rep_type::iterator iterator; - typedef rep_type::const_iterator const_iterator; - typedef rep_type::reverse_iterator reverse_iterator; - typedef rep_type::const_reverse_iterator const_reverse_iterator; - typedef rep_type::size_type size_type; - typedef rep_type::difference_type difference_type; - -// allocation/deallocation - - multimap(const Compare& comp = Compare()) : t(comp, true) { } - multimap(const value_type* first, const value_type* last, - const Compare& comp = Compare()) : t(first, last, comp, true) { } - multimap(const multimap<Key, T, Compare>& x) : t(x.t, true) { } - multimap<Key, T, Compare>& operator=(const multimap<Key, T, Compare>& x) { - t = x.t; - return *this; - } - -// accessors: - - key_compare key_comp() const { return t.key_comp(); } - value_compare value_comp() const { return value_compare(t.key_comp()); } - iterator begin() { return t.begin(); } - const_iterator begin() const { return t.begin(); } - iterator end() { return t.end(); } - const_iterator end() const { return t.end(); } - reverse_iterator rbegin() { return t.rbegin(); } - const_reverse_iterator rbegin() const { return t.rbegin(); } - reverse_iterator rend() { return t.rend(); } - const_reverse_iterator rend() const { return t.rend(); } - bool empty() const { return t.empty(); } - size_type size() const { return t.size(); } - size_type max_size() const { return t.max_size(); } - void swap(multimap<Key, T, Compare>& x) { t.swap(x.t); } - -// insert/erase - - iterator insert(const value_type& x) { return t.insert(x).first; } - iterator insert(iterator position, const value_type& x) { - return t.insert(position, x); - } - void insert(const value_type* first, const value_type* last) { - t.insert(first, last); - } - void erase(iterator position) { t.erase(position); } - size_type erase(const key_type& x) { return t.erase(x); } - void erase(iterator first, iterator last) { t.erase(first, last); } - -// multimap operations: - - iterator find(const key_type& x) { return t.find(x); } - const_iterator find(const key_type& x) const { return t.find(x); } - size_type count(const key_type& x) const { return t.count(x); } - iterator lower_bound(const key_type& x) {return t.lower_bound(x); } - const_iterator lower_bound(const key_type& x) const { - return t.lower_bound(x); - } - iterator upper_bound(const key_type& x) {return t.upper_bound(x); } - const_iterator upper_bound(const key_type& x) const { - return t.upper_bound(x); - } - typedef pair<iterator, iterator> pair_iterator_iterator; - // typedef done to get around compiler bug - pair_iterator_iterator equal_range(const key_type& x) { - return t.equal_range(x); - } - typedef pair<const_iterator, const_iterator> pair_citerator_citerator; - // typedef done to get around compiler bug - pair_citerator_citerator equal_range(const key_type& x) const { - return t.equal_range(x); - } -}; - -template <class Key, class T, class Compare> -inline bool operator==(const multimap<Key, T, Compare>& x, - const multimap<Key, T, Compare>& y) { - return x.size() == y.size() && equal(x.begin(), x.end(), y.begin()); -} - -template <class Key, class T, class Compare> -inline bool operator<(const multimap<Key, T, Compare>& x, - const multimap<Key, T, Compare>& y) { - return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); -} - -#undef Allocator - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/multiset.h b/STL/multiset.h deleted file mode 100644 index 6c96e7504c3..00000000000 --- a/STL/multiset.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef MULTISET_H -#define MULTISET_H - -#ifndef Allocator -#define Allocator allocator -#include <defalloc.h> -#endif - -#include <tree.h> - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class Key, class Compare> -class multiset { -public: -// typedefs: - - typedef Key key_type; - typedef Key value_type; - typedef Compare key_compare; - typedef Compare value_compare; -private: - typedef rb_tree<key_type, value_type, - ident<value_type, key_type>, key_compare> rep_type; - rep_type t; // red-black tree representing multiset -public: - typedef rep_type::const_reference reference; - typedef rep_type::const_reference const_reference; - typedef rep_type::const_iterator iterator; - typedef rep_type::const_iterator const_iterator; - typedef rep_type::const_reverse_iterator reverse_iterator; - typedef rep_type::const_reverse_iterator const_reverse_iterator; - typedef rep_type::size_type size_type; - typedef rep_type::difference_type difference_type; - -// allocation/deallocation - - multiset(const Compare& comp = Compare()) : t(comp, true) {} - multiset(const value_type* first, const value_type* last, - const Compare& comp = Compare()) : t(comp, true) { - for (const value_type* i = first; i != last; ++i) - t.insert(*i); - } - multiset(const multiset<Key, Compare>& x) : t(x.t, true) {} - multiset<Key, Compare>& operator=(const multiset<Key, Compare>& x) { - t = x.t; - return *this; - } - -// accessors: - - key_compare key_comp() const { return t.key_comp(); } - value_compare value_comp() const { return t.key_comp(); } - iterator begin() const { return t.begin(); } - iterator end() const { return t.end(); } - reverse_iterator rbegin() const { return t.rbegin(); } - reverse_iterator rend() const { return t.rend(); } - bool empty() const { return t.empty(); } - size_type size() const { return t.size(); } - size_type max_size() const { return t.max_size(); } - void swap(multiset<Key, Compare>& x) { t.swap(x.t); } - -// insert/erase - iterator insert(const value_type& x) { - return t.insert(x).first; - } - iterator insert(iterator position, const value_type& x) { - return t.insert((rep_type::iterator&)position, x); - } - void insert(const value_type* first, const value_type* last) { - for (const value_type* i = first; i != last; ++i) - t.insert(*i); - } - void erase(iterator position) { - t.erase((rep_type::iterator&)position); - } - size_type erase(const key_type& x) { - return t.erase(x); - } - void erase(iterator first, iterator last) { - t.erase((rep_type::iterator&)first, - (rep_type::iterator&)last); - } - -// multiset operations: - - iterator find(const key_type& x) const { return t.find(x); } - size_type count(const key_type& x) const { return t.count(x); } - iterator lower_bound(const key_type& x) const { - return t.lower_bound(x); - } - iterator upper_bound(const key_type& x) const { - return t.upper_bound(x); - } - typedef pair<iterator, iterator> pair_iterator_iterator; - // typedef done to get around compiler bug - pair_iterator_iterator equal_range(const key_type& x) const { - return t.equal_range(x); - } -}; - -template <class Key, class Compare> -inline bool operator==(const multiset<Key, Compare>& x, - const multiset<Key, Compare>& y) { - return x.size() == y.size() && equal(x.begin(), x.end(), y.begin()); -} - -template <class Key, class Compare> -inline bool operator<(const multiset<Key, Compare>& x, - const multiset<Key, Compare>& y) { - return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); -} - -#undef Allocator - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/pair.h b/STL/pair.h deleted file mode 100644 index acb45a2f7f1..00000000000 --- a/STL/pair.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef PAIR_H -#define PAIR_H - -#include <bool.h> - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class T1, class T2> -struct pair { - T1 first; - T2 second; - pair(const T1& a, const T2& b) : first(a), second(b) {} -}; - -template <class T1, class T2> -inline bool operator==(const pair<T1, T2>& x, const pair<T1, T2>& y) { - return x.first == y.first && x.second == y.second; -} - -template <class T1, class T2> -inline bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y) { - return x.first < y.first || (!(y.first < x.first) && x.second < y.second); -} - -template <class T1, class T2> -inline pair<T1, T2> make_pair(const T1& x, const T2& y) { - return pair<T1, T2>(x, y); -} - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/projectn.h b/STL/projectn.h deleted file mode 100644 index eae35dd8e6d..00000000000 --- a/STL/projectn.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef PROJECTN_H -#define PROJECTN_H - -#include <function.h> - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class T, class U> -struct select1st : public unary_function<T, U> { - const U& operator()(const T& x) const { return x.first; } -}; - -template <class T, class U> -struct ident : public unary_function<T, U> { - const U& operator()(const T& x) const { return x; } -}; - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/ptr.h b/STL/ptr.h deleted file mode 100644 index ad0fe736795..00000000000 --- a/STL/ptr.h +++ /dev/null @@ -1,338 +0,0 @@ -//***************************************************************************** -// -// Class Ptr -// -// Ptr is a proxy for a pointer to an object. This class provides automatic -// deletion of objects allocated on the heap. Objects are viewed via the -// ->, *, and (itemClass *) operators. Since these operators are inline, there -// is no performance penalty for using this proxy instead of a real pointer. -// -// You can assign multiple pointers to one Ptr object. If you -// do, the old object will be destroyed automatically. -// -// Use suggestions: -// 1. To clean up pointers returned by functions or methods that -// return pointers and expect the caller to delete the pointer. -// 2. To make sure an object gets deleted. Using Ptr saves you -// the hassle of writing an exception handler for this purpose. -// 3. Part of a composite object (assembly-part). -// This class is a useful substitute when pointers are needed, -// because object clean-up is fully encapsulated. -// The following are cases where pointers would normally be used. -// -// For declaring class data members that may or -// may not be instantiated (1 to 0-or-1 relationship). -// -// To instantiate a data member only when it is really needed, -// reducing average memory consumption during execution. -// -// MFC and thread-local storage -- some MFC objects can only be -// accessed by the thread that created them. MFC sub-component -// objects cannot be instantiated along with its container object -// if the container object is created in one thread and the MFC -// object is accessed in another. -// -// When a 'part' class does not have a default constructor. -// There are two solutions provided by C++ for this situation. -// The designer could use a pointer to the object instead, -// or the designer could alter the assembly class's constructor -// to accept parameters that are passed on to the 'part' class's -// constructor. -// -// See Design Patterns - Proxy pattern, and the Iterator pattern (pg 266). -// -// Template Parameters: -// itemClass: The class of the underlying object (the 'pointed to' object). -// -//***************************************************************************** - -template <class itemClass> -class Ptr -{ - public: - - // Construction - Ptr( itemClass *pItem = NULL ); - Ptr( const Ptr& ); - - // Destruction - ~Ptr(); - - // Access to 'real' object - inline itemClass * operator -> () const; - inline operator itemClass * () const; - inline itemClass& operator * () const; - - // Assignment - Ptr& operator = ( const Ptr& ); - Ptr& operator = ( itemClass *pItem ); - itemClass *& GetPtrRef(); - - // Other - void Disown(); - - private: - - itemClass *m_pObject; -}; - -//***************************************************************************** -// -// Ptr default constructor -// -// DESCRIPTION: -// -// Constructor. -// -// INPUT PARAMETERS: -// pItem - Pointer to the object to point to. pItem is deleted -// when 'this' is deleted. -// -//***************************************************************************** - -template <class itemClass> -Ptr<itemClass>::Ptr<itemClass>( itemClass *pItem ) - : m_pObject( pItem ) -{ -} - -//***************************************************************************** -// -// Ptr::Ptr (Ptr&) -// -// DESCRIPTION: -// -// Copy constructor. To avoid deleting 'rCopy's object -// twice, 'rCopy' will not point to any object after this method completes. -// rCopy is not really const, but it is declared 'const' since -// this allows putting Ptr's in STL containers. -// -// INPUT PARAMETERS: -// rCopy - A reference to the Ptr to copy. -// -// OUTPUT PARAMETERS: -// rCopy - No longer points to anything. -// -//***************************************************************************** - -template <class itemClass> -Ptr<itemClass>::Ptr<itemClass>( const Ptr<itemClass>& rCopy ) -{ - m_pObject = rCopy.m_pObject; - - // rCopy no longer owns the object. - const_cast< Ptr<itemClass>& >(rCopy).m_pObject = NULL; -} - -//***************************************************************************** -// -// Ptr::~Ptr -// -// DESCRIPTION: -// -// Destroys the object that is being pointed to (if any). -// -//***************************************************************************** - -template <class itemClass> -Ptr<itemClass>::~Ptr<itemClass>() -{ - delete m_pObject; // delete NULL OK -} - -//***************************************************************************** -// -// Ptr::GetPtrRef -// -// DESCRIPTION: -// -// Returns a reference to an internal pointer. This allows these -// objects to be sent to functions that accept pointers to pointers -// or references to pointers as output arguments. Typically, this -// is how functions return multiple objects. -// -// This is not const because this method is ultimately intended -// for changing the object's value. -// -// RETURNS: -// A reference to the 'pointer' data member of this object. -// -//***************************************************************************** - -template <class itemClass> -itemClass *& Ptr<itemClass>::GetPtrRef() -{ - return m_pObject; -} - -//***************************************************************************** -// -// Ptr::operator -> -// -// DESCRIPTION: -// -// Provides access to the interface of the underlying object. -// -// RETURNS: -// Nothing callers can really use - only the compiler can use it. -// This method is part of the pointer to member operator (-> *). -// -//***************************************************************************** - -template <class itemClass> -itemClass * Ptr<itemClass>::operator -> () const -{ - return m_pObject; -} - -//***************************************************************************** -// -// Ptr::operator itemClass * -// -// DESCRIPTION: -// -// Provides access to the underlying object. -// -// RETURNS: -// Pointer to the object that is being pointed to. -// -//***************************************************************************** - -template <class itemClass> -Ptr<itemClass>::operator itemClass * () const -{ - return m_pObject; -} - -//***************************************************************************** -// -// Ptr::operator * -// -// DESCRIPTION: -// -// Provides access to the underlying object. -// -// RETURNS: -// Reference to the object that is being pointed to. -// -//***************************************************************************** - -template <class itemClass> -itemClass& Ptr<itemClass>::operator * () const -{ - return *m_pObject; -} - -//***************************************************************************** -// -// Ptr::operator = (Ptr&) -// -// DESCRIPTION: -// -// For assigning one Ptr to another. Deletes the object that 'this' -// is pointing to and makes 'this' point to the object that 'rCopy' -// is pointing to. To avoid deleting 'rCopy's object twice, 'rCopy' -// will not point to any object after this method completes. -// -// Although the parameter rCopy can be arugably not "const", it -// must be "const" since the compiler will complain in certain -// cases with warning C4270. -// -// INPUT PARAMETERS: -// rCopy - A reference to the Ptr to copy. -// -// OUTPUT PARAMETERS: -// rCopy - No longer points to anything. -// -// RETURNS: -// A reference to 'this'. -// -//***************************************************************************** - -template <class itemClass> -Ptr<itemClass>& -Ptr<itemClass>::operator = ( const Ptr<itemClass>& rCopy ) -{ - // Check for A = A - if ( &rCopy == this ) - { - return *this; - } - - // Save current pointer so we can delete it after - // doing everything else - itemClass *pOldObject = m_pObject; - - // Get the pointer out of rCopy - m_pObject = rCopy.m_pObject; - - // rCopy no longer owns the object. - const_cast< Ptr<itemClass>& >(rCopy).m_pObject = NULL; - - // This might generate an exception. But, we won't - // introduce a memory leak because 'this' now - // owns rCopy's pointer. - delete pOldObject; // delete NULL OK - - return *this; -} - -//***************************************************************************** -// -// Ptr::operator = -// -// DESCRIPTION: -// -// Changes the underlying object. If the proxy currently has an -// underlying object, then it is deleted. -// -// INPUT PARAMETERS: -// pItem - Reference to the new object. Can be NULL. -// -// RETURNS: -// Reference to 'this'. -// -//***************************************************************************** - -template <class itemClass> -Ptr<itemClass>& Ptr<itemClass>::operator = ( itemClass *pItem ) -{ - if ( m_pObject == pItem ) - { - return *this; - } - - // Save current pointer so we can delete it after - // doing everything else - itemClass *pOldObject = m_pObject; - - m_pObject = pItem; - - // This might generate an exception. But, we won't - // introduce a memory leak because 'this' now - // owns pItem. - delete pOldObject; // delete NULL OK - - return *this; -} - -//***************************************************************************** -// -// Ptr::Disown -// -// DESCRIPTION: -// -// Ptr objects delete their pointed-to objects when they go out -// of scope. Calling Disown() causes the Ptr object to 'forget' -// that it is currently pointing to an object. -// -// RETURNS: -// Doesn't return anything because returning a value such as a pointer -// to the item encourages misuse leading to memory leaks. -// -//***************************************************************************** -template <class itemClass> -void Ptr<itemClass>::Disown() -{ - m_pObject = NULL; -} diff --git a/STL/queue.h b/STL/queue.h deleted file mode 100644 index 2c539450a61..00000000000 --- a/STL/queue.h +++ /dev/null @@ -1 +0,0 @@ -#include <stack.h> diff --git a/STL/random.cpp b/STL/random.cpp deleted file mode 100644 index 57ef645ae64..00000000000 --- a/STL/random.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#include <stddef.h> - -#define __SEED 161803398 - -class __random_generator { -protected: - unsigned long table[55]; - size_t index1; - size_t index2; -public: - unsigned long operator()(unsigned long limit) { - index1 = (index1 + 1) % 55; - index2 = (index2 + 1) % 55; - table[index1] = table[index1] - table[index2]; - return table[index1] % limit; - } - void seed(unsigned long j); - __random_generator(unsigned long j) { seed(j); } -}; - -void __random_generator::seed(unsigned long j) { - unsigned long k = 1; - table[54] = j; - for (size_t i = 0; i < 54; i++) { - size_t ii = 21 * i % 55; - table[ii] = k; - k = j - k; - j = table[ii]; - } - for (int loop = 0; loop < 4; loop++) { - for (i = 0; i < 55; i++) - table[i] = table[i] - table[(1 + i + 30) % 55]; - } - index1 = 0; - index2 = 31; -} - -__random_generator rd(__SEED); - -unsigned long __long_random(unsigned long limit) { - return rd(limit); -} diff --git a/STL/set.h b/STL/set.h deleted file mode 100644 index 95ce5e1279d..00000000000 --- a/STL/set.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef SET_H -#define SET_H - -#ifndef Allocator -#define Allocator allocator -#include <defalloc.h> -#endif - -#include <tree.h> - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class Key, class Compare> -class set { -public: -// typedefs: - - typedef Key key_type; - typedef Key value_type; - typedef Compare key_compare; - typedef Compare value_compare; -private: - typedef rb_tree<key_type, value_type, - ident<value_type, key_type>, key_compare> rep_type; - rep_type t; // red-black tree representing set -public: - typedef rep_type::const_reference reference; - typedef rep_type::const_reference const_reference; - typedef rep_type::const_iterator iterator; - typedef rep_type::const_iterator const_iterator; - typedef rep_type::const_reverse_iterator reverse_iterator; - typedef rep_type::const_reverse_iterator const_reverse_iterator; - typedef rep_type::size_type size_type; - typedef rep_type::difference_type difference_type; - -// allocation/deallocation - - set(const Compare& comp = Compare()) : t(comp, false) {} - set(const value_type* first, const value_type* last, - const Compare& comp = Compare()) : t(comp, false) { - for (const value_type* i = first; i != last; ++i) - t.insert(*i); - } - set(const set<Key, Compare>& x) : t(x.t, false) {} - set<Key, Compare>& operator=(const set<Key, Compare>& x) { - t = x.t; - return *this; - } - -// accessors: - - key_compare key_comp() const { return t.key_comp(); } - value_compare value_comp() const { return t.key_comp(); } - iterator begin() const { return t.begin(); } - iterator end() const { return t.end(); } - reverse_iterator rbegin() const { return t.rbegin(); } - reverse_iterator rend() const { return t.rend(); } - bool empty() const { return t.empty(); } - size_type size() const { return t.size(); } - size_type max_size() const { return t.max_size(); } - void swap(set<Key, Compare>& x) { t.swap(x.t); } - -// insert/erase - typedef pair<iterator, bool> pair_iterator_bool; - // typedef done to get around compiler bug - pair_iterator_bool insert(const value_type& x) { - pair<rep_type::iterator, bool> p = t.insert(x); - return pair<iterator, bool>(p.first, p.second); - } - iterator insert(iterator position, const value_type& x) { - return t.insert((rep_type::iterator&)position, x); - } - void insert(const value_type* first, const value_type* last) { - for (const value_type* i = first; i != last; ++i) - t.insert(*i); - } - void erase(iterator position) { - t.erase((rep_type::iterator&)position); - } - size_type erase(const key_type& x) { - return t.erase(x); - } - void erase(iterator first, iterator last) { - t.erase((rep_type::iterator&)first, - (rep_type::iterator&)last); - } - -// set operations: - - iterator find(const key_type& x) const { return t.find(x); } - size_type count(const key_type& x) const { return t.count(x); } - iterator lower_bound(const key_type& x) const { - return t.lower_bound(x); - } - iterator upper_bound(const key_type& x) const { - return t.upper_bound(x); - } - typedef pair<iterator, iterator> pair_iterator_iterator; - // typedef done to get around compiler bug - pair_iterator_iterator equal_range(const key_type& x) const { - return t.equal_range(x); - } -}; - -template <class Key, class Compare> -inline bool operator==(const set<Key, Compare>& x, - const set<Key, Compare>& y) { - return x.size() == y.size() && equal(x.begin(), x.end(), y.begin()); -} - -template <class Key, class Compare> -inline bool operator<(const set<Key, Compare>& x, - const set<Key, Compare>& y) { - return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); -} - -#undef Allocator - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/stack.h b/STL/stack.h deleted file mode 100644 index fbbfcff7541..00000000000 --- a/STL/stack.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef STACK_H -#define STACK_H - -#include <bool.h> -#include <heap.h> - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class Container> -class stack { -friend bool operator==(const stack<Container>& x, const stack<Container>& y); -friend bool operator<(const stack<Container>& x, const stack<Container>& y); -public: - typedef Container::value_type value_type; - typedef Container::size_type size_type; -protected: - Container c; -public: - bool empty() const { return c.empty(); } - size_type size() const { return c.size(); } - value_type& top() { return c.back(); } - const value_type& top() const { return c.back(); } - void push(const value_type& x) { c.push_back(x); } - void pop() { c.pop_back(); } -}; - -template <class Container> -bool operator==(const stack<Container>& x, const stack<Container>& y) { - return x.c == y.c; -} - -template <class Container> -bool operator<(const stack<Container>& x, const stack<Container>& y) { - return x.c < y.c; -} - -template <class Container> -class queue { -friend bool operator==(const queue<Container>& x, const queue<Container>& y); -friend bool operator<(const queue<Container>& x, const queue<Container>& y); -public: - typedef Container::value_type value_type; - typedef Container::size_type size_type; -protected: - Container c; -public: - bool empty() const { return c.empty(); } - size_type size() const { return c.size(); } - value_type& front() { return c.front(); } - const value_type& front() const { return c.front(); } - value_type& back() { return c.back(); } - const value_type& back() const { return c.back(); } - void push(const value_type& x) { c.push_back(x); } - void pop() { c.pop_front(); } -}; - -template <class Container> -bool operator==(const queue<Container>& x, const queue<Container>& y) { - return x.c == y.c; -} - -template <class Container> -bool operator<(const queue<Container>& x, const queue<Container>& y) { - return x.c < y.c; -} - -template <class Container, class Compare> -// Compare = less<Container::value_type> > -class priority_queue { -public: - typedef Container::value_type value_type; - typedef Container::size_type size_type; -protected: - Container c; - Compare comp; -public: - priority_queue(const Compare& x = Compare()) : c(), comp(x) {} - priority_queue(const value_type* first, const value_type* last, - const Compare& x = Compare()) : c(first, last), comp(x) { - make_heap(c.begin(), c.end(), comp); - } -/* - template <class InputIterator> - priority_queue(InputIterator first, InputIterator last, - const Compare& x = Compare()) : c(first, last), comp(x) { - make_heap(c.begin(), c.end(), comp); - } -*/ - bool empty() const { return c.empty(); } - size_type size() const { return c.size(); } - value_type& top() { return c.front(); } - const value_type& top() const { return c.front(); } - void push(const value_type& x) { - c.push_back(x); - push_heap(c.begin(), c.end(), comp); - } - void pop() { - pop_heap(c.begin(), c.end(), comp); - c.pop_back(); - } -}; - -// no equality is provided - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/stl.h b/STL/stl.h deleted file mode 100644 index 2d75e19ba5a..00000000000 --- a/STL/stl.h +++ /dev/null @@ -1,206 +0,0 @@ -#ifndef __STL_H -#define __STL_H -#endif - -#include <bool.h> - -// Assumes MFC is included too. - -//***************************************************************************** -// -// SequenceDelete -// -// DESCRIPTION: -// -// Deletes items in an STL sequence container. All items in the -// container must be pointers to objects. -// -// INPUT PARAMETERS: -// first - An iterator. Should point to the first item to delete. -// last - An iterator. Should point AFTER the last item you wish -// to delete. -// -//***************************************************************************** - -template <class ForwardIteratorClass> -void -SequenceDelete(ForwardIteratorClass first, const ForwardIteratorClass &last) -{ - using namespace std; - - while ( first != last ) - { - delete *first++; - } -} - -//***************************************************************************** -// -// MapDelete -// -// DESCRIPTION: -// -// Deletes items in an STL map container. All items in the container -// must be pointers to objects. -// -// INPUT PARAMETERS: -// first - An iterator. Should point to the first item to delete. -// last - An iterator. Should point AFTER the last item you wish -// to delete. -// -//***************************************************************************** - -template <class ForwardIteratorClass> -void -MapDelete(ForwardIteratorClass first, const ForwardIteratorClass &last) -{ - using namespace std; - - while ( first != last ) - { - delete (*first++).second; - } -} - -//***************************************************************************** -// -// Comparison operators -// -// STL cannot find comparison operators at the global level. Is this a -// compier bug?? -// -// These functions cannot be templates because they will cause ambiguity -// errors within the STL code. -// -//***************************************************************************** - -//***************************************************************************** -// STL_ROUTE_ALL_GLOBALS(T1, T2) (macro) -// -// DESCRIPTION: -// -// This macro routes all of the comparison operators for a class whose -// operators happen to be defined at the global level. -// -// INPUT PARAMETERS: -// T1 - The name of the left-hand-side class. -// T2 - The name of the right-hand-side class. -// -//***************************************************************************** - -#define STL_ROUTE_ALL_GLOBALS(T1, T2) \ -namespace std \ -{ \ - inline bool operator == ( const T1 &s1, const T2 &s2 ) \ - { \ - return ::operator == (s1, s2); \ - } \ - inline bool operator != ( const T1 &s1, const T2 &s2 ) \ - { \ - return ::operator != (s1, s2); \ - } \ - inline bool operator > ( const T1 &s1, const T2 &s2 ) \ - { \ - return ::operator > (s1, s2); \ - } \ - inline bool operator < ( const T1 &s1, const T2 &s2 ) \ - { \ - return ::operator < (s1, s2); \ - } \ - inline bool operator >= ( const T1 &s1, const T2 &s2 ) \ - { \ - return ::operator >= (s1, s2); \ - } \ - inline bool operator <= ( const T1 &s1, const T2 &s2 ) \ - { \ - return ::operator <= (s1, s2); \ - } \ -} - -//***************************************************************************** -// STL_DECLARE_GLOBAL_NE(T1, T2) (macro) / Inequality -// STL_DECLARE_GLOBAL_GT(T1, T2) (macro) / Greater than -// STL_DECLARE_GLOBAL_GE(T1, T2) (macro) / Greater than or equal to -// STL_DECLARE_GLOBAL_LE(T1, T2) (macro) / Less than or equal to -// -// DESCRIPTION: -// -// These macros duplicate the behavior in the STL's function.h file. -// This behavior provides default implementations of certain comparison -// operators: !=, >, >=, and <=. -// -// STL is designed to instantiate these operators automatically if -// they are missing. This convenient feature of the STL has wreaked havoc -// on MFC and as a result Microsoft punted and said "use the std namespace." -// However, this introduced a new problem -- the STL can no longer -// automatically derive !=, <, >=, and <= from the objects' existing -// operators, because the operators are not accessible from the std -// namespace (they are in the global namespace). In fact, STL cannot -// even find the default global operators (such as == between two -// classes). This seems like a bug in Microsoft's compiler. -// -// If you are storing a new class of objects in an STL container and -// want to use find() on the container, then you must declare a global -// equality operator on the object. Then you can either create your -// own != operator, or derive one using STL_DECLARE_GLOBAL_NE. -// -// e.g., bool operator == ( const X&, const X& ) -// STL_DECLARE_GLOBAL_NE( X, X ) -// -// It's not a bad idea to declare: -// bool operator < ( const X&, const X& ) too. -// -// These macros should be used with classes that implement their -// comparison operators as global functions. -// -// INPUT PARAMETERS: -// T1 - The name of the left-hand-side class. -// T2 - The name of the right-hand-side class. -// -//***************************************************************************** - -// Retuires == (T1, T2) -#define STL_DECLARE_GLOBAL_NE(T1, T2) \ -namespace std \ -{ \ - inline bool operator != ( const T1 &s1, const T2 &s2 ) \ - { \ - return !( ::operator == (s1, s2) ); \ - } \ -} - -// Requires < ( T2, T1 ) -#define STL_DECLARE_GLOBAL_GT(T1, T2) \ -namespace std \ -{ \ - inline bool operator > ( const T1 &s1, const T2 &s2 ) \ - { \ - return ::operator < (s2, s1); \ - } \ -} - -// Requires < ( T1, T2 ) -#define STL_DECLARE_GLOBAL_GE(T1, T2) \ -namespace std \ -{ \ - inline bool operator >= ( const T1 &s1, const T2 &s2 ) \ - { \ - return !( ::operator < (s1, s2) ); \ - } \ -} - -// Requires < ( T2, T1 ) -#define STL_DECLARE_GLOBAL_LE(T1, T2) \ -namespace std \ -{ \ - inline bool operator <= ( const T1 &s1, const T2 &s2 ) \ - { \ - return !( ::operator < (s2, s1) ); \ - } \ -} - -//***************************************************************************** -// Route CString's comparison operators. -//***************************************************************************** - -STL_ROUTE_ALL_GLOBALS(CString, CString) diff --git a/STL/tempbuf.cpp b/STL/tempbuf.cpp deleted file mode 100644 index 90760dc5326..00000000000 --- a/STL/tempbuf.cpp +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#include <tempbuf.h> - -char __stl_temp_buffer[__stl_buffer_size]; diff --git a/STL/tempbuf.h b/STL/tempbuf.h deleted file mode 100644 index 84c9f4b2306..00000000000 --- a/STL/tempbuf.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef TEMPBUF_H -#define TEMPBUF_H - -#include <limits.h> -#include <pair.h> - -#ifndef __stl_buffer_size -#define __stl_buffer_size 16384 // 16k -#endif - -extern char __stl_temp_buffer[__stl_buffer_size]; - -//not reentrant code - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class T> -pair<T*, int> get_temporary_buffer(int len, T*) { - while (len > __stl_buffer_size / sizeof(T)) { - set_new_handler(0); - T* tmp = (T*)(::operator new((unsigned int)len * sizeof(T))); - if (tmp) return pair<T*, int>(tmp, len); - len = len / 2; - } - return pair<T*, int>((T*)__stl_temp_buffer, - (int)(__stl_buffer_size / sizeof(T))); -} - -template <class T> -void return_temporary_buffer(T* p) { - if ((char*)(p) != __stl_temp_buffer) deallocate(p); -} - -template <class T> -pair<T*, long> get_temporary_buffer(long len, T* p) { - if (len > INT_MAX/sizeof(T)) - len = INT_MAX/sizeof(T); - pair<T*, int> tmp = get_temporary_buffer((int)len, p); - return pair<T*, long>(tmp.first, (long)(tmp.second)); -} - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/tree.h b/STL/tree.h deleted file mode 100644 index 738223f2fbf..00000000000 --- a/STL/tree.h +++ /dev/null @@ -1,1088 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef TREE_H -#define TREE_H - -/* - -Red-black tree class, designed for use in implementing STL -associative containers (set, multiset, map, and multimap). The -insertion and deletion algorithms are based on those in Cormen, -Leiserson, and Rivest, Introduction to Algorithms (MIT Press, 1990), -except that - -(1) the header cell is maintained with links not only to the root -but also to the leftmost node of the tree, to enable constant time -begin(), and to the rightmost node of the tree, to enable linear time -performance when used with the generic set algorithms (set_union, -etc.); - -(2) when a node being deleted has two children its successor node is -relinked into its place, rather than copied, so that the only -iterators invalidated are those referring to the deleted node. - -*/ - -#include <algobase.h> -#include <iterator.h> -#include <function.h> -#include <bool.h> -#include <projectn.h> - -#ifndef rb_tree -#define rb_tree rb_tree -#endif - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class Key, class Value, class KeyOfValue, class Compare> -class rb_tree { -protected: - enum color_type {red, black}; - typedef Allocator<void>::pointer void_pointer; - struct rb_tree_node; - friend rb_tree_node; - struct rb_tree_node { - color_type color_field; - void_pointer parent_link; - void_pointer left_link; - void_pointer right_link; - Value value_field; - }; - static Allocator<rb_tree_node> rb_tree_node_allocator; - static Allocator<Value> value_allocator; -public: - typedef Key key_type; - typedef Value value_type; - typedef Allocator<Value>::pointer pointer; - typedef Allocator<Value>::reference reference; - typedef Allocator<Value>::const_reference const_reference; - typedef Allocator<rb_tree_node> rb_tree_node_allocator_type; - typedef Allocator<rb_tree_node>::pointer link_type; - typedef Allocator<rb_tree_node>::size_type size_type; - typedef Allocator<rb_tree_node>::difference_type difference_type; -protected: - size_type buffer_size() { - return rb_tree_node_allocator.init_page_size(); - } - struct rb_tree_node_buffer; - friend rb_tree_node_buffer; - struct rb_tree_node_buffer { - void_pointer next_buffer; - link_type buffer; - }; -public: - typedef Allocator<rb_tree_node_buffer> buffer_allocator_type; - typedef Allocator<rb_tree_node_buffer>::pointer buffer_pointer; -protected: - static Allocator<rb_tree_node_buffer> buffer_allocator; -/* - * Changed by Terris - */ - /*static*/ buffer_pointer buffer_list; - /*static*/ link_type free_list; - /*static*/ link_type next_avail; - /*static*/ link_type last; - void add_new_buffer() { - buffer_pointer tmp = buffer_allocator.allocate((size_type)1); - tmp->buffer = rb_tree_node_allocator.allocate(buffer_size()); - tmp->next_buffer = buffer_list; - buffer_list = tmp; - next_avail = buffer_list->buffer; - last = next_avail + buffer_size(); - } -/* - * Changed by Terris - */ - /*static*/ size_type number_of_trees; - void deallocate_buffers(); - link_type get_node() { - link_type tmp = free_list; - return free_list ? - (free_list = (link_type)(free_list->right_link), tmp) - : (next_avail == last ? (add_new_buffer(), next_avail++) - : next_avail++); - // ugly code for inlining - avoids multiple returns - } - void put_node(link_type p) { - p->right_link = free_list; - free_list = p; - } -protected: - link_type header; - link_type& root() { return parent(header); } - link_type& root() const { return parent(header); } - link_type& leftmost() { return left(header); } - link_type& leftmost() const { return left(header); } - link_type& rightmost() { return right(header); } - link_type& rightmost() const { return right(header); } - size_type node_count; // keeps track of size of tree - bool insert_always; // controls whether an element already in the - // tree is inserted again -//public: - Compare key_compare; -/* - * Changed by Terris - */ - /*static*/ link_type NIL; - - static link_type& left(link_type x) { - return (link_type&)((*x).left_link); - } - static link_type& right(link_type x) { - return (link_type&)((*x).right_link); - } - static link_type& parent(link_type x) { - return (link_type&)((*x).parent_link); - } - static reference value(link_type x) { return (*x).value_field; } - static Allocator<Key>::const_reference key(link_type x) { - return KeyOfValue()(value(x)); - } - static color_type& color(link_type x) { - return (color_type&)(*x).color_field; } -/* - * Changed by Terris - * Doesn't need to take "NIL" parameter because everyone who calls this - * uses links only from "this" - */ - /*static*/ link_type minimum(link_type x) { - while (left(x) != NIL) - x = left(x); - return x; - } -/* - * Changed by Terris - */ - /*static*/ link_type maximum(link_type x) { - while (right(x) != NIL) - x = right(x); - return x; - } -public: - class iterator; - friend iterator; - class const_iterator; - friend const_iterator; -/* - * Terris comment: Here is where the iterator class starts. - */ - class iterator : public bidirectional_iterator<Value, difference_type> { - friend class rb_tree<Key, Value, KeyOfValue, Compare>; - friend class const_iterator; -/* - * Added by Terris - */ - link_type NIL; - -/* - friend bool operator==(const iterator& x, const iterator& y) { - return x.node == y.node; - } -*/ - protected: - link_type node; - iterator(link_type x, link_type NIL) : node(x), NIL(NIL) {} - public: -/* - * Changed by Terris - */ - iterator() { NIL = (link_type) NULL; } - bool operator==(const iterator& y) const { return node == y.node; } - reference operator*() const { return value(node); } - iterator& operator++() { - if (right(node) != NIL) { - node = right(node); - while (left(node) != NIL) - node = left(node); - } else { - link_type y = parent(node); - while (node == right(y)) { - node = y; - y = parent(y); - } - if (right(node) != y) // necessary because of rightmost - node = y; - } - return *this; - } - iterator operator++(int) { - iterator tmp = *this; - ++*this; - return tmp; - } - iterator& operator--() { - if (color(node) == red && parent(parent(node)) == node) - // check for header - node = right(node); // return rightmost - else if (left(node) != NIL) { - link_type y = left(node); - while (right(y) != NIL) - y = right(y); - node = y; - } else { - link_type y = parent(node); - while (node == left(y)) { - node = y; - y = parent(y); - } - node = y; - } - return *this; - } - iterator operator--(int) { - iterator tmp = *this; - --*this; - return tmp; - } - }; -/* - * Terris comment: Iterator class ends here - * Terris comment: Const Iterator class starts here - */ - class const_iterator - : public bidirectional_iterator<Value,difference_type> { - friend class rb_tree<Key, Value, KeyOfValue, Compare>; - friend class iterator; -/* - friend bool operator==(const const_iterator& x, const const_iterator& y) { - return x.node == y.node; - } -*/ -/* - * Added by Terris - */ - link_type NIL; - - protected: - link_type node; - const_iterator(link_type x, link_type NIL) : node(x), NIL(NIL) {} - public: -/* - * Changed by Terris - */ - const_iterator() { NIL = (link_type) NULL; } -/* - * Changed by Terris - */ - const_iterator(const iterator& x) : node(x.node), NIL(x.NIL) {} - bool operator==(const const_iterator& y) const { - return node == y.node; - } - bool operator!=(const const_iterator& y) const { - return node != y.node; - } - const_reference operator*() const { return value(node); } - const_iterator& operator++() { - if (right(node) != NIL) { - node = right(node); - while (left(node) != NIL) - node = left(node); - } else { - link_type y = parent(node); - while (node == right(y)) { - node = y; - y = parent(y); - } - if (right(node) != y) // necessary because of rightmost - node = y; - } - return *this; - } - const_iterator operator++(int) { - const_iterator tmp = *this; - ++*this; - return tmp; - } - const_iterator& operator--() { - if (color(node) == red && parent(parent(node)) == node) - // check for header - node = right(node); // return rightmost - else if (left(node) != NIL) { - link_type y = left(node); - while (right(y) != NIL) - y = right(y); - node = y; - } else { - link_type y = parent(node); - while (node == left(y)) { - node = y; - y = parent(y); - } - node = y; - } - return *this; - } - const_iterator operator--(int) { - const_iterator tmp = *this; - --*this; - return tmp; - } - }; -/* - * Terris comment: const_iterator ends here - */ - typedef reverse_bidirectional_iterator<iterator, value_type, reference, - difference_type> - reverse_iterator; - typedef reverse_bidirectional_iterator<const_iterator, value_type, - const_reference, difference_type> - const_reverse_iterator; -private: - iterator __insert(link_type x, link_type y, const value_type& v); -/* - * Changed by Terris - */ - link_type __copy(link_type x, link_type p, link_type nil); - void __erase(link_type x); - void init() { - ++number_of_trees; - if ( NIL == 0 ) { - NIL = get_node(); - color(NIL) = black; - parent(NIL) = 0; - left(NIL) = 0; - right(NIL) = 0; - } - header = get_node(); - color(header) = red; // used to distinguish header from root, - // in iterator.operator++ - root() = NIL; - leftmost() = header; - rightmost() = header; - } -public: - -// allocation/deallocation - -/* - * Changed by Terris - */ - rb_tree(const Compare& comp = Compare(), bool always = true) - : node_count(0), key_compare(comp), insert_always(always), free_list(0), buffer_list(0), next_avail(0), - last(0), number_of_trees(0), NIL(0) { - init(); - } -/* - * Changed by Terris - */ - rb_tree(const value_type* first, const value_type* last, - const Compare& comp = Compare(), bool always = true) - : node_count(0), key_compare(comp), insert_always(always), free_list(0), - buffer_list(0), next_avail(0), last(0), number_of_trees(0), NIL(0) { - init(); - insert(first, last); - } -/* - * Changed by Terris - */ - rb_tree(const rb_tree<Key, Value, KeyOfValue, Compare>& x, - bool always = true) : node_count(x.node_count), - key_compare(x.key_compare), insert_always(always), free_list(0), - buffer_list(0), next_avail(0), last(0), number_of_trees(0), - NIL( 0 ) { -/* - * Added by Terris - */ - init(); -/* - * Changed by Terris - */ - // ++number_of_trees; - // header = get_node(); - // color(header) = red; -/* - * Changed by Terris - */ - root() = __copy(x.root(), header, x.NIL); - if (root() == NIL) { - leftmost() = header; - rightmost() = header; - } else { - leftmost() = minimum(root()); - rightmost() = maximum(root()); - } - } - ~rb_tree() { - erase(begin(), end()); - put_node(header); - if (--number_of_trees == 0) { - put_node(NIL); - NIL = 0; - deallocate_buffers(); - free_list = 0; - next_avail = 0; - last = 0; - } - } - rb_tree<Key, Value, KeyOfValue, Compare>& - operator=(const rb_tree<Key, Value, KeyOfValue, Compare>& x); - -// accessors: - - Compare key_comp() const { return key_compare; } -/* - * Changed by Terris - */ - iterator begin() { return iterator(leftmost(), NIL); } -/* - * Changed by Terris - */ - const_iterator begin() const { return const_iterator(leftmost(), NIL); } -/* - * Changed by Terris - */ - iterator end() { return iterator(header, NIL); } -/* - * Changed by Terris - */ - const_iterator end() const { return const_iterator(header, NIL); } - reverse_iterator rbegin() { return reverse_iterator(end()); } - const_reverse_iterator rbegin() const { - return const_reverse_iterator(end()); - } - reverse_iterator rend() { return reverse_iterator(begin()); } - const_reverse_iterator rend() const { - return const_reverse_iterator(begin()); - } - bool empty() const { return node_count == 0; } - size_type size() const { return node_count; } - size_type max_size() const { - return rb_tree_node_allocator.max_size(); - } - void swap(rb_tree<Key, Value, KeyOfValue, Compare>& t) { - std::swap(header, t.header); - std::swap(node_count, t.node_count); - std::swap(insert_always, t.insert_always); - std::swap(key_compare, t.key_compare); - /* - * Added By Terris - */ - std::swap(NIL, t.NIL); - std::swap(buffer_list, t.buffer_list); - std::swap(free_list, t.free_list); - std::swap(next_avail, t.next_avail); - std::swap(last, t.last); - /* - * Added By Terris - */ - } - -// insert/erase - - typedef pair<iterator, bool> pair_iterator_bool; - // typedef done to get around compiler bug - pair_iterator_bool insert(const value_type& x); - iterator insert(iterator position, const value_type& x); - void insert(iterator first, iterator last); - void insert(const value_type* first, const value_type* last); - void erase(iterator position); - size_type erase(const key_type& x); - void erase(iterator first, iterator last); - void erase(const key_type* first, const key_type* last); - -// set operations: - - iterator find(const key_type& x); - const_iterator find(const key_type& x) const; - size_type count(const key_type& x) const; - iterator lower_bound(const key_type& x); - const_iterator lower_bound(const key_type& x) const; - iterator upper_bound(const key_type& x); - const_iterator upper_bound(const key_type& x) const; - typedef pair<iterator, iterator> pair_iterator_iterator; - // typedef done to get around compiler bug - pair_iterator_iterator equal_range(const key_type& x); - typedef pair<const_iterator, const_iterator> pair_citerator_citerator; - // typedef done to get around compiler bug - pair_citerator_citerator equal_range(const key_type& x) const; - inline void rotate_left(link_type x); - inline void rotate_right(link_type x); -}; - -/* - * Added by Terris - */ -#if 0 -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::buffer_pointer - rb_tree<Key, Value, KeyOfValue, Compare>::buffer_list = 0; - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::link_type - rb_tree<Key, Value, KeyOfValue, Compare>::free_list = 0; - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::link_type - rb_tree<Key, Value, KeyOfValue, Compare>::next_avail = 0; - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::link_type - rb_tree<Key, Value, KeyOfValue, Compare>::last = 0; - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::size_type - rb_tree<Key, Value, KeyOfValue, Compare>::number_of_trees = 0; -/* - * Added by Terris - */ -#endif - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::rb_tree_node_allocator_type - rb_tree<Key, Value, KeyOfValue, Compare>::rb_tree_node_allocator; - -template <class Key, class Value, class KeyOfValue, class Compare> -Allocator<Value> rb_tree<Key, Value, KeyOfValue, Compare>::value_allocator; - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::buffer_allocator_type - rb_tree<Key, Value, KeyOfValue, Compare>::buffer_allocator; - -/* Added by Terris - */ -#if 0 -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::link_type - rb_tree<Key, Value, KeyOfValue, Compare>::NIL = 0; -#endif - -template <class Key, class Value, class KeyOfValue, class Compare> -void rb_tree<Key, Value, KeyOfValue, Compare>::deallocate_buffers() { - while (buffer_list) { - buffer_pointer tmp = buffer_list; - buffer_list = (buffer_pointer)(buffer_list->next_buffer); - rb_tree_node_allocator.deallocate(tmp->buffer); - buffer_allocator.deallocate(tmp); - } -} - -template <class Key, class Value, class KeyOfValue, class Compare> -inline bool operator==(const rb_tree<Key, Value, KeyOfValue, Compare>& x, - const rb_tree<Key, Value, KeyOfValue, Compare>& y) { - return x.size() == y.size() && equal(x.begin(), x.end(), y.begin()); -} - -template <class Key, class Value, class KeyOfValue, class Compare> -inline bool operator<(const rb_tree<Key, Value, KeyOfValue, Compare>& x, - const rb_tree<Key, Value, KeyOfValue, Compare>& y) { - return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>& -rb_tree<Key, Value, KeyOfValue, Compare>:: -operator=(const rb_tree<Key, Value, KeyOfValue, Compare>& x) { - if (this != &x) { - // can't be done as in list because Key may be a constant type - erase(begin(), end()); -/* - * Changed by Terris - */ - root() = __copy(x.root(), header, x.NIL); - if (root() == NIL) { - leftmost() = header; - rightmost() = header; - } else { - leftmost() = minimum(root()); - rightmost() = maximum(root()); - } - node_count = x.node_count; - } - return *this; -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::iterator -rb_tree<Key, Value, KeyOfValue, Compare>:: -__insert(link_type x, link_type y, const Value& v) { - ++node_count; - link_type z = get_node(); - construct(value_allocator.address(value(z)), v); - if (y == header || x != NIL || key_compare(KeyOfValue()(v), key(y))) { - left(y) = z; // also makes leftmost() = z when y == header - if (y == header) { - root() = z; - rightmost() = z; - } else if (y == leftmost()) - leftmost() = z; // maintain leftmost() pointing to minimum node - } else { - right(y) = z; - if (y == rightmost()) - rightmost() = z; // maintain rightmost() pointing to maximum node - } - parent(z) = y; - left(z) = NIL; - right(z) = NIL; - x = z; // recolor and rebalance the tree - color(x) = red; - while (x != root() && color(parent(x)) == red) - if (parent(x) == left(parent(parent(x)))) { - y = right(parent(parent(x))); - if (color(y) == red) { - color(parent(x)) = black; - color(y) = black; - color(parent(parent(x))) = red; - x = parent(parent(x)); - } else { - if (x == right(parent(x))) { - x = parent(x); - rotate_left(x); - } - color(parent(x)) = black; - color(parent(parent(x))) = red; - rotate_right(parent(parent(x))); - } - } else { - y = left(parent(parent(x))); - if (color(y) == red) { - color(parent(x)) = black; - color(y) = black; - color(parent(parent(x))) = red; - x = parent(parent(x)); - } else { - if (x == left(parent(x))) { - x = parent(x); - rotate_right(x); - } - color(parent(x)) = black; - color(parent(parent(x))) = red; - rotate_left(parent(parent(x))); - } - } - color(root()) = black; - return iterator(z, NIL); -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::pair_iterator_bool -rb_tree<Key, Value, KeyOfValue, Compare>::insert(const Value& v) { - link_type y = header; - link_type x = root(); - bool comp = true; - while (x != NIL) { - y = x; - comp = key_compare(KeyOfValue()(v), key(x)); - x = comp ? left(x) : right(x); - } - if (insert_always) - return pair_iterator_bool(__insert(x, y, v), true); - iterator j = iterator(y, NIL); - if (comp) - if (j == begin()) - return pair_iterator_bool(__insert(x, y, v), true); - else - --j; - if (key_compare(key(j.node), KeyOfValue()(v))) - return pair_iterator_bool(__insert(x, y, v), true); - return pair_iterator_bool(j, false); -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::iterator -rb_tree<Key, Value, KeyOfValue, Compare>::insert(iterator position, - const Value& v) { - if (position == iterator(begin())) - if (size() > 0 && key_compare(KeyOfValue()(v), key(position.node))) - return __insert(position.node, position.node, v); - // first argument just needs to be non-NIL - else - return insert(v).first; - else if (position == iterator(end())) - if (key_compare(key(rightmost()), KeyOfValue()(v))) - return __insert(NIL, rightmost(), v); - else - return insert(v).first; - else { - iterator before = --position; - if (key_compare(key(before.node), KeyOfValue()(v)) - && key_compare(KeyOfValue()(v), key(position.node))) - if (right(before.node) == NIL) - return __insert(NIL, before.node, v); - else - return __insert(position.node, position.node, v); - // first argument just needs to be non-NIL - else - return insert(v).first; - } -} - -template <class Key, class Value, class KeyOfValue, class Compare> -void rb_tree<Key, Value, KeyOfValue, Compare>::insert(iterator first, - iterator last) { - while (first != last) insert(*first++); -} - -template <class Key, class Value, class KeyOfValue, class Compare> -void rb_tree<Key, Value, KeyOfValue, Compare>::insert(const Value* first, - const Value* last) { - while (first != last) insert(*first++); -} - -template <class Key, class Value, class KeyOfValue, class Compare> -void rb_tree<Key, Value, KeyOfValue, Compare>::erase(iterator position) { - link_type z = position.node; - link_type y = z; - link_type x; - if (left(y) == NIL) - x = right(y); - else - if (right(y) == NIL) - x = left(y); - else { - y = right(y); - while (left(y) != NIL) - y = left(y); - x = right(y); - } - if (y != z) { // relink y in place of z - parent(left(z)) = y; - left(y) = left(z); - if (y != right(z)) { - parent(x) = parent(y); // possibly x == NIL - left(parent(y)) = x; // y must be a left child - right(y) = right(z); - parent(right(z)) = y; - } else - parent(x) = y; // needed in case x == NIL - if (root() == z) - root() = y; - else if (left(parent(z)) == z) - left(parent(z)) = y; - else - right(parent(z)) = y; - parent(y) = parent(z); - std::swap(color(y), color(z)); - std::swap(y, z); - // y points to node to be actually deleted, - // z points to old z's former successor - } else { // y == z - parent(x) = parent(y); // possibly x == NIL - if (root() == z) - root() = x; - else - if (left(parent(z)) == z) - left(parent(z)) = x; - else - right(parent(z)) = x; - if (leftmost() == z) - if (right(z) == NIL) // left(z) must be NIL also - leftmost() = parent(z); - // makes leftmost() == header if z == root() - else - leftmost() = minimum(x); - if (rightmost() == z) - if (left(z) == NIL) // right(z) must be NIL also - rightmost() = parent(z); - // makes rightmost() == header if z == root() - else // x == left(z) - rightmost() = maximum(x); - } - if (color(y) != red) { - while (x != root() && color(x) == black) - if (x == left(parent(x))) { - link_type w = right(parent(x)); - if (color(w) == red) { - color(w) = black; - color(parent(x)) = red; - rotate_left(parent(x)); - w = right(parent(x)); - } - if (color(left(w)) == black && color(right(w)) == black) { - color(w) = red; - x = parent(x); - } else { - if (color(right(w)) == black) { - color(left(w)) = black; - color(w) = red; - rotate_right(w); - w = right(parent(x)); - } - color(w) = color(parent(x)); - color(parent(x)) = black; - color(right(w)) = black; - rotate_left(parent(x)); - break; - } - } else { // same as then clause with "right" and "left" exchanged - link_type w = left(parent(x)); - if (color(w) == red) { - color(w) = black; - color(parent(x)) = red; - rotate_right(parent(x)); - w = left(parent(x)); - } - if (color(right(w)) == black && color(left(w)) == black) { - color(w) = red; - x = parent(x); - } else { - if (color(left(w)) == black) { - color(right(w)) = black; - color(w) = red; - rotate_left(w); - w = left(parent(x)); - } - color(w) = color(parent(x)); - color(parent(x)) = black; - color(left(w)) = black; - rotate_right(parent(x)); - break; - } - } - color(x) = black; - } - destroy(value_allocator.address(value(y))); - put_node(y); - --node_count; -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::size_type -rb_tree<Key, Value, KeyOfValue, Compare>::erase(const Key& x) { - pair_iterator_iterator p = equal_range(x); - size_type n = 0; - distance(p.first, p.second, n); - erase(p.first, p.second); - return n; -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::link_type -/* - * Changed by Terris - */ -rb_tree<Key, Value, KeyOfValue, Compare>::__copy(link_type x, link_type p, link_type xNIL) { - // structural copy - link_type r = x; - while (x != xNIL) { - link_type y = get_node(); - if (r == x) r = y; // save for return value - construct(value_allocator.address(value(y)), value(x)); - left(p) = y; - parent(y) = p; - color(y) = color(x); -/* - * Changed by Terris - */ - right(y) = __copy(right(x), y, xNIL); - p = y; - x = left(x); - } - left(p) = NIL; -/* - * Changed by Terris - */ - return r == xNIL ? NIL : r; -} - -template <class Key, class Value, class KeyOfValue, class Compare> -void rb_tree<Key, Value, KeyOfValue, Compare>::__erase(link_type x) { - // erase without rebalancing - while (x != NIL) { - __erase(right(x)); - link_type y = left(x); - destroy(value_allocator.address(value(x))); - put_node(x); - x = y; - } -} - -template <class Key, class Value, class KeyOfValue, class Compare> -void rb_tree<Key, Value, KeyOfValue, Compare>::erase(iterator first, - iterator last) { - if (first == begin() && last == end() && node_count != 0) { - __erase(root()); - leftmost() = header; - root() = NIL; - rightmost() = header; - node_count = 0; - } else - while (first != last) erase(first++); -} - -template <class Key, class Value, class KeyOfValue, class Compare> -void rb_tree<Key, Value, KeyOfValue, Compare>::erase(const Key* first, - const Key* last) { - while (first != last) erase(*first++); -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::iterator -rb_tree<Key, Value, KeyOfValue, Compare>::find(const Key& k) { - link_type y = header; - link_type x = root(); - bool comp = false; - while (x != NIL) { - y = x; - comp = key_compare(key(x), k); - x = comp ? right(x) : left(x); - } - iterator j = iterator(y, NIL); - if (comp) ++j; - return (j == end() || key_compare(k, key(j.node))) ? end() : j; -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::const_iterator -rb_tree<Key, Value, KeyOfValue, Compare>::find(const Key& k) const { - link_type y = header; - link_type x = root(); - bool comp = false; - while (x != NIL) { - y = x; - comp = key_compare(key(x), k); - x = comp ? right(x) : left(x); - } - const_iterator j = const_iterator(y, NIL); - if (comp) ++j; - return (j == end() || key_compare(k, key(j.node))) ? end() : j; -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::size_type -rb_tree<Key, Value, KeyOfValue, Compare>::count(const Key& k) const { - pair<const_iterator, const_iterator> p = equal_range(k); - size_type n = 0; - distance(p.first, p.second, n); - return n; -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::iterator -rb_tree<Key, Value, KeyOfValue, Compare>::lower_bound(const Key& k) { - link_type y = header; - link_type x = root(); - bool comp = false; - while (x != NIL) { - y = x; - comp = key_compare(key(x), k); - x = comp ? right(x) : left(x); - } - iterator j = iterator(y, NIL); - return comp ? ++j : j; -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::const_iterator -rb_tree<Key, Value, KeyOfValue, Compare>::lower_bound(const Key& k) const { - link_type y = header; - link_type x = root(); - bool comp = false; - while (x != NIL) { - y = x; - comp = key_compare(key(x), k); - x = comp ? right(x) : left(x); - } - const_iterator j = const_iterator(y, NIL); - return comp ? ++j : j; -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::iterator -rb_tree<Key, Value, KeyOfValue, Compare>::upper_bound(const Key& k) { - link_type y = header; - link_type x = root(); - bool comp = true; - while (x != NIL) { - y = x; - comp = key_compare(k, key(x)); - x = comp ? left(x) : right(x); - } - iterator j = iterator(y, NIL); - return comp ? j : ++j; -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::const_iterator -rb_tree<Key, Value, KeyOfValue, Compare>::upper_bound(const Key& k) const { - link_type y = header; - link_type x = root(); - bool comp = true; - while (x != NIL) { - y = x; - comp = key_compare(k, key(x)); - x = comp ? left(x) : right(x); - } - const_iterator j = const_iterator(y, NIL); - return comp ? j : ++j; -} - - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::pair_iterator_iterator -rb_tree<Key, Value, KeyOfValue, Compare>::equal_range(const Key& k) { - return pair_iterator_iterator(lower_bound(k), upper_bound(k)); -} - -template <class Key, class Value, class KeyOfValue, class Compare> -rb_tree<Key, Value, KeyOfValue, Compare>::pair_citerator_citerator -rb_tree<Key, Value, KeyOfValue, Compare>::equal_range(const Key& k) const { - return pair_citerator_citerator(lower_bound(k), upper_bound(k)); -} - -template <class Key, class Value, class KeyOfValue, class Compare> -inline void -rb_tree<Key, Value, KeyOfValue, Compare>::rotate_left(link_type x) { - link_type y = right(x); - right(x) = left(y); - if (left(y) != NIL) - parent(left(y)) = x; - parent(y) = parent(x); - if (x == root()) - root() = y; - else if (x == left(parent(x))) - left(parent(x)) = y; - else - right(parent(x)) = y; - left(y) = x; - parent(x) = y; -} - -template <class Key, class Value, class KeyOfValue, class Compare> -inline void -rb_tree<Key, Value, KeyOfValue, Compare>::rotate_right(link_type x) { - link_type y = left(x); - left(x) = right(y); - if (right(y) != NIL) - parent(right(y)) = x; - parent(y) = parent(x); - if (x == root()) - root() = y; - else if (x == right(parent(x))) - right(parent(x)) = y; - else - left(parent(x)) = y; - right(y) = x; - parent(x) = y; -} - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif diff --git a/STL/vector.h b/STL/vector.h deleted file mode 100644 index 7e2f11448b2..00000000000 --- a/STL/vector.h +++ /dev/null @@ -1,308 +0,0 @@ -/* - * - * 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 and Microsoft - * Corporation make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ - -#ifndef VECTOR_H -#define VECTOR_H - -#include <function.h> -#include <algobase.h> -#include <bool.h> - -#ifndef Allocator -#define Allocator allocator -#include <defalloc.h> -#endif - -#ifndef vector -#define vector vector -#endif - - -/* - *Added by d:\\convert.pl --begin-- - */ -namespace std { -/* - *Added by d:\\convert.pl --end-- - */ - -template <class T> -class vector { -public: - - typedef Allocator<T> vector_allocator; - typedef T value_type; - typedef vector_allocator::pointer pointer; - typedef vector_allocator::pointer iterator; - typedef vector_allocator::const_pointer const_iterator; - typedef vector_allocator::reference reference; - typedef vector_allocator::const_reference const_reference; - typedef vector_allocator::size_type size_type; - typedef vector_allocator::difference_type difference_type; - typedef reverse_iterator<const_iterator, value_type, const_reference, - difference_type> const_reverse_iterator; - typedef reverse_iterator<iterator, value_type, reference, difference_type> - reverse_iterator; -protected: - static Allocator<T> static_allocator; - iterator start; - iterator finish; - iterator end_of_storage; - void insert_aux(iterator position, const T& x); -public: - iterator begin() { return start; } - const_iterator begin() const { return start; } - iterator end() { return finish; } - const_iterator end() const { return finish; } - reverse_iterator rbegin() { return reverse_iterator(end()); } - const_reverse_iterator rbegin() const { - return const_reverse_iterator(end()); - } - reverse_iterator rend() { return reverse_iterator(begin()); } - const_reverse_iterator rend() const { - return const_reverse_iterator(begin()); - } - size_type size() const { return size_type(end() - begin()); } - size_type max_size() const { return static_allocator.max_size(); } - size_type capacity() const { return size_type(end_of_storage - begin()); } - bool empty() const { return begin() == end(); } - reference operator[](size_type n) { return *(begin() + n); } - const_reference operator[](size_type n) const { return *(begin() + n); } - vector() : start(0), finish(0), end_of_storage(0) {} - /* - * This is cause the VC++ compiler sucks - * and does not recognize nested classes properly - * - * Here is the original: - * vector(size_type n, const T& value = T()) { - * - */ - vector(size_type n, const T& value /* = T() */) { - start = static_allocator.allocate(n); - uninitialized_fill_n(start, n, value); - finish = start + n; - end_of_storage = finish; - } - vector(const vector<T>& x) { - start = static_allocator.allocate(x.end() - x.begin()); - finish = uninitialized_copy(x.begin(), x.end(), start); - end_of_storage = finish; - } - vector(const_iterator first, const_iterator last) { - size_type n = 0; - distance(first, last, n); - start = static_allocator.allocate(n); - finish = uninitialized_copy(first, last, start); - end_of_storage = finish; - } - ~vector() { - destroy(start, finish); - static_allocator.deallocate(start); - } - vector<T>& operator=(const vector<T>& x); - void reserve(size_type n) { - if (capacity() < n) { - iterator tmp = static_allocator.allocate(n); - uninitialized_copy(begin(), end(), tmp); - destroy(start, finish); - static_allocator.deallocate(start); - finish = tmp + size(); - start = tmp; - end_of_storage = begin() + n; - } - } - reference front() { return *begin(); } - const_reference front() const { return *begin(); } - reference back() { return *(end() - 1); } - const_reference back() const { return *(end() - 1); } - void push_back(const T& x) { - if (finish != end_of_storage) { - /* Borland bug */ - construct(finish, x); - finish++; - } else - insert_aux(end(), x); - } - void swap(vector<T>& x) { - std::swap(start, x.start); - std::swap(finish, x.finish); - std::swap(end_of_storage, x.end_of_storage); - } - iterator insert(iterator position, const T& x) { - size_type n = position - begin(); - if (finish != end_of_storage && position == end()) { - /* Borland bug */ - construct(finish, x); - finish++; - } else - insert_aux(position, x); - return begin() + n; - } - void insert (iterator position, const_iterator first, - const_iterator last); - void insert (iterator position, size_type n, const T& x); - void pop_back() { - /* Borland bug */ - --finish; - destroy(finish); - } - void erase(iterator position) { - if (position + 1 != end()) - copy(position + 1, end(), position); - /* Borland bug */ - --finish; - destroy(finish); - } - void erase(iterator first, iterator last) { - vector<T>::iterator i = copy(last, end(), first); - destroy(i, finish); - // work around for destroy(copy(last, end(), first), finish); - finish = finish - (last - first); - } -}; - -template <class T> -inline bool operator==(const vector<T>& x, const vector<T>& y) { - return x.size() == y.size() && equal(x.begin(), x.end(), y.begin()); -} - -template <class T> -inline bool operator<(const vector<T>& x, const vector<T>& y) { - return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); -} - - -template <class T> -vector<T>::vector_allocator vector<T>::static_allocator; - - -template <class T> -vector<T>& vector<T>::operator=(const vector<T>& x) { - if (&x == this) return *this; - if (x.size() > capacity()) { - destroy(start, finish); - static_allocator.deallocate(start); - start = static_allocator.allocate(x.end() - x.begin()); - end_of_storage = uninitialized_copy(x.begin(), x.end(), start); - } else if (size() >= x.size()) { - vector<T>::iterator i = copy(x.begin(), x.end(), begin()); - destroy(i, finish); - // work around for destroy(copy(x.begin(), x.end(), begin()), finish); - } else { - copy(x.begin(), x.begin() + size(), begin()); - uninitialized_copy(x.begin() + size(), x.end(), begin() + size()); - } - finish = begin() + x.size(); - return *this; -} - -template <class T> -void vector<T>::insert_aux(iterator position, const T& x) { - if (finish != end_of_storage) { - construct(finish, *(finish - 1)); - copy_backward(position, finish - 1, finish); - *position = x; - ++finish; - } else { - size_type len = size() ? 2 * size() - : static_allocator.init_page_size(); - iterator tmp = static_allocator.allocate(len); - uninitialized_copy(begin(), position, tmp); - construct(tmp + (position - begin()), x); - uninitialized_copy(position, end(), tmp + (position - begin()) + 1); - destroy(begin(), end()); - static_allocator.deallocate(begin()); - end_of_storage = tmp + len; - finish = tmp + size() + 1; - start = tmp; - } -} - -template <class T> -void vector<T>::insert(iterator position, size_type n, const T& x) { - if (n == 0) return; - if (end_of_storage - finish >= n) { - if (end() - position > n) { - uninitialized_copy(end() - n, end(), end()); - copy_backward(position, end() - n, end()); - fill(position, position + n, x); - } else { - uninitialized_copy(position, end(), position + n); - fill(position, end(), x); - uninitialized_fill_n(end(), n - (end() - position), x); - } - finish += n; - } else { - size_type len = size() + max(size(), n); - iterator tmp = static_allocator.allocate(len); - uninitialized_copy(begin(), position, tmp); - uninitialized_fill_n(tmp + (position - begin()), n, x); - uninitialized_copy(position, end(), tmp + (position - begin() + n)); - destroy(begin(), end()); - static_allocator.deallocate(begin()); - end_of_storage = tmp + len; - finish = tmp + size() + n; - start = tmp; - } -} - -template <class T> -void vector<T>::insert(iterator position, - const_iterator first, - const_iterator last) { - if (first == last) return; - size_type n = 0; - distance(first, last, n); - if (end_of_storage - finish >= n) { - if (end() - position > n) { - uninitialized_copy(end() - n, end(), end()); - copy_backward(position, end() - n, end()); - copy(first, last, position); - } else { - uninitialized_copy(position, end(), position + n); - copy(first, first + (end() - position), position); - uninitialized_copy(first + (end() - position), last, end()); - } - finish += n; - } else { - size_type len = size() + max(size(), n); - iterator tmp = static_allocator.allocate(len); - uninitialized_copy(begin(), position, tmp); - uninitialized_copy(first, last, tmp + (position - begin())); - uninitialized_copy(position, end(), tmp + (position - begin() + n)); - destroy(begin(), end()); - static_allocator.deallocate(begin()); - end_of_storage = tmp + len; - finish = tmp + size() + n; - start = tmp; - } -} - -#undef Allocator -#undef vector - - -/* - *Added by d:\\convert.pl --begin-- - */ -} -/* - *Added by d:\\convert.pl --end-- - */ - -#endif - - |