home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 June / PCFJune.iso / Xenon / C++ / FreeCommandLineTools.exe / Include / vector.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-31  |  43.3 KB  |  1,457 lines

  1. #ifndef __VECTOR_H
  2. #define __VECTOR_H
  3. #pragma option push -b -a8 -pc -Vx- -Ve- -A- -w-inl -w-aus -w-sig
  4. // -*- C++ -*-
  5. /***************************************************************************
  6.  *
  7.  * vector - declarations for the Standard Library vector class
  8.  *
  9.  ***************************************************************************
  10.  *
  11.  * Copyright (c) 1994
  12.  * Hewlett-Packard Company
  13.  *
  14.  * Permission to use, copy, modify, distribute and sell this software
  15.  * and its documentation for any purpose is hereby granted without fee,
  16.  * provided that the above copyright notice appear in all copies and
  17.  * that both that copyright notice and this permission notice appear
  18.  * in supporting documentation.  Hewlett-Packard Company makes no
  19.  * representations about the suitability of this software for any
  20.  * purpose.  It is provided "as is" without express or implied warranty.
  21.  *
  22.  *
  23.  ***************************************************************************
  24.  *
  25.  * Copyright (c) 1994-1999 Rogue Wave Software, Inc.  All Rights Reserved.
  26.  *
  27.  * This computer software is owned by Rogue Wave Software, Inc. and is
  28.  * protected by U.S. copyright laws and other laws and by international
  29.  * treaties.  This computer software is furnished by Rogue Wave Software,
  30.  * Inc. pursuant to a written license agreement and may be used, copied,
  31.  * transmitted, and stored only in accordance with the terms of such
  32.  * license and with the inclusion of the above copyright notice.  This
  33.  * computer software or any other copies thereof may not be provided or
  34.  * otherwise made available to any other person.
  35.  *
  36.  * U.S. Government Restricted Rights.  This computer software is provided
  37.  * with Restricted Rights.  Use, duplication, or disclosure by the
  38.  * Government is subject to restrictions as set forth in subparagraph (c)
  39.  * (1) (ii) of The Rights in Technical Data and Computer Software clause
  40.  * at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
  41.  * Commercial Computer Software รป Restricted Rights at 48 CFR 52.227-19,
  42.  * as applicable.  Manufacturer is Rogue Wave Software, Inc., 5500
  43.  * Flatiron Parkway, Boulder, Colorado 80301 USA.
  44.  *
  45.  **************************************************************************/
  46.  
  47. #ifndef __STD_VECTOR__
  48. #define __STD_VECTOR__
  49.  
  50. #include <stdcomp.h>
  51. #include <rw/stddefs.h> 
  52. #include <rw/rwdispatch.h> 
  53.  
  54. #include <algorithm>
  55. #include <iterator>
  56. #include <memory>
  57. #include <stdexcept>
  58.  
  59. #ifndef vector
  60. #define vector vector
  61. #endif
  62.  
  63. #ifndef _RWSTD_NO_NAMESPACE
  64. namespace std {
  65. #endif
  66.  
  67. //
  68. // Note that _RWSTD_COMPLEX_DEFAULT(x)
  69. // will expand to: ' = x', or nothing,
  70. // depending on your compiler's capabilities and/or
  71. // flag settings (see stdcomp.h).
  72. //
  73.   template <class T, class Allocator _RWSTD_COMPLEX_DEFAULT(allocator<T>) >
  74.   class vector
  75.   {
  76.  
  77.   private:
  78. #if defined( _RWSTD_ALLOCATOR) && !defined(_HPACC_)
  79.     typedef _TYPENAME Allocator::template rebind<T>::other __value_alloc_type;
  80. #else
  81.     typedef allocator_interface<Allocator,T> __value_alloc_type;
  82. #endif
  83.  
  84.   public:
  85.     //
  86.     // Types.
  87.     //
  88.     typedef T                                          value_type;
  89.     typedef Allocator                                  allocator_type;
  90.  
  91. #ifndef _RWSTD_NO_COMPLICATED_TYPEDEF
  92.     typedef _TYPENAME _RWSTD_ALLOC_SIZE_TYPE               size_type;
  93.     typedef _TYPENAME _RWSTD_ALLOC_DIFF_TYPE               difference_type;
  94.     typedef _TYPENAME __value_alloc_type::pointer          iterator;
  95.     typedef _TYPENAME __value_alloc_type::const_pointer    const_iterator;
  96.     typedef _TYPENAME __value_alloc_type::reference        reference;
  97.     typedef _TYPENAME __value_alloc_type::const_reference  const_reference;
  98.     typedef _TYPENAME __value_alloc_type::pointer          pointer;
  99.     typedef _TYPENAME __value_alloc_type::const_pointer    const_pointer;
  100. #else
  101.     typedef size_t          size_type;
  102.     typedef ptrdiff_t       difference_type;
  103.     typedef T*              iterator;
  104.     typedef const T*        const_iterator;
  105.     typedef T&              reference;
  106.     typedef const T&        const_reference;
  107.     typedef T*              pointer;
  108.     typedef const T*        const_pointer;
  109. #endif  //_RWSTD_NO_COMPLICATED_TYPEDEF
  110.  
  111. #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC 
  112.     typedef _RW_STD::reverse_iterator<const_iterator> const_reverse_iterator;
  113.     typedef _RW_STD::reverse_iterator<iterator>  reverse_iterator;
  114. #else
  115.     typedef _RW_STD::reverse_iterator<const_iterator, 
  116.       random_access_iterator_tag, value_type, 
  117.       const_reference, const_pointer, difference_type>
  118.       const_reverse_iterator;
  119.     typedef _RW_STD::reverse_iterator<iterator, 
  120.       random_access_iterator_tag, value_type,
  121.       reference, pointer, difference_type>
  122.       reverse_iterator;
  123. #endif
  124.  
  125. protected:
  126.  
  127.     size_type          __buffer_size;
  128.     iterator           __start;
  129.     iterator           __finish;
  130.     __RWSTD::__rw_basis<iterator,allocator_type>  __end_of_storage;
  131.  
  132.     void __insert_aux (iterator position, const T& x);
  133.     void __insert_aux (iterator position, size_type n, const T& x);
  134. #ifndef _RWSTD_NO_MEMBER_TEMPLATES
  135.     template<class InputIterator>
  136.     void __insert_aux (iterator position, InputIterator first, InputIterator last, _RW_is_not_integer)
  137.     { __insert_aux2 (position, first, last); }
  138.     template<class InputIterator>
  139.     void __insert_aux (iterator position, InputIterator first, InputIterator last, _RW_is_integer)
  140.     { __insert_aux (position, (size_type)first, last); }
  141.     template<class InputIterator>
  142.     void __insert_aux2 (iterator position, InputIterator first, InputIterator last);
  143. #else
  144.     void __insert_aux2 (iterator position, const_iterator first, const_iterator last);
  145. #endif
  146.  
  147.     void __destroy(iterator start, iterator finish)
  148.     {
  149.       while ( start != finish)
  150.         __value_alloc_type(__end_of_storage).destroy(start++);
  151.     }
  152.  
  153.     // 
  154.     //  Allocate buffers and fill with n values
  155.     //
  156.     void __initn(size_type n, const T& value)
  157.     {
  158.       __init();
  159.       __start = __value_alloc_type(__end_of_storage).allocate(n,0);
  160. #ifndef _RWSTD_NO_EXCEPTIONS
  161.       try {
  162.         uninitialized_fill_n(__start, n, value);
  163.       } catch(...) {
  164.         __value_alloc_type(__end_of_storage).deallocate(__start,n);
  165.         throw;
  166.       }      
  167. #else
  168.       uninitialized_fill_n(__start, n, value);
  169. #endif // _RWSTD_NO_EXCEPTIONS
  170.       __finish = __start + n;
  171.       __end_of_storage = __finish;
  172.     } 
  173.  
  174.     void __init() 
  175.     {
  176.       __buffer_size = 
  177.       max((size_type)1,__RWSTD::__rw_allocation_size((value_type*)0,(size_type)0,(size_type)0));
  178.     }
  179.   public:
  180.     //
  181.     // construct/copy/destroy
  182.     //
  183.     _EXPLICIT vector (const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator())) 
  184.       : __start(0), __finish(0), __end_of_storage(0,alloc)
  185.     { 
  186.       __init(); 
  187.     }
  188.  
  189. #ifdef _RWSTD_NO_DEFAULT_TEMPLATE_ARGS
  190.     vector (void) 
  191.       : __start(0), __finish(0), __end_of_storage(0,Allocator())
  192.     { ; }
  193.  
  194.     vector (size_type n, const T& value) 
  195.       : __start(0), __finish(0), __end_of_storage(0,Allocator())
  196.     {
  197.       __initn(n,value);
  198.     }
  199. #endif
  200.  
  201.     _EXPLICIT vector (size_type n)
  202.       : __start(0), __finish(0), __end_of_storage(0,Allocator())
  203.     {
  204.       T value = T();
  205.       __initn(n,value);
  206.     }
  207.  
  208. #ifndef _RWSTD_NO_MEMBER_TEMPLATES
  209.  
  210.     template<class InputIterator>
  211.     void __init_aux (InputIterator first, InputIterator last, _RW_is_not_integer)
  212.     {
  213.       if (__is_input_iterator(__iterator_category(first))) {
  214.     copy(first, last, back_inserter(*this));
  215.       } else {
  216.     size_type n;
  217.     __init(); 
  218.     __initialize(n, size_type(0));
  219.     distance(first, last, n);
  220.     __start = __value_alloc_type(__end_of_storage).allocate(n,0);
  221. #ifndef _RWSTD_NO_EXCEPTIONS
  222.     try {
  223.       __finish = uninitialized_copy(first, last, __start);
  224.     } catch(...) {
  225.       __value_alloc_type(__end_of_storage).deallocate(__start,n);
  226.       throw;
  227.     }      
  228. #else
  229.     __finish = uninitialized_copy(first, last, __start);
  230. #endif // _RWSTD_NO_EXCEPTIONS
  231.     __end_of_storage = __finish;
  232.       }
  233.     }
  234.     template<class InputIterator>
  235.     void __init_aux (InputIterator first, InputIterator last, _RW_is_integer)
  236.     { __initn((size_type)first,last); }
  237.  
  238.     template<class InputIterator>
  239.     vector (InputIterator first, InputIterator last,
  240.             const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
  241.       : __start(0), __finish(0), __end_of_storage(0,alloc)
  242.     {
  243.         typedef _TYPENAME _RWdispatch<InputIterator>::_RWtype _RWtype;
  244.         __init_aux(first, last, _RWtype());
  245.     }
  246.     vector (size_type n, const T& value,
  247.             const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
  248.       : __start(0), __finish(0), __end_of_storage(0,alloc)
  249.     { __initn((size_type)n,value); }
  250. #else
  251.     //
  252.     // Build a vector of size n with each element set to copy of value.
  253.     //
  254.     vector (size_type n, const T& value,
  255.             const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
  256.       : __start(0), __finish(0), __end_of_storage(0,alloc)
  257.     {
  258.       __initn(n,value);
  259.     }
  260.  
  261.     vector (const_iterator first, const_iterator last,
  262.             const Allocator& alloc _RWSTD_DEFAULT_ARG(Allocator()))
  263.       : __start(0), __finish(0), __end_of_storage(0,alloc)
  264.     {
  265.       size_type n;
  266.       __init(); 
  267.       __initialize(n, size_type(0));
  268.       distance(first, last, n);
  269.       __start = __value_alloc_type(__end_of_storage).allocate(n,0);
  270. #ifndef _RWSTD_NO_EXCEPTIONS
  271.       try {
  272.         __finish = uninitialized_copy(first, last, __start);
  273.       } catch(...) {
  274.         __value_alloc_type(__end_of_storage).deallocate(__start,n);
  275.         throw;
  276.       }      
  277. #else
  278.       __finish = uninitialized_copy(first, last, __start);
  279. #endif // _RWSTD_NO_EXCEPTIONS
  280.       __end_of_storage = __finish;
  281.     }
  282.  
  283. #ifdef _RWSTD_NO_DEFAULT_TEMPLATE_ARGS
  284.     vector (const_iterator first, const_iterator last)
  285.       : __start(0), __finish(0), __end_of_storage(0,Allocator())
  286.     {
  287.       size_type n;
  288.       __init(); 
  289.       __initialize(n, size_type(0));
  290.       distance(first, last, n);
  291.       __start = __value_alloc_type(__end_of_storage).allocate(n,0);
  292. #ifndef _RWSTD_NO_EXCEPTIONS
  293.       try {
  294.         __finish = uninitialized_copy(first, last, __start);
  295.       } catch(...) {
  296.         __value_alloc_type(__end_of_storage).deallocate(__start,n);
  297.         throw;
  298.       }      
  299. #else
  300.       __finish = uninitialized_copy(first, last, __start);
  301. #endif //  _RWSTD_NO_EXCEPTIONS
  302.       __end_of_storage = __finish;
  303.     }
  304. #endif // _RWSTD_NO_DEFAULT_TEMPLATE_ARGS
  305. #endif // _RWSTD_NO_MEMBER_TEMPLATES
  306.  
  307.     vector (const vector<T,Allocator>& x)
  308.       : __start(0), __finish(0), __end_of_storage(0,x.get_allocator())
  309.     {
  310.       __init(); 
  311.       __start = __value_alloc_type(__end_of_storage).allocate(x.end() - x.begin(),0);
  312.       __finish = uninitialized_copy(x.begin(), x.end(), __start);
  313.       __end_of_storage = __finish;
  314.     }
  315.  
  316.     ~vector ()
  317.     { 
  318.       __destroy(__start, __finish); 
  319.       __value_alloc_type(__end_of_storage).deallocate(__start,__end_of_storage.data()-__start);
  320.     }
  321.  
  322.     vector<T,Allocator>& operator= (const vector<T,Allocator>& x);
  323.  
  324. #ifndef _RWSTD_NO_MEMBER_TEMPLATES
  325.     template<class InputIterator>
  326.     void assign (InputIterator first, InputIterator last)
  327.     {
  328.         erase(begin(), end());
  329.         typedef _TYPENAME _RWdispatch<InputIterator>::_RWtype _RWtype;
  330.         __insert_aux(begin(), first, last, _RWtype());
  331.     }
  332.     void assign (size_type n, const T& t)
  333.     {
  334.         erase(begin(), end()); insert(begin(), n, t);
  335.     }
  336. #else
  337.     void assign (const_iterator first, const_iterator last)
  338.     { erase(begin(), end()); insert(begin(), first, last); }
  339.     //
  340.     // Assign n copies of t to this vector.
  341.     //
  342.     void assign (size_type n, const T& t)
  343.     { erase(begin(), end()); insert(begin(), n, t); }
  344. #endif // _RWSTD_NO_MEMBER_TEMPLATES
  345.  
  346.     allocator_type get_allocator() const
  347.     {
  348.       return (allocator_type)__end_of_storage;
  349.     }
  350.  
  351.     //
  352.     // Iterators.
  353.     //
  354.     iterator       begin ()       { return __start;  }
  355.     const_iterator begin () const { return __start;  }
  356.     iterator       end ()         { return __finish; }
  357.     const_iterator end ()   const { return __finish; }
  358.  
  359.     reverse_iterator rbegin ()
  360.     { 
  361.       reverse_iterator tmp(end()); return tmp;
  362.     }
  363.     const_reverse_iterator rbegin () const
  364.     { 
  365.       const_reverse_iterator tmp(end()); return tmp;
  366.     }
  367.     reverse_iterator rend ()
  368.     { 
  369.       reverse_iterator tmp(begin()); return tmp;
  370.     }
  371.     const_reverse_iterator rend () const
  372.     { 
  373.       const_reverse_iterator tmp(begin()); return tmp;
  374.     }
  375.  
  376.     //
  377.     // Capacity.
  378.     //
  379.     size_type size ()     const { return size_type(end() - begin()); }
  380.     size_type max_size () const { return __value_alloc_type(__end_of_storage).max_size();   }
  381.     void resize (size_type new_size);
  382.     void resize (size_type new_size, T value);
  383.  
  384.     size_type capacity () const { return size_type(__end_of_storage.data() - begin()); }
  385.     bool      empty ()    const { return begin() == end();                    }
  386.     void reserve (size_type n)
  387.     {
  388.       _RWSTD_THROW(n > max_size(), length_error,
  389.         __RWSTD::except_msg_string(__RWSTD::__rwse_InvalidSizeParam,
  390.           "vector::reserve(size_t)",n,max_size()).msgstr());
  391.  
  392.       if (capacity() < n)
  393.       {
  394.         __value_alloc_type va(__end_of_storage);
  395.         iterator tmp = va.allocate(n,__start);
  396. #ifndef _RWSTD_NO_EXCEPTIONS
  397.         try {
  398.           uninitialized_copy(begin(), end(), tmp);
  399.         } catch(...) {
  400.           __value_alloc_type(__end_of_storage).deallocate(tmp,n);
  401.           throw;
  402.         }
  403. #else
  404.         uninitialized_copy(begin(), end(), tmp);
  405. #endif // _RWSTD_NO_EXCEPTIONS
  406.         __destroy(__start, __finish);
  407.         va.deallocate(__start,__end_of_storage.data()-__start);
  408.         __finish = tmp + size();
  409.         __start = tmp;
  410.         __end_of_storage = begin() + n;
  411.       }
  412.     }
  413.  
  414.     //
  415.     // Element access.
  416.     //
  417.     reference       operator[] (size_type n)       
  418.     {
  419. #ifdef _RWSTD_BOUNDS_CHECKING
  420.       _RWSTD_THROW(n >= size(), out_of_range,
  421.         __RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
  422.           "vector::operator[](size_t)",n,size()).msgstr());
  423. #endif
  424.       return *(begin() + n);
  425.  
  426.     }
  427.   
  428.     const_reference operator[] (size_type n) const 
  429.     {
  430. #ifdef _RWSTD_BOUNDS_CHECKING
  431.       _RWSTD_THROW(n >= size(), out_of_range,
  432.         __RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
  433.           "vector::operator[](size_t) const",n,size()).msgstr());
  434. #endif
  435.       return *(begin() + n);
  436.     }
  437.   
  438.     reference       at (size_type n)               
  439.     { 
  440.       _RWSTD_THROW(n >= size(), out_of_range,
  441.         __RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
  442.           "vector:: at(size_t)",n,size()).msgstr());
  443.       return *(begin() + n); 
  444.     }
  445.     const_reference at (size_type n)  const 
  446.     { 
  447.       _RWSTD_THROW(n >= size(), out_of_range,
  448.         __RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
  449.           "vector:: at(size_t) const",n,size()).msgstr());
  450.       return *(begin() + n); 
  451.     }
  452.     reference       front ()                       { return *begin();       }
  453.     const_reference front ()                 const { return *begin();       }
  454.     reference       back ()                        { return *(end() - 1);   }
  455.     const_reference back ()                  const { return *(end() - 1);   }
  456.  
  457.     //
  458.     // Modifiers.
  459.     //
  460.     void push_back (const T& x)
  461.     {
  462.       if (__finish != __end_of_storage.data())
  463.       {
  464.         __value_alloc_type(__end_of_storage).construct(__finish, x); 
  465.         __finish++;
  466.       }
  467.       else
  468.         __insert_aux(end(), x);
  469.     }
  470.     void pop_back()
  471.     {
  472.       --__finish; 
  473.       __value_alloc_type(__end_of_storage).destroy(__finish);
  474.     }
  475.  
  476.     //
  477.     // Insert x at position.
  478.     //
  479.     iterator insert (iterator position, const T& x)
  480.     {
  481.       size_type n = position - begin();
  482.       if (__finish != __end_of_storage.data() && position == end())
  483.       {
  484.         __value_alloc_type(__end_of_storage).construct(__finish, x); __finish++;
  485.       }
  486.       else
  487.         __insert_aux(position, x);
  488.       return begin() + n;
  489.     }
  490.  
  491. #ifndef _RWSTD_NO_MEMBER_TEMPLATES
  492.     template<class InputIterator>
  493.     void insert (iterator position, InputIterator first, 
  494.                  InputIterator last)
  495.     {
  496.         typedef _TYPENAME _RWdispatch<InputIterator>::_RWtype _RWtype;
  497.         __insert_aux(position, first, last, _RWtype());
  498.     }
  499.     void insert (iterator position, size_type n, const T& value)
  500.     { __insert_aux(position,n,value); }
  501. #else
  502.     void insert (iterator position, size_type n, const T& x)
  503.     { __insert_aux(position,n,x); }
  504.     void insert (iterator position, const_iterator first, const_iterator last)
  505.     { __insert_aux2(position, first, last); }
  506. #endif // _RWSTD_NO_MEMBER_TEMPLATES
  507.  
  508.     iterator erase (iterator position)
  509.     {
  510.       if (position + 1 != end()) 
  511.         copy(position + 1, end(), position);
  512.       --__finish;
  513.       __value_alloc_type(__end_of_storage).destroy(__finish);
  514.       return position;
  515.     }
  516.     iterator erase (iterator first, iterator last)
  517.     {
  518.       iterator i = copy(last, end(), first);
  519.       iterator tmp = __finish;
  520.       __finish = __finish - (last - first); 
  521.       __destroy(i, tmp);
  522.       return first;
  523.     }
  524.  
  525.     void swap (vector<T,Allocator>& x)
  526.     {
  527.       if((allocator_type)__end_of_storage==(allocator_type)x.__end_of_storage)
  528.       {
  529. #ifndef _RWSTD_NO_NAMESPACE
  530.         std::swap(__start, x.__start);
  531.         std::swap(__finish, x.__finish);
  532.         std::swap(__end_of_storage, x.__end_of_storage);
  533. #else
  534.         ::swap(__start, x.__start);
  535.         ::swap(__finish, x.__finish);
  536.         ::swap(__end_of_storage, x.__end_of_storage);
  537. #endif // _RWSTD_NO_NAMESPACE
  538.       }
  539.       else
  540.       {
  541.         vector<T,Allocator> _x = *this;
  542.         *this = x;
  543.         x=_x;
  544.       } 
  545.     }
  546.  
  547.     void clear()
  548.     {
  549.       erase(begin(),end());
  550.     }
  551.  
  552. #ifndef _RWSTD_STRICT_ANSI
  553.     // Non-standard function for setting buffer allocation size
  554.     size_type allocation_size() { return __buffer_size; }
  555.     size_type allocation_size(size_type new_size) 
  556.     { 
  557.       size_type tmp = __buffer_size; 
  558.       __buffer_size = max((size_type)1,new_size);
  559.       return tmp;
  560.     }
  561. #endif  // _RWSTD_STRICT_ANSI
  562.   };
  563.  
  564.   template <class T, class Allocator>
  565.   inline bool operator== (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
  566.   {
  567.     return x.size() == y.size() && equal(x.begin(), x.end(), y.begin());
  568.   }
  569.  
  570.   template <class T, class Allocator>
  571.   inline bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
  572.   {
  573.     return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
  574.   }
  575.  
  576. #if !defined(_RWSTD_NO_NAMESPACE) || !defined(_RWSTD_NO_PART_SPEC_OVERLOAD)
  577.   template <class T, class Allocator>
  578.   inline bool operator!= (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
  579.   {
  580.     return !(x == y);
  581.   }
  582.  
  583.   template <class T, class Allocator>
  584.   inline bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
  585.   {
  586.     return y < x;
  587.   }
  588.  
  589.   template <class T, class Allocator>
  590.   inline bool operator>= (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
  591.   {
  592.     return !(x < y);
  593.   }
  594.  
  595.   template <class T, class Allocator>
  596.   inline bool operator<= (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
  597.   {
  598.     return !(y <  x);
  599.   }
  600.  
  601.   template <class T, class Allocator>
  602.   inline void swap(vector<T,Allocator>& a, vector<T,Allocator>& b)
  603.   {
  604.     a.swap(b);
  605.   }
  606. #endif // !defined(_RWSTD_NO_NAMESPACE) || !defined(_RWSTD_NO_PART_SPEC_OVERLOAD)
  607. #if defined (_RWSTD_NO_TEMPLATE_REPOSITORY) && defined (__BORLANDC__) && (__TURBOC__ < 0x540)
  608. #ifndef _RWSTD_NO_NAMESPACE
  609. }
  610. #endif
  611.  
  612. #include <vector.cc>
  613.  
  614. #ifndef _RWSTD_NO_NAMESPACE
  615. namespace std {
  616. #endif
  617.  
  618. #endif // (_RWSTD_NO_TEMPLATE_REPOSITORY) && defined (__BORLANDC__)
  619.  
  620. //
  621. // If bool is a builtin type, we provide a vector<bool,allocator> specialization.
  622. // We do not provide the allocator interface for this specialization.
  623. //
  624. #ifndef _RWSTD_NO_BOOL
  625.  
  626. #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
  627.  
  628.   template <class Allocator>
  629.   class _RWSTDExport vector<bool, Allocator >
  630.   {
  631.  
  632. #else
  633.  
  634. // Use a macro to mutate Allocator into allocator<bool>
  635. #define Allocator allocator<bool>
  636.  
  637.   _RWSTD_TEMPLATE
  638.   class _RWSTDExport vector<bool, allocator<bool> >
  639.   {
  640.  
  641. #endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
  642.  
  643.   public:  
  644.     //
  645.     // types
  646.     //
  647.     typedef Allocator                                 allocator_type;
  648.     typedef bool                                      value_type;
  649.  
  650.   private:
  651. #if defined ( _RWSTD_ALLOCATOR) && !defined(_HPACC_)
  652. #ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
  653.     typedef _TYPENAME allocator_type::template rebind<unsigned int>::other __value_alloc_type;
  654. #else
  655.     typedef allocator_type::template rebind<unsigned int>::other __value_alloc_type;
  656. #endif
  657. #else
  658.     typedef allocator_interface<allocator_type,unsigned int> __value_alloc_type;
  659. #endif
  660.  
  661.   public:
  662. #ifdef _RWSTD_NO_EMBEDDED_TYPEDEF
  663.     typedef allocator<bool>::size_type               size_type;
  664.     typedef allocator<bool>::difference_type         difference_type;
  665. #else
  666. #ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
  667.     typedef allocator_type::size_type          size_type;
  668.     typedef allocator_type::difference_type    difference_type;
  669. #else
  670.     typedef _TYPENAME allocator_type::size_type          size_type;
  671.     typedef _TYPENAME allocator_type::difference_type    difference_type;
  672. #endif
  673. #endif
  674.  
  675.   protected:
  676. #ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
  677.     typedef __value_alloc_type::pointer       pointer;
  678.     typedef __value_alloc_type::const_pointer const_pointer;
  679. #else
  680.     typedef _TYPENAME __value_alloc_type::pointer       pointer;
  681.     typedef _TYPENAME __value_alloc_type::const_pointer const_pointer;
  682. #endif
  683.  
  684.   public:
  685.  
  686.     //
  687.     // forward declarations
  688.     //
  689.     class iterator;
  690.     class const_iterator;
  691.  
  692.     //
  693.     // bit reference
  694.     //
  695.     class reference
  696.     {
  697.       friend class iterator;
  698.       friend class const_iterator;
  699.     protected:
  700.       unsigned int* p;
  701.       unsigned int mask;
  702.       reference (unsigned int* x, unsigned int y) : p(x), mask(y) {}
  703.     public:
  704.       reference () : p(0), mask(0) {}
  705.       operator bool () const { return !(!(*p & mask)); }
  706.       reference& operator= (bool x)
  707.       {
  708.         if (x)      
  709.           *p |= mask;
  710.         else
  711.           *p &= ~mask;
  712.         return *this;
  713.       }
  714.       reference& operator= (const reference& x) { return *this = bool(x); }
  715.  
  716. #ifndef _RWSTD_STRICT_ANSI
  717.       bool operator== (const reference& x) const
  718.       {
  719.         return bool(*this) == bool(x);
  720.       }
  721.       bool operator< (const reference& x) const
  722.       {
  723. #if !defined(_MSC_VER) || defined(__BORLANDC__)
  724.         return bool(*this) < bool(x);
  725. #else
  726.         return int(*this) < int(x);
  727. #endif
  728.       }
  729.       bool operator!= (const reference& x) const
  730.       {
  731.         return !(*this == x);
  732.       }
  733.       bool operator> (const reference& x) const
  734.       {
  735.         return  x < *this;
  736.       }
  737.       bool operator>= (const reference& x) const
  738.       {
  739.         return !(*this < x);
  740.       }
  741.       bool operator<= (const reference& x) const
  742.       {
  743.         return !(*this > x);
  744.       }
  745. #endif // _RWSTD_STRICT_ANSI
  746.  
  747.       void flip () { *p ^= mask; }
  748.     };
  749.     
  750.     typedef bool const_reference;
  751.     //
  752.     // Definition of our iterator.
  753.     //
  754.     class iterator : public _RW_STD::iterator<random_access_iterator_tag,
  755.                                      value_type, difference_type,
  756.                                      pointer,reference>
  757.     {
  758. #if !defined(_RWSTD_NO_CLASS_PARTIAL_SPEC)
  759.       friend class vector<bool,Allocator>;
  760. #else
  761.       friend class vector<bool,allocator<bool> >;
  762. #endif
  763.       friend class const_iterator;
  764.  
  765.     protected:
  766.  
  767.       unsigned int* p;
  768.       unsigned int  offset;
  769.  
  770.       void __bump_up ()
  771.       {
  772.         if (offset++ == _RWSTD_WORD_BIT - 1)
  773.         {
  774.           offset = 0; ++p;
  775.         }
  776.       }
  777.       void __bump_down ()
  778.       {
  779.         if (offset-- == 0)
  780.         {
  781.           offset = _RWSTD_WORD_BIT - 1; --p;
  782.         }
  783.       }
  784.  
  785.     public:
  786.       iterator () : p(0), offset(0) {}
  787.       iterator (unsigned int* x, unsigned int y) : p(x), offset(y) {}
  788.  
  789.       reference operator* () const { return reference(p, 1U << offset); }
  790.       iterator& operator++ ()
  791.       {
  792.         __bump_up(); return *this;
  793.       }
  794.       iterator operator++ (int)
  795.       {
  796.         iterator tmp = *this; __bump_up(); return tmp;
  797.       }
  798.       iterator& operator-- ()
  799.       {
  800.         __bump_down(); return *this;
  801.       }
  802.       iterator operator-- (int)
  803.       {
  804.         iterator tmp = *this; __bump_down(); return tmp;
  805.       }
  806.       iterator& operator+= (difference_type i)
  807.       {
  808.         difference_type n = i + offset;
  809.         p += n / _RWSTD_WORD_BIT;
  810.         n = n % _RWSTD_WORD_BIT;
  811.         if (n < 0)
  812.         {
  813.           offset = n + _RWSTD_WORD_BIT; --p;
  814.         }
  815.         else
  816.           offset = n;
  817.         return *this;
  818.       }
  819.       iterator& operator-= (difference_type i)
  820.       {
  821.         *this += -i; return *this;
  822.       }
  823.       iterator operator+ (difference_type i) const
  824.       {
  825.         iterator tmp = *this; return tmp += i;
  826.       }
  827.       iterator operator- (difference_type i) const
  828.       {
  829.         iterator tmp = *this; return tmp -= i;
  830.       }
  831.       difference_type operator- (iterator x) const
  832.       {
  833.         return _RWSTD_WORD_BIT * (p - x.p) + offset - x.offset;
  834.       }
  835.       reference operator[] (difference_type i)
  836.       {
  837.         return *(*this + i);
  838.       }
  839.       bool operator== (const iterator& x) const
  840.       {
  841.         return p == x.p && offset == x.offset;
  842.       }
  843.       bool operator< (const iterator& x) const
  844.       {
  845.         return p < x.p || (p == x.p && offset < x.offset);
  846.       }
  847.       bool operator!= (const iterator& x) const
  848.       {
  849.         return !(*this == x);
  850.       }
  851.       bool operator> (const iterator& x) const
  852.       {
  853.         return x < *this;
  854.       }
  855.       bool operator>= (const iterator& x) const
  856.       {
  857.         return !(*this < x);
  858.       }
  859.       bool operator<= (const iterator& x) const
  860.       {
  861.         return !(*this > x);
  862.       }
  863.     };
  864.     //
  865.     // Definition of our const_iterator.
  866.     //
  867.     class const_iterator
  868.       : public _RW_STD::iterator<random_access_iterator_tag,
  869.                         value_type, difference_type, 
  870.                         const_pointer, const_reference>
  871.     {
  872. #if !defined(_RWSTD_NO_CLASS_PARTIAL_SPEC)
  873.       friend class vector<bool,Allocator>;
  874. #else
  875.       friend class vector<bool,allocator<bool> >;
  876. #endif
  877.  
  878.     protected:
  879.  
  880.       unsigned int* p;
  881.       unsigned int offset;
  882.       void  __bump_up ()
  883.       {
  884.         if (offset++ == _RWSTD_WORD_BIT - 1)
  885.         {
  886.           offset = 0; ++p;
  887.         }
  888.       }
  889.       void __bump_down()
  890.       {
  891.         if (offset-- == 0)
  892.         {
  893.           offset = _RWSTD_WORD_BIT - 1; --p;
  894.         }
  895.       }
  896.  
  897.     public:
  898.       const_iterator () : p(0), offset(0) {}
  899.       const_iterator (unsigned int* x, unsigned int y) : p(x), offset(y) {}
  900. #if !defined(_MSC_VER) || defined(__BORLANDC__)
  901. #ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
  902.       const_iterator (const vector<bool,Allocator>::iterator& x) : p(x.p), offset(x.offset) {}
  903. #else
  904.       const_iterator (const _TYPENAME vector<bool,Allocator>::iterator& x) : p(x.p), offset(x.offset) {}
  905. #endif
  906. #else
  907.       const_iterator (const iterator& x) : p(x.p), offset(x.offset) {}
  908. #endif
  909.       const_reference operator* () const
  910.       {
  911.         return vector<bool,Allocator>::reference(p, 1U << offset);
  912.       }
  913.       const_iterator& operator++ ()
  914.       {
  915.         __bump_up(); return *this;
  916.       }
  917.       const_iterator operator++ (int)
  918.       {
  919.         const_iterator tmp = *this; __bump_up(); return tmp;
  920.       }
  921.       const_iterator& operator-- ()
  922.       {
  923.         __bump_down(); return *this;
  924.       }
  925.       const_iterator operator-- (int)
  926.       {
  927.         const_iterator tmp = *this; __bump_down(); return tmp;
  928.       }
  929.       const_iterator& operator+= (difference_type i)
  930.       {
  931.         difference_type n = i + offset;
  932.         p += n / _RWSTD_WORD_BIT;
  933.         n = n % _RWSTD_WORD_BIT;
  934.         if (n < 0)
  935.         {
  936.           offset = n + _RWSTD_WORD_BIT; --p;
  937.         }
  938.         else
  939.           offset = n;
  940.         return *this;
  941.       }
  942.       const_iterator& operator-= (difference_type i)
  943.       {
  944.         *this += -i; return *this;
  945.       }
  946.       const_iterator operator+ (difference_type i) const
  947.       {
  948.         const_iterator tmp = *this; return tmp += i;
  949.       }
  950.       const_iterator operator- (difference_type i) const
  951.       {
  952.         const_iterator tmp = *this; return tmp -= i;
  953.       }
  954.       difference_type operator- (const_iterator x) const
  955.       {
  956.         return _RWSTD_WORD_BIT * (p - x.p) + offset - x.offset;
  957.       }
  958.       const_reference operator[] (difference_type i)
  959.       { 
  960.         return *(*this + i); 
  961.       }
  962.       bool operator== (const const_iterator& x) const
  963.       {
  964.         return p == x.p && offset == x.offset;
  965.       }
  966.       bool operator< (const const_iterator& x) const
  967.       {
  968.         return p < x.p || (p == x.p && offset < x.offset);
  969.       }
  970.       bool operator!= (const const_iterator& x) const
  971.       {
  972.         return !(*this == x);
  973.       }
  974.       bool operator> (const const_iterator& x) const
  975.       {
  976.         return x < *this;
  977.       }
  978.       bool operator>= (const const_iterator& x) const
  979.       {
  980.         return !(*this < x);
  981.       }
  982.       bool operator<= (const const_iterator& x) const
  983.       {
  984.         return !(*this > x);
  985.       }
  986.     };
  987.     //
  988.     // types
  989.     //
  990. #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC 
  991.     typedef _RW_STD::reverse_iterator<const_iterator> const_reverse_iterator;
  992.     typedef _RW_STD::reverse_iterator<iterator>  reverse_iterator;
  993. #else
  994.     typedef _RW_STD::reverse_iterator<const_iterator, 
  995.       random_access_iterator_tag, value_type, 
  996.       const_reference, const_pointer, difference_type>
  997.       const_reverse_iterator;
  998.     typedef _RW_STD::reverse_iterator<iterator, 
  999.       random_access_iterator_tag, value_type,
  1000.       reference, pointer, difference_type>
  1001.       reverse_iterator;
  1002. #endif
  1003.  
  1004.   private:
  1005.     //
  1006.     // These private functions are replicas of generic algorithms.
  1007.     //  We provide them here to avoid putting instantiations of 
  1008.     //  the generic algorithms into an archive or shared library.
  1009.     //  This gives you full flexibilty in deciding where you want
  1010.     //  to put particular instantiations of the generic 
  1011.     //  algorithms.
  1012.     //
  1013.   
  1014.     void __fill (iterator first, iterator last, 
  1015.                const bool& value)
  1016.     {
  1017.       while (first != last) *first++ = value;
  1018.     }
  1019.     void __fill_n (iterator first, size_type n,
  1020.                  const bool& value)
  1021.     {
  1022.       while (n-- > 0) *first++ = value;
  1023.     }
  1024. #ifndef _RWSTD_NO_MEMBER_TEMPLATES
  1025.     template <class Iterator>
  1026.     iterator __copy (Iterator first, Iterator last,
  1027.                    iterator result)
  1028.     {
  1029.       while (first != last) *result++ = *first++;
  1030.       return result;
  1031.     }
  1032.     template <class Iterator>
  1033.     iterator __copy_backward (Iterator first, Iterator last,
  1034.                             iterator result)
  1035.     {
  1036.       while (first != last) *--result = *--last;
  1037.       return result;
  1038.     }
  1039. #else
  1040.     iterator __copy (const_iterator first, const_iterator last,
  1041.                    iterator result)
  1042.     {
  1043.       while (first != last) *result++ = *first++;
  1044.       return result;
  1045.     }
  1046.     iterator __copy (const bool* first, const bool* last,
  1047.                    iterator result)
  1048.     {
  1049.       while (first != last) *result++ = *first++;
  1050.       return result;
  1051.     }
  1052.     iterator __copy_backward (const_iterator first, const_iterator last,
  1053.                             iterator result)
  1054.     {
  1055.       while (first != last) *--result = *--last;
  1056.       return result;
  1057.     }
  1058.     iterator __copy_backward (const bool* first, const bool* last,
  1059.                             iterator result)
  1060.     {
  1061.       while (first != last) *--result = *--last;
  1062.       return result;
  1063.     }
  1064. #endif
  1065.  
  1066.   protected:
  1067.  
  1068.     iterator                __start;
  1069.     iterator                __finish;
  1070.     __RWSTD::__rw_basis<unsigned int*,allocator_type>   __end_of_storage;
  1071.  
  1072.     unsigned int* __bit_alloc (size_type n)
  1073.     {
  1074.       return __value_alloc_type(__end_of_storage).allocate((n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT,__start.p);
  1075.     }
  1076.     void __init (size_type n)
  1077.     {
  1078.       unsigned int* q = __bit_alloc(n);
  1079.       __end_of_storage = q + (n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
  1080.       __start = iterator(q, 0);
  1081.       __finish = __start + n;
  1082.     }
  1083.     void __insert_aux (iterator position, bool x);
  1084.  
  1085.   public:
  1086.  
  1087.     //
  1088.     // construct/copy/destroy
  1089.     //
  1090.     vector<bool,Allocator> (const Allocator&  alloc _RWSTD_DEFAULT_ARG(Allocator()))
  1091.       : __start(iterator()), __finish(iterator()), 
  1092.         __end_of_storage(0,alloc)
  1093.     { ; }
  1094.     _EXPLICIT vector<bool,Allocator> (size_type n, bool value = bool(), 
  1095.        const Allocator&  alloc _RWSTD_DEFAULT_ARG(Allocator()))
  1096.       : __end_of_storage(0,alloc)
  1097.     {
  1098.       __init(n); 
  1099.       unsigned int * first = __start.p;
  1100.       size_type m = (n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
  1101.       while (m-- > 0) *first++ = value ? ~0 : 0;
  1102.     }
  1103.  
  1104.     vector<bool,Allocator> (const vector<bool,Allocator >& x)
  1105.       : __end_of_storage(0,x.get_allocator())
  1106.     {
  1107.       __init(x.size()); 
  1108.       __copy(x.begin(), x.end(), __start);
  1109.     }
  1110.  
  1111. #ifndef _RWSTD_NO_MEMBER_TEMPLATES
  1112.     template<class InputIterator>
  1113.     vector<bool,Allocator>  (InputIterator first, InputIterator last)
  1114.       : __end_of_storage(0,Allocator())
  1115.     {
  1116.       size_type n;
  1117.       __initialize(n, size_type(0));
  1118.       distance(first, last, n);
  1119.       __init(n);
  1120.       __copy(first, last, __start);
  1121.     }
  1122. #else
  1123.     vector<bool,Allocator> (const_iterator first, const_iterator last)
  1124.       : __end_of_storage(0,Allocator())
  1125.     {
  1126.       size_type n;
  1127.       __initialize(n, size_type(0));
  1128.       distance(first, last, n);
  1129.       __init(n);
  1130.       __copy(first, last, __start);
  1131.     }
  1132.     vector<bool,Allocator> (const bool* first, const bool* last)
  1133.       : __end_of_storage(0,Allocator())
  1134.     {
  1135.       size_type n;
  1136.       __initialize(n, size_type(0));
  1137.       distance(first, last, n);
  1138.       __init(n);
  1139.       __copy(first, last, __start);
  1140.     }
  1141. #endif
  1142.     ~vector<bool,Allocator> () {
  1143.       __value_alloc_type(__end_of_storage).deallocate(__start.p,  
  1144.         __end_of_storage.data()-__start.p); 
  1145.     }
  1146.     vector<bool,Allocator>& operator= (const vector<bool, Allocator>& x)
  1147.     {
  1148.       if (&x == this) return *this;
  1149.       if (x.size() > capacity())
  1150.       {
  1151.         __value_alloc_type(__end_of_storage).deallocate(__start.p,
  1152.           __end_of_storage.data()-__start.p); 
  1153.         __init(x.size());
  1154.       }
  1155.       __copy(x.begin(), x.end(), begin());
  1156.       __finish = begin() + x.size();
  1157.       return *this;
  1158.     }
  1159. #ifndef _RWSTD_NO_MEMBER_TEMPLATES
  1160.     template<class InputIterator>
  1161.     void assign (InputIterator first, InputIterator last)
  1162.     { erase(begin(), end()); insert(begin(), first, last); }
  1163. #else
  1164.     void assign (const_iterator first, const_iterator last)
  1165.     { erase(begin(), end()); insert(begin(), first, last); }
  1166. #endif
  1167.  
  1168.     void assign (size_type n, const bool& t = bool())
  1169.     { erase(begin(), end()); insert(begin(), n, t);  }
  1170.  
  1171.     allocator_type get_allocator() const
  1172.     {
  1173.       return (allocator_type)__end_of_storage;
  1174.     }
  1175.  
  1176.     //
  1177.     // iterators
  1178.     //
  1179.     iterator       begin ()       { return __start; }
  1180.     const_iterator begin () const 
  1181.     { return const_iterator(__start.p,__start.offset); }
  1182.     iterator       end   ()       { return __finish; }
  1183.     const_iterator end   () const 
  1184.     { return const_iterator(__finish.p,__finish.offset); }
  1185.  
  1186.     reverse_iterator       rbegin () { return reverse_iterator(end()); }
  1187.     const_reverse_iterator rbegin () const
  1188.     { 
  1189.       return const_reverse_iterator(end()); 
  1190.     }
  1191.     reverse_iterator       rend () { return reverse_iterator(begin()); }
  1192.     const_reverse_iterator rend () const
  1193.     { 
  1194.       return const_reverse_iterator(begin()); 
  1195.     }
  1196.  
  1197.     //
  1198.     // capacity
  1199.     //
  1200.     size_type size     () const { return size_type(end() - begin());  }
  1201.     size_type max_size () const { return __value_alloc_type(__end_of_storage).max_size(); }
  1202.     void resize (size_type new_size, bool c = false);
  1203.     size_type capacity () const
  1204.     {
  1205.       return size_type(const_iterator(__end_of_storage.data(), 0) - begin());
  1206.     }
  1207.     bool empty () const { return begin() == end(); }
  1208.     void reserve (size_type n)
  1209.     {
  1210.       _RWSTD_THROW(n > max_size(), length_error,
  1211.         __RWSTD::except_msg_string(__RWSTD::__rwse_InvalidSizeParam,
  1212.           "vector<bool>::reserve(size_t)",n,max_size()).msgstr());
  1213.       if (capacity() < n)
  1214.       {
  1215.         unsigned int* q = __bit_alloc(n);
  1216.         __finish = __copy(begin(), end(), iterator(q, 0));
  1217.         __value_alloc_type(__end_of_storage).deallocate(__start.p,
  1218.                                                    __end_of_storage.data()-__start.p);
  1219.         __start = iterator(q, 0);
  1220.         __end_of_storage = q + (n + _RWSTD_WORD_BIT - 1)/_RWSTD_WORD_BIT;
  1221.       }
  1222.     }
  1223.  
  1224.     //
  1225.     // element access
  1226.     //
  1227.     reference       operator[] (size_type n)       
  1228.     { 
  1229. #ifdef _RWSTD_BOUNDS_CHECKING
  1230.       _RWSTD_THROW(n >= size(), out_of_range,
  1231.         __RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
  1232.           "vector<bool>::[](size_t)",n,size()).msgstr());
  1233. #endif
  1234.       return *(begin() + n); 
  1235.     }
  1236.     const_reference operator[] (size_type n) const 
  1237.     { 
  1238. #ifdef _RWSTD_BOUNDS_CHECKING
  1239.       _RWSTD_THROW(n >= size(), out_of_range,
  1240.         __RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
  1241.           "vector<bool>::[](size_t)",n,size()).msgstr());
  1242. #endif
  1243.       return *(begin() + n); 
  1244.     }
  1245.     reference       at (size_type n)               
  1246.     { 
  1247.       _RWSTD_THROW(n >= size(), out_of_range,
  1248.         __RWSTD::except_msg_string(__RWSTD::rwse_OutOfRange,
  1249.           "vector<bool>:: at(size_t)",n,size()).msgstr());
  1250.       return *(begin() + n); 
  1251.     }
  1252.     const_reference at (size_type n)   const 
  1253.     {
  1254.       _RWSTD_THROW(n >= size(), out_of_range,
  1255.         __RWSTD::except_msg_string( __RWSTD::rwse_OutOfRange,
  1256.           "vector<bool>:: at(size_t) const",n,size()).msgstr());
  1257.  
  1258.       return *(begin() + n); 
  1259.     }
  1260.     reference       front ()       { return *begin();     }
  1261.     const_reference front () const { return *begin();     }
  1262.     reference       back  ()       { return *(end() - 1); }
  1263.     const_reference back  () const { return *(end() - 1); }
  1264.     
  1265.     //
  1266.     // modifiers
  1267.     //
  1268.     void push_back (const bool& x)
  1269.     {
  1270.       if (__finish.p != __end_of_storage.data())
  1271.         *__finish++ = x;
  1272.       else
  1273.         __insert_aux(end(), x);
  1274.     }
  1275.     void pop_back () { --__finish; }
  1276.  
  1277.     iterator insert (iterator position, const bool& x = bool())
  1278.     {
  1279.       size_type n = position - begin();
  1280.       if (__finish.p != __end_of_storage.data() && position == end())
  1281.         *__finish++ = x;
  1282.       else
  1283.         __insert_aux(position, x);
  1284.       return begin() + n;
  1285.     }
  1286.     void insert (iterator position, size_type n, const bool& x);
  1287.  
  1288. #ifndef _RWSTD_NO_MEMBER_TEMPLATES
  1289.     template<class InputIterator>
  1290.     void insert (iterator position, InputIterator first, InputIterator last);
  1291. #else
  1292.     void insert (iterator position, const_iterator first, 
  1293.                  const_iterator last);
  1294. #endif
  1295.  
  1296.     iterator erase (iterator position)
  1297.     {
  1298.       if (!(position + 1 == end()))
  1299.         __copy(position + 1, end(), position);
  1300.       --__finish;
  1301.       return position;
  1302.     }
  1303.     iterator erase(iterator first, iterator last)
  1304.     {
  1305.       __finish = __copy(last, end(), first);
  1306.       return first;
  1307.     }
  1308.     void swap (vector<bool,Allocator >& x)
  1309.     {
  1310.       if((allocator_type)__end_of_storage==(allocator_type)x.__end_of_storage)
  1311.       {
  1312. #ifndef _RWSTD_NO_NAMESPACE
  1313.         std::swap(__start,          x.__start);
  1314.         std::swap(__finish,         x.__finish);
  1315.         std::swap(__end_of_storage, x.__end_of_storage);
  1316. #else
  1317.         ::swap(__start,          x.__start); 
  1318.         ::swap(__finish,         x.__finish);
  1319.         ::swap(__end_of_storage, x.__end_of_storage);
  1320. #endif // _RWSTD_NO_NAMESPACE
  1321.       }
  1322.       else
  1323.       {
  1324.         vector<bool,Allocator> _x = *this;
  1325.         *this = x;
  1326.         x=_x;
  1327.       } 
  1328.     }
  1329.     static void swap(reference x, reference y);
  1330.     void flip ();
  1331.     void clear()
  1332.     {
  1333.       erase(begin(),end());
  1334.     }
  1335.   };
  1336.  
  1337. #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
  1338.   template <class Allocator>
  1339. #endif
  1340.   inline bool operator== (const vector<bool,Allocator >& x, 
  1341.                           const vector<bool,Allocator >& y)
  1342.   {
  1343.     if (x.size() == y.size())
  1344.     {
  1345. #ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
  1346.       vector<bool,Allocator >::const_iterator first1 = x.begin(), 
  1347. #else
  1348.       _TYPENAME vector<bool,Allocator >::const_iterator first1 = x.begin(), 
  1349. #endif
  1350.       last1 =x.end(),
  1351.       first2 = y.begin();
  1352.             
  1353.       while (first1 != last1 && *first1 == *first2)
  1354.       {
  1355.         ++first1;
  1356.         ++first2;
  1357.       }
  1358.       return first1 == last1;
  1359.     }
  1360.     return false;
  1361.   }
  1362.  
  1363. #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
  1364.   template <class Allocator>
  1365. #endif
  1366.   inline bool operator< (const vector<bool,Allocator >& x, 
  1367.                          const vector<bool,Allocator >& y)
  1368.   {
  1369. #ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
  1370.     vector<bool,Allocator >::const_iterator first1 = x.begin(), 
  1371. #else
  1372.     _TYPENAME vector<bool,Allocator >::const_iterator first1 = x.begin(), 
  1373. #endif
  1374.     last1 =x.end(),
  1375.     first2 = y.begin(),
  1376.     last2 = y.end();
  1377.  
  1378.     while (first1 != last1 && first2 != last2)
  1379.     {
  1380.       if ((int)*first1 < (int)*first2)     return true;
  1381.       if ((int)*first2++ < (int)*first1++) return false;
  1382.     }
  1383.     return first1 == last1 && first2 != last2;
  1384.   }
  1385.  
  1386. #if !defined(_RWSTD_NO_NAMESPACE) || !defined(_RWSTD_NO_PART_SPEC_OVERLOAD)
  1387. #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
  1388.   template <class Allocator>
  1389. #endif
  1390.   inline bool operator!= (const vector<bool,Allocator >& x, 
  1391.                           const vector<bool,Allocator >& y)
  1392.   {
  1393.     return !(x == y);
  1394.   }
  1395.  
  1396. #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
  1397.   template <class Allocator>
  1398. #endif
  1399.   inline bool operator> (const vector<bool,Allocator >& x, 
  1400.                          const vector<bool,Allocator >& y)
  1401.   {
  1402.     return y < x;
  1403.   }
  1404.  
  1405. #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
  1406.   template <class Allocator>
  1407. #endif
  1408.   inline bool operator>= (const vector<bool,Allocator >& x, 
  1409.                           const vector<bool,Allocator >& y)
  1410.   {
  1411.     return !(x < y);
  1412.   }
  1413.  
  1414. #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
  1415.   template <class Allocator>
  1416. #endif
  1417.   inline bool operator<= (const vector<bool,Allocator >& x, 
  1418.                           const vector<bool,Allocator >& y)
  1419.   {
  1420.     return !(y <  x);
  1421.   }
  1422.  
  1423. #ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
  1424.   template <class Allocator>
  1425. #endif
  1426.   inline void swap(vector<bool,Allocator >& a, vector<bool,Allocator >& b)
  1427.   {
  1428.     a.swap(b);
  1429.   }
  1430.  
  1431. #endif
  1432.  
  1433. #ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
  1434. #undef Allocator 
  1435. #endif
  1436.  
  1437. #endif /*_RWSTD_NO_BOOL*/
  1438.  
  1439. #ifndef _RWSTD_NO_NAMESPACE
  1440. }
  1441. #endif
  1442.  
  1443. #if defined (_RWSTD_NO_TEMPLATE_REPOSITORY) && (!defined (__TURBOC__) || (__TURBOC__ > 0x530))
  1444. #include <vector.cc>
  1445. #endif
  1446.  
  1447. #undef vector
  1448.  
  1449. #endif /*__STD_VECTOR__*/
  1450.  
  1451. #ifndef __USING_STD_NAMES__
  1452.   using namespace std;
  1453. #endif
  1454.  
  1455. #pragma option pop
  1456. #endif /* __VECTOR_H */
  1457.