Commit ff893307 by Jason Merrill Committed by Jason Merrill

algo.h, [...]: Update To September 8 SGI release.

	* algo.h, algobase.h, alloc.h, bvector.h, deque.h, hashtable.h,
	iterator.h, list.h, rope.h, ropeimpl.h, slist.h, stl_config.h,
	tree.h, vector.h: Update To September 8 SGI release.

From-SVN: r15211
parent c6b50f10
Tue Sep 9 19:47:28 1997 Jason Merrill <jason@yorick.cygnus.com>
* algo.h, algobase.h, alloc.h, bvector.h, deque.h, hashtable.h,
iterator.h, list.h, rope.h, ropeimpl.h, slist.h, stl_config.h,
tree.h, vector.h: Update To September 8 SGI release.
Tue Sep 9 17:38:47 1997 Mark Mitchell <mmitchell@usa.net> Tue Sep 9 17:38:47 1997 Mark Mitchell <mmitchell@usa.net>
* stl_config.h (__STL_MEMBER_TEMPLATES): Enable. * stl_config.h (__STL_MEMBER_TEMPLATES): Enable.
......
...@@ -86,19 +86,6 @@ inline void __distance(InputIterator first, InputIterator last, Distance& n, ...@@ -86,19 +86,6 @@ inline void __distance(InputIterator first, InputIterator last, Distance& n,
while (first != last) { ++first; ++n; } while (first != last) { ++first; ++n; }
} }
template <class ForwardIterator, class Distance>
inline void __distance(ForwardIterator first, ForwardIterator last,
Distance& n,
forward_iterator_tag) {
while (first != last) { ++first; ++n; }
}
template <class BidirectionalIterator, class Distance>
inline void __distance(BidirectionalIterator first, BidirectionalIterator last,
Distance& n, bidirectional_iterator_tag) {
while (first != last) { ++first; ++n; }
}
template <class RandomAccessIterator, class Distance> template <class RandomAccessIterator, class Distance>
inline void __distance(RandomAccessIterator first, RandomAccessIterator last, inline void __distance(RandomAccessIterator first, RandomAccessIterator last,
Distance& n, random_access_iterator_tag) { Distance& n, random_access_iterator_tag) {
...@@ -122,19 +109,6 @@ __distance(InputIterator first, InputIterator last, input_iterator_tag) { ...@@ -122,19 +109,6 @@ __distance(InputIterator first, InputIterator last, input_iterator_tag) {
return n; return n;
} }
template <class ForwardIterator>
inline iterator_traits<ForwardIterator>::difference_type
__distance(ForwardIterator first, ForwardIterator last, forward_iterator_tag) {
return __distance(first, last, input_iterator_tag());
}
template <class BidirectionalIterator>
inline iterator_traits<BidirectionalIterator>::difference_type
__distance(BidirectionalIterator first, BidirectionalIterator last,
bidirectional_iterator_tag) {
return __distance(first, last, input_iterator_tag());
}
template <class RandomAccessIterator> template <class RandomAccessIterator>
inline iterator_traits<RandomAccessIterator>::difference_type inline iterator_traits<RandomAccessIterator>::difference_type
__distance(RandomAccessIterator first, RandomAccessIterator last, __distance(RandomAccessIterator first, RandomAccessIterator last,
...@@ -156,11 +130,6 @@ inline void __advance(InputIterator& i, Distance n, input_iterator_tag) { ...@@ -156,11 +130,6 @@ inline void __advance(InputIterator& i, Distance n, input_iterator_tag) {
while (n--) ++i; while (n--) ++i;
} }
template <class ForwardIterator, class Distance>
inline void __advance(ForwardIterator& i, Distance n, forward_iterator_tag) {
while (n--) ++i;
}
#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
#pragma set woff 1183 #pragma set woff 1183
#endif #endif
...@@ -198,20 +167,6 @@ inline OutputIterator __copy(InputIterator first, InputIterator last, ...@@ -198,20 +167,6 @@ inline OutputIterator __copy(InputIterator first, InputIterator last,
return result; return result;
} }
template <class InputIterator, class OutputIterator>
inline OutputIterator __copy(InputIterator first, InputIterator last,
OutputIterator result, forward_iterator_tag)
{
return __copy(first, last, result, input_iterator_tag());
}
template <class InputIterator, class OutputIterator>
inline OutputIterator __copy(InputIterator first, InputIterator last,
OutputIterator result, bidirectional_iterator_tag)
{
return __copy(first, last, result, input_iterator_tag());
}
template <class RandomAccessIterator, class OutputIterator, class Distance> template <class RandomAccessIterator, class OutputIterator, class Distance>
inline OutputIterator inline OutputIterator
__copy_d(RandomAccessIterator first, RandomAccessIterator last, __copy_d(RandomAccessIterator first, RandomAccessIterator last,
...@@ -365,20 +320,6 @@ OutputIterator __copy_n(InputIterator first, Size count, ...@@ -365,20 +320,6 @@ OutputIterator __copy_n(InputIterator first, Size count,
return result; return result;
} }
template <class ForwardIterator, class Size, class OutputIterator>
inline OutputIterator __copy_n(ForwardIterator first, Size count,
OutputIterator result,
forward_iterator_tag) {
return __copy_n(first, count, result, input_iterator_tag());
}
template <class BidirectionalIterator, class Size, class OutputIterator>
inline OutputIterator __copy_n(BidirectionalIterator first, Size count,
OutputIterator result,
bidirectional_iterator_tag) {
return __copy_n(first, count, result, input_iterator_tag());
}
template <class RandomAccessIterator, class Size, class OutputIterator> template <class RandomAccessIterator, class Size, class OutputIterator>
inline OutputIterator __copy_n(RandomAccessIterator first, Size count, inline OutputIterator __copy_n(RandomAccessIterator first, Size count,
OutputIterator result, OutputIterator result,
...@@ -657,22 +598,6 @@ ForwardIterator __uninitialized_copy_n(InputIterator first, Size count, ...@@ -657,22 +598,6 @@ ForwardIterator __uninitialized_copy_n(InputIterator first, Size count,
# endif /* __STL_USE_EXCEPTIONS */ # endif /* __STL_USE_EXCEPTIONS */
} }
template <class ForwardIterator1, class Size, class ForwardIterator>
inline ForwardIterator
__uninitialized_copy_n(ForwardIterator1 first, Size count,
ForwardIterator result,
forward_iterator_tag) {
return __uninitialized_copy_n(first, count, result, input_iterator_tag());
}
template <class BidirectionalIterator, class Size, class ForwardIterator>
inline ForwardIterator
__uninitialized_copy_n(BidirectionalIterator first, Size count,
ForwardIterator result,
bidirectional_iterator_tag) {
return __uninitialized_copy_n(first, count, result, input_iterator_tag());
}
template <class RandomAccessIterator, class Size, class ForwardIterator> template <class RandomAccessIterator, class Size, class ForwardIterator>
inline ForwardIterator inline ForwardIterator
__uninitialized_copy_n(RandomAccessIterator first, Size count, __uninitialized_copy_n(RandomAccessIterator first, Size count,
......
...@@ -49,7 +49,6 @@ ...@@ -49,7 +49,6 @@
#endif #endif
#ifdef __STL_WIN32THREADS #ifdef __STL_WIN32THREADS
# include <windows.h> # include <windows.h>
// This must precede stl_config.h
#endif #endif
#include <stddef.h> #include <stddef.h>
...@@ -91,7 +90,11 @@ ...@@ -91,7 +90,11 @@
// This should work without threads, with sproc threads, or with // This should work without threads, with sproc threads, or with
// pthreads. It is suboptimal in all cases. // pthreads. It is suboptimal in all cases.
// It is unlikely to even compile on nonSGI machines. // It is unlikely to even compile on nonSGI machines.
# include <malloc.h>
extern int __us_rsthread_malloc;
// The above is copied from malloc.h. Including <malloc.h>
// would be cleaner but fails with certain levels of standard
// conformance.
# define __NODE_ALLOCATOR_LOCK if (threads && __us_rsthread_malloc) \ # define __NODE_ALLOCATOR_LOCK if (threads && __us_rsthread_malloc) \
{ __lock(&__node_allocator_lock); } { __lock(&__node_allocator_lock); }
# define __NODE_ALLOCATOR_UNLOCK if (threads && __us_rsthread_malloc) \ # define __NODE_ALLOCATOR_UNLOCK if (threads && __us_rsthread_malloc) \
...@@ -383,15 +386,17 @@ public: ...@@ -383,15 +386,17 @@ public:
obj * __VOLATILE * my_free_list; obj * __VOLATILE * my_free_list;
obj * __RESTRICT result; obj * __RESTRICT result;
if (n > __MAX_BYTES) { if (n > (size_t) __MAX_BYTES) {
return(malloc_alloc::allocate(n)); return(malloc_alloc::allocate(n));
} }
my_free_list = free_list + FREELIST_INDEX(n); my_free_list = free_list + FREELIST_INDEX(n);
// Acquire the lock here with a constructor call. // Acquire the lock here with a constructor call.
// This ensures that it is released in exit or during stack // This ensures that it is released in exit or during stack
// unwinding. // unwinding.
# ifndef _NOTHREADS
/*REFERENCED*/ /*REFERENCED*/
lock lock_instance; lock lock_instance;
# endif
result = *my_free_list; result = *my_free_list;
if (result == 0) { if (result == 0) {
void *r = refill(ROUND_UP(n)); void *r = refill(ROUND_UP(n));
...@@ -407,14 +412,16 @@ public: ...@@ -407,14 +412,16 @@ public:
obj *q = (obj *)p; obj *q = (obj *)p;
obj * __VOLATILE * my_free_list; obj * __VOLATILE * my_free_list;
if (n > __MAX_BYTES) { if (n > (size_t) __MAX_BYTES) {
malloc_alloc::deallocate(p, n); malloc_alloc::deallocate(p, n);
return; return;
} }
my_free_list = free_list + FREELIST_INDEX(n); my_free_list = free_list + FREELIST_INDEX(n);
// acquire lock // acquire lock
# ifndef _NOTHREADS
/*REFERENCED*/ /*REFERENCED*/
lock lock_instance; lock lock_instance;
# endif /* _NOTHREADS */
q -> free_list_link = *my_free_list; q -> free_list_link = *my_free_list;
*my_free_list = q; *my_free_list = q;
// lock is released here // lock is released here
...@@ -480,6 +487,7 @@ __default_alloc_template<threads, inst>::chunk_alloc(size_t size, int& nobjs) ...@@ -480,6 +487,7 @@ __default_alloc_template<threads, inst>::chunk_alloc(size_t size, int& nobjs)
// right free list. // right free list.
} }
} }
end_free = 0; // In case of exception.
start_free = (char *)malloc_alloc::allocate(bytes_to_get); start_free = (char *)malloc_alloc::allocate(bytes_to_get);
// This should either throw an // This should either throw an
// exception or remedy the situation. Thus we assume it // exception or remedy the situation. Thus we assume it
...@@ -533,7 +541,7 @@ __default_alloc_template<threads, inst>::reallocate(void *p, ...@@ -533,7 +541,7 @@ __default_alloc_template<threads, inst>::reallocate(void *p,
void * result; void * result;
size_t copy_sz; size_t copy_sz;
if (old_sz > __MAX_BYTES && new_sz > __MAX_BYTES) { if (old_sz > (size_t) __MAX_BYTES && new_sz > (size_t) __MAX_BYTES) {
return(realloc(p, new_sz)); return(realloc(p, new_sz));
} }
if (ROUND_UP(old_sz) == ROUND_UP(new_sz)) return(p); if (ROUND_UP(old_sz) == ROUND_UP(new_sz)) return(p);
...@@ -671,4 +679,6 @@ __default_alloc_template<threads, inst> ::free_list[ ...@@ -671,4 +679,6 @@ __default_alloc_template<threads, inst> ::free_list[
#pragma reset woff 1174 #pragma reset woff 1174
#endif #endif
#endif /* __NODE_ALLOC_H */ #undef __PRIVATE
#endif /* __ALLOC_H */
...@@ -83,6 +83,7 @@ public: ...@@ -83,6 +83,7 @@ public:
friend class const_iterator; friend class const_iterator;
public: public:
typedef bit_reference reference; typedef bit_reference reference;
typedef bit_reference* pointer;
protected: protected:
unsigned int* p; unsigned int* p;
unsigned int offset; unsigned int offset;
...@@ -163,6 +164,7 @@ public: ...@@ -163,6 +164,7 @@ public:
friend class bit_vector; friend class bit_vector;
public: public:
typedef bit_const_reference reference; typedef bit_const_reference reference;
typedef const bool* pointer;
protected: protected:
unsigned int* p; unsigned int* p;
unsigned int offset; unsigned int offset;
...@@ -243,10 +245,15 @@ public: ...@@ -243,10 +245,15 @@ public:
} }
}; };
#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
typedef reverse_iterator<const_iterator> const_reverse_iterator;
typedef reverse_iterator<iterator> reverse_iterator;
#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
typedef reverse_iterator<const_iterator, value_type, const_reference, typedef reverse_iterator<const_iterator, value_type, const_reference,
difference_type> const_reverse_iterator; difference_type> const_reverse_iterator;
typedef reverse_iterator<iterator, value_type, reference, difference_type> typedef reverse_iterator<iterator, value_type, reference, difference_type>
reverse_iterator; reverse_iterator;
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
protected: protected:
typedef simple_alloc<unsigned int, alloc> data_allocator; typedef simple_alloc<unsigned int, alloc> data_allocator;
...@@ -303,20 +310,6 @@ protected: ...@@ -303,20 +310,6 @@ protected:
copy(first, last, start); copy(first, last, start);
} }
template <class BidirectionalIterator>
void initialize_range(BidirectionalIterator first,
BidirectionalIterator last,
bidirectional_iterator_tag) {
initialize_range(first, last, forward_iterator_tag());
}
template <class RandomAccessIterator>
void initialize_range(RandomAccessIterator first,
RandomAccessIterator last,
random_access_iterator_tag) {
initialize_range(first, last, forward_iterator_tag());
}
template <class InputIterator> template <class InputIterator>
void insert_range(iterator pos, void insert_range(iterator pos,
InputIterator first, InputIterator last, InputIterator first, InputIterator last,
...@@ -352,20 +345,6 @@ protected: ...@@ -352,20 +345,6 @@ protected:
} }
} }
template <class BidirectionalIterator>
void insert_range(iterator pos,
BidirectionalIterator first, BidirectionalIterator last,
bidirectional_iterator_tag) {
insert_range(pos, first, last, forward_iterator_tag());
}
template <class RandomAccessIterator>
void insert_range(iterator pos,
RandomAccessIterator first, RandomAccessIterator last,
random_access_iterator_tag) {
insert_range(pos, first, last, forward_iterator_tag());
}
#endif /* __STL_MEMBER_TEMPLATES */ #endif /* __STL_MEMBER_TEMPLATES */
typedef bit_vector self; typedef bit_vector self;
......
...@@ -87,42 +87,44 @@ inline size_t __deque_buf_size(size_t n, size_t sz) ...@@ -87,42 +87,44 @@ inline size_t __deque_buf_size(size_t n, size_t sz)
} }
#ifndef __STL_NON_TYPE_TMPL_PARAM_BUG #ifndef __STL_NON_TYPE_TMPL_PARAM_BUG
template <class T, class Ref, size_t BufSiz> template <class T, class Ref, class Ptr, size_t BufSiz>
struct __deque_iterator { struct __deque_iterator {
typedef __deque_iterator<T, T&, BufSiz> iterator; typedef __deque_iterator<T, T&, T*, BufSiz> iterator;
typedef __deque_iterator<T, const T&, BufSiz> const_iterator; typedef __deque_iterator<T, const T&, const T*, BufSiz> const_iterator;
static size_t buffer_size() {return __deque_buf_size(BufSiz, sizeof(T)); } static size_t buffer_size() {return __deque_buf_size(BufSiz, sizeof(T)); }
#else /* __STL_NON_TYPE_TMPL_PARAM_BUG */ #else /* __STL_NON_TYPE_TMPL_PARAM_BUG */
template <class T, class Ref> template <class T, class Ref, class Ptr>
struct __deque_iterator { struct __deque_iterator {
typedef __deque_iterator<T, T&> iterator; typedef __deque_iterator<T, T&, T*> iterator;
typedef __deque_iterator<T, const T&> const_iterator; typedef __deque_iterator<T, const T&, const T*> const_iterator;
static size_t buffer_size() {return __deque_buf_size(0, sizeof(T)); } static size_t buffer_size() {return __deque_buf_size(0, sizeof(T)); }
#endif #endif
typedef random_access_iterator_tag iterator_category; typedef random_access_iterator_tag iterator_category;
typedef T value_type; typedef T value_type;
typedef value_type* pointer; typedef Ptr pointer;
typedef value_type& reference; typedef Ref reference;
typedef const value_type& const_reference;
typedef size_t size_type; typedef size_t size_type;
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
typedef pointer* map_pointer; typedef T** map_pointer;
typedef __deque_iterator self; typedef __deque_iterator self;
pointer cur; T* cur;
pointer first; T* first;
pointer last; T* last;
map_pointer node; map_pointer node;
__deque_iterator(pointer x, map_pointer y) __deque_iterator(T* x, map_pointer y)
: cur(x), first(*y), last(*y + buffer_size()), node(y) {} : cur(x), first(*y), last(*y + buffer_size()), node(y) {}
__deque_iterator() : cur(0), first(0), last(0), node(0) {} __deque_iterator() : cur(0), first(0), last(0), node(0) {}
__deque_iterator(const iterator& x) __deque_iterator(const iterator& x)
: cur(x.cur), first(x.first), last(x.last), node(x.node) {} : cur(x.cur), first(x.first), last(x.last), node(x.node) {}
Ref operator*() const { return *cur; } reference operator*() const { return *cur; }
#ifndef __SGI_STL_NO_ARROW_OPERATOR
pointer operator->() const { return &(operator*()); }
#endif /* __SGI_STL_NO_ARROW_OPERATOR */
difference_type operator-(const self& x) const { difference_type operator-(const self& x) const {
return buffer_size() * (node - x.node - 1) + return buffer_size() * (node - x.node - 1) +
...@@ -183,7 +185,7 @@ struct __deque_iterator { ...@@ -183,7 +185,7 @@ struct __deque_iterator {
return tmp -= n; return tmp -= n;
} }
Ref operator[](difference_type n) const { return *(*this + n); } reference operator[](difference_type n) const { return *(*this + n); }
bool operator==(const self& x) const { return cur == x.cur; } bool operator==(const self& x) const { return cur == x.cur; }
bool operator!=(const self& x) const { return !(*this == x); } bool operator!=(const self& x) const { return !(*this == x); }
...@@ -198,40 +200,45 @@ struct __deque_iterator { ...@@ -198,40 +200,45 @@ struct __deque_iterator {
} }
}; };
#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
#ifndef __STL_NON_TYPE_TMPL_PARAM_BUG #ifndef __STL_NON_TYPE_TMPL_PARAM_BUG
template <class T, class Ref, size_t BufSiz> template <class T, class Ref, class Ptr, size_t BufSiz>
inline random_access_iterator_tag inline random_access_iterator_tag
iterator_category(const __deque_iterator<T, Ref, BufSiz>&) { iterator_category(const __deque_iterator<T, Ref, Ptr, BufSiz>&) {
return random_access_iterator_tag(); return random_access_iterator_tag();
} }
template <class T, class Ref, size_t BufSiz> template <class T, class Ref, class Ptr, size_t BufSiz>
inline T* value_type(const __deque_iterator<T, Ref, BufSiz>&) { return 0; } inline T* value_type(const __deque_iterator<T, Ref, Ptr, BufSiz>&) {
return 0;
}
template <class T, class Ref, size_t BufSiz> template <class T, class Ref, class Ptr, size_t BufSiz>
inline ptrdiff_t* distance_type(const __deque_iterator<T, Ref, BufSiz>&) { inline ptrdiff_t* distance_type(const __deque_iterator<T, Ref, Ptr, BufSiz>&) {
return 0; return 0;
} }
#else /* __STL_NON_TYPE_TMPL_PARAM_BUG */ #else /* __STL_NON_TYPE_TMPL_PARAM_BUG */
template <class T, class Ref> template <class T, class Ref, class Ptr>
inline random_access_iterator_tag inline random_access_iterator_tag
iterator_category(const __deque_iterator<T, Ref>&) { iterator_category(const __deque_iterator<T, Ref, Ptr>&) {
return random_access_iterator_tag(); return random_access_iterator_tag();
} }
template <class T, class Ref> template <class T, class Ref, class Ptr>
inline T* value_type(const __deque_iterator<T, Ref>&) { return 0; } inline T* value_type(const __deque_iterator<T, Ref, Ptr>&) { return 0; }
template <class T, class Ref> template <class T, class Ref, class Ptr>
inline ptrdiff_t* distance_type(const __deque_iterator<T, Ref>&) { inline ptrdiff_t* distance_type(const __deque_iterator<T, Ref, Ptr>&) {
return 0; return 0;
} }
#endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */ #endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
// See __deque_buf_size(). The only reason that the default value is 0 // See __deque_buf_size(). The only reason that the default value is 0
// is as a workaround for bugs in the way that some compilers handle // is as a workaround for bugs in the way that some compilers handle
...@@ -248,17 +255,23 @@ public: // Basic types ...@@ -248,17 +255,23 @@ public: // Basic types
public: // Iterators public: // Iterators
#ifndef __STL_NON_TYPE_TMPL_PARAM_BUG #ifndef __STL_NON_TYPE_TMPL_PARAM_BUG
typedef __deque_iterator<value_type, reference, BufSiz> iterator; typedef __deque_iterator<T, T&, T*, BufSiz> iterator;
typedef __deque_iterator<value_type, const_reference, BufSiz> const_iterator; typedef __deque_iterator<T, const T&, const T&, BufSiz> const_iterator;
#else /* __STL_NON_TYPE_TMPL_PARAM_BUG */ #else /* __STL_NON_TYPE_TMPL_PARAM_BUG */
typedef __deque_iterator<value_type, reference> iterator; typedef __deque_iterator<T, T&, T*> iterator;
typedef __deque_iterator<value_type, const_reference> const_iterator; typedef __deque_iterator<T, const T&, const T*> const_iterator;
#endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */ #endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */
#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
typedef reverse_iterator<const_iterator> const_reverse_iterator;
typedef reverse_iterator<iterator> reverse_iterator;
#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
typedef reverse_iterator<const_iterator, value_type, const_reference, typedef reverse_iterator<const_iterator, value_type, const_reference,
difference_type> difference_type>
const_reverse_iterator; const_reverse_iterator;
typedef reverse_iterator<iterator, value_type, reference, difference_type> typedef reverse_iterator<iterator, value_type, reference, difference_type>
reverse_iterator; reverse_iterator;
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
protected: // Internal typedefs protected: // Internal typedefs
typedef pointer* map_pointer; typedef pointer* map_pointer;
...@@ -553,19 +566,6 @@ protected: // Internal construction/destruction ...@@ -553,19 +566,6 @@ protected: // Internal construction/destruction
void range_initialize(ForwardIterator first, ForwardIterator last, void range_initialize(ForwardIterator first, ForwardIterator last,
forward_iterator_tag); forward_iterator_tag);
template <class BidirectionalIterator>
void range_initialize(BidirectionalIterator first,
BidirectionalIterator last,
bidirectional_iterator_tag) {
range_initialize(first, last, forward_iterator_tag());
}
template <class RandomAccessIterator>
void range_initialize(RandomAccessIterator first, RandomAccessIterator last,
random_access_iterator_tag) {
range_initialize(first, last, forward_iterator_tag());
}
#endif /* __STL_MEMBER_TEMPLATES */ #endif /* __STL_MEMBER_TEMPLATES */
protected: // Internal push_* and pop_* protected: // Internal push_* and pop_*
...@@ -587,19 +587,6 @@ protected: // Internal insert functions ...@@ -587,19 +587,6 @@ protected: // Internal insert functions
void insert(iterator pos, ForwardIterator first, ForwardIterator last, void insert(iterator pos, ForwardIterator first, ForwardIterator last,
forward_iterator_tag); forward_iterator_tag);
template <class BidirectionalIterator>
void insert(iterator pos,
BidirectionalIterator first, BidirectionalIterator last,
bidirectional_iterator_tag) {
insert(pos, first, last, forward_iterator_tag());
}
template <class RandomAccessIterator>
void insert(iterator pos,
RandomAccessIterator first, RandomAccessIterator last,
random_access_iterator_tag) {
insert(pos, first, last, forward_iterator_tag());
}
#endif /* __STL_MEMBER_TEMPLATES */ #endif /* __STL_MEMBER_TEMPLATES */
iterator insert_aux(iterator pos, const value_type& x); iterator insert_aux(iterator pos, const value_type& x);
...@@ -881,7 +868,7 @@ void deque<T, Alloc, BufSize>::fill_initialize(size_type n, ...@@ -881,7 +868,7 @@ void deque<T, Alloc, BufSize>::fill_initialize(size_type n,
} }
catch(...) { catch(...) {
for (map_pointer n = start.node; n < cur; ++n) for (map_pointer n = start.node; n < cur; ++n)
destroy(*cur, *cur + buffer_size()); destroy(*n, *n + buffer_size());
destroy_map_and_nodes(); destroy_map_and_nodes();
throw; throw;
} }
......
...@@ -123,7 +123,6 @@ struct __hashtable_iterator { ...@@ -123,7 +123,6 @@ struct __hashtable_iterator {
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
typedef size_t size_type; typedef size_t size_type;
typedef Value& reference; typedef Value& reference;
typedef const Value& const_reference;
typedef Value* pointer; typedef Value* pointer;
node* cur; node* cur;
...@@ -132,6 +131,9 @@ struct __hashtable_iterator { ...@@ -132,6 +131,9 @@ struct __hashtable_iterator {
__hashtable_iterator(node* n, hashtable* tab) : cur(n), ht(tab) {} __hashtable_iterator(node* n, hashtable* tab) : cur(n), ht(tab) {}
__hashtable_iterator() {} __hashtable_iterator() {}
reference operator*() const { return cur->val; } reference operator*() const { return cur->val; }
#ifndef __SGI_STL_NO_ARROW_OPERATOR
pointer operator->() const { return &(operator*()); }
#endif /* __SGI_STL_NO_ARROW_OPERATOR */
iterator& operator++(); iterator& operator++();
iterator operator++(int); iterator operator++(int);
bool operator==(const iterator& it) const { return cur == it.cur; } bool operator==(const iterator& it) const { return cur == it.cur; }
...@@ -156,9 +158,8 @@ struct __hashtable_const_iterator { ...@@ -156,9 +158,8 @@ struct __hashtable_const_iterator {
typedef Value value_type; typedef Value value_type;
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
typedef size_t size_type; typedef size_t size_type;
typedef Value& reference; typedef const Value& reference;
typedef const Value& const_reference; typedef const Value* pointer;
typedef Value* pointer;
const node* cur; const node* cur;
const hashtable* ht; const hashtable* ht;
...@@ -167,7 +168,10 @@ struct __hashtable_const_iterator { ...@@ -167,7 +168,10 @@ struct __hashtable_const_iterator {
: cur(n), ht(tab) {} : cur(n), ht(tab) {}
__hashtable_const_iterator() {} __hashtable_const_iterator() {}
__hashtable_const_iterator(const iterator& it) : cur(it.cur), ht(it.ht) {} __hashtable_const_iterator(const iterator& it) : cur(it.cur), ht(it.ht) {}
const_reference operator*() const { return cur->val; } reference operator*() const { return cur->val; }
#ifndef __SGI_STL_NO_ARROW_OPERATOR
pointer operator->() const { return &(operator*()); }
#endif /* __SGI_STL_NO_ARROW_OPERATOR */
const_iterator& operator++(); const_iterator& operator++();
const_iterator operator++(int); const_iterator operator++(int);
bool operator==(const const_iterator& it) const { return cur == it.cur; } bool operator==(const const_iterator& it) const { return cur == it.cur; }
...@@ -399,34 +403,6 @@ public: ...@@ -399,34 +403,6 @@ public:
insert_equal_noresize(*f); insert_equal_noresize(*f);
} }
template <class BidirectionalIterator>
void insert_unique(BidirectionalIterator f, BidirectionalIterator l,
bidirectional_iterator_tag)
{
insert_unique(f, l, forward_iterator_tag());
}
template <class BidirectionalIterator>
void insert_equal(BidirectionalIterator f, BidirectionalIterator l,
bidirectional_iterator_tag)
{
insert_equal(f, l, forward_iterator_tag());
}
template <class RandomAccessIterator>
void insert_unique(RandomAccessIterator f, RandomAccessIterator l,
random_access_iterator_tag)
{
insert_unique(f, l, forward_iterator_tag());
}
template <class RandomAccessIterator>
void insert_equal(RandomAccessIterator f, RandomAccessIterator l,
random_access_iterator_tag)
{
insert_equal(f, l, forward_iterator_tag());
}
#else /* __STL_MEMBER_TEMPLATES */ #else /* __STL_MEMBER_TEMPLATES */
void insert_unique(const value_type* f, const value_type* l) void insert_unique(const value_type* f, const value_type* l)
{ {
...@@ -619,6 +595,7 @@ __hashtable_const_iterator<V, K, HF, ExK, EqK, A>::operator++(int) ...@@ -619,6 +595,7 @@ __hashtable_const_iterator<V, K, HF, ExK, EqK, A>::operator++(int)
return tmp; return tmp;
} }
#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
template <class V, class K, class HF, class ExK, class EqK, class All> template <class V, class K, class HF, class ExK, class EqK, class All>
inline forward_iterator_tag inline forward_iterator_tag
...@@ -661,6 +638,8 @@ distance_type(const __hashtable_const_iterator<V, K, HF, ExK, EqK, All>&) ...@@ -661,6 +638,8 @@ distance_type(const __hashtable_const_iterator<V, K, HF, ExK, EqK, All>&)
return (hashtable<V, K, HF, ExK, EqK, All>::difference_type*) 0; return (hashtable<V, K, HF, ExK, EqK, All>::difference_type*) 0;
} }
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
template <class V, class K, class HF, class Ex, class Eq, class A> template <class V, class K, class HF, class Ex, class Eq, class A>
bool operator==(const hashtable<V, K, HF, Ex, Eq, A>& ht1, bool operator==(const hashtable<V, K, HF, Ex, Eq, A>& ht1,
const hashtable<V, K, HF, Ex, Eq, A>& ht2) const hashtable<V, K, HF, Ex, Eq, A>& ht2)
......
...@@ -40,17 +40,16 @@ struct __list_node { ...@@ -40,17 +40,16 @@ struct __list_node {
T data; T data;
}; };
template<class T, class Ref> template<class T, class Ref, class Ptr>
struct __list_iterator { struct __list_iterator {
typedef __list_iterator<T, T&> iterator; typedef __list_iterator<T, T&, T*> iterator;
typedef __list_iterator<T, const T&> const_iterator; typedef __list_iterator<T, const T&, const T*> const_iterator;
typedef __list_iterator<T, Ref> self; typedef __list_iterator<T, Ref, Ptr> self;
typedef bidirectional_iterator_tag iterator_category; typedef bidirectional_iterator_tag iterator_category;
typedef T value_type; typedef T value_type;
typedef value_type* pointer; typedef Ptr pointer;
typedef value_type& reference; typedef Ref reference;
typedef const value_type& const_reference;
typedef __list_node<T>* link_type; typedef __list_node<T>* link_type;
typedef size_t size_type; typedef size_t size_type;
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
...@@ -63,7 +62,11 @@ struct __list_iterator { ...@@ -63,7 +62,11 @@ struct __list_iterator {
bool operator==(const self& x) const { return node == x.node; } bool operator==(const self& x) const { return node == x.node; }
bool operator!=(const self& x) const { return node != x.node; } bool operator!=(const self& x) const { return node != x.node; }
Ref operator*() const { return (*node).data; } reference operator*() const { return (*node).data; }
#ifndef __SGI_STL_NO_ARROW_OPERATOR
pointer operator->() const { return &(operator*()); }
#endif /* __SGI_STL_NO_ARROW_OPERATOR */
self& operator++() { self& operator++() {
node = (link_type)((*node).next); node = (link_type)((*node).next);
...@@ -85,25 +88,27 @@ struct __list_iterator { ...@@ -85,25 +88,27 @@ struct __list_iterator {
} }
}; };
#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
template <class T, class Ref> template <class T, class Ref, class Ptr>
inline bidirectional_iterator_tag inline bidirectional_iterator_tag
iterator_category(const __list_iterator<T, Ref>&) { iterator_category(const __list_iterator<T, Ref, Ptr>&) {
return bidirectional_iterator_tag(); return bidirectional_iterator_tag();
} }
template <class T, class Ref> template <class T, class Ref, class Ptr>
inline T* inline T*
value_type(const __list_iterator<T, Ref>&) { value_type(const __list_iterator<T, Ref, Ptr>&) {
return 0; return 0;
} }
template <class T, class Ref> template <class T, class Ref, class Ptr>
inline ptrdiff_t* inline ptrdiff_t*
distance_type(const __list_iterator<T, Ref>&) { distance_type(const __list_iterator<T, Ref, Ptr>&) {
return 0; return 0;
} }
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
template <class T, class Alloc = alloc> template <class T, class Alloc = alloc>
class list { class list {
...@@ -121,15 +126,20 @@ public: ...@@ -121,15 +126,20 @@ public:
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
public: public:
typedef __list_iterator<T, T&> iterator; typedef __list_iterator<T, T&, T*> iterator;
typedef __list_iterator<T, const T&> const_iterator; typedef __list_iterator<T, const T&, const T*> const_iterator;
#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
typedef reverse_iterator<const_iterator> const_reverse_iterator;
typedef reverse_iterator<iterator> reverse_iterator;
#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
typedef reverse_bidirectional_iterator<const_iterator, value_type, typedef reverse_bidirectional_iterator<const_iterator, value_type,
const_reference, difference_type> const_reference, difference_type>
const_reverse_iterator; const_reverse_iterator;
typedef reverse_bidirectional_iterator<iterator, value_type, reference, typedef reverse_bidirectional_iterator<iterator, value_type, reference,
difference_type> difference_type>
reverse_iterator; reverse_iterator;
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
protected: protected:
link_type get_node() { return list_node_allocator::allocate(); } link_type get_node() { return list_node_allocator::allocate(); }
......
...@@ -38,18 +38,18 @@ inline charT __eos(charT*) { return charT(); } ...@@ -38,18 +38,18 @@ inline charT __eos(charT*) { return charT(); }
// Test for basic character types. // Test for basic character types.
// For basic character types leaves having a trailing eos. // For basic character types leaves having a trailing eos.
template <class charT> template <class charT>
inline bool __is_basic_char_type(charT* c) { return false; } inline bool __is_basic_char_type(charT *) { return false; }
template <class charT> template <class charT>
inline bool __is_one_byte_char_type(charT* c) { return false; } inline bool __is_one_byte_char_type(charT *) { return false; }
inline bool __is_basic_char_type(char* c) { return true; } inline bool __is_basic_char_type(char *) { return true; }
inline bool __is_one_byte_char_type(char* c) { return true; } inline bool __is_one_byte_char_type(char *) { return true; }
inline bool __is_basic_char_type(wchar_t* c) { return true; } inline bool __is_basic_char_type(wchar_t *) { return true; }
// Store an eos iff charT is a basic character type. // Store an eos iff charT is a basic character type.
// Do not reference __eos if it isn't. // Do not reference __eos if it isn't.
template <class charT> template <class charT>
inline void __cond_store_eos(charT& c) {} inline void __cond_store_eos(charT&) {}
inline void __cond_store_eos(char& c) { c = 0; } inline void __cond_store_eos(char& c) { c = 0; }
inline void __cond_store_eos(wchar_t& c) { c = 0; } inline void __cond_store_eos(wchar_t& c) { c = 0; }
...@@ -235,6 +235,7 @@ template<class CharT, class Alloc> class __rope_charT_ptr_proxy; ...@@ -235,6 +235,7 @@ template<class CharT, class Alloc> class __rope_charT_ptr_proxy;
template<class charT, class Alloc> template<class charT, class Alloc>
struct __rope_RopeBase { struct __rope_RopeBase {
typedef rope<charT,Alloc> my_rope; typedef rope<charT,Alloc> my_rope;
typedef simple_alloc<charT, Alloc> DataAlloc;
typedef simple_alloc<__rope_RopeConcatenation<charT,Alloc>, Alloc> CAlloc; typedef simple_alloc<__rope_RopeConcatenation<charT,Alloc>, Alloc> CAlloc;
typedef simple_alloc<__rope_RopeLeaf<charT,Alloc>, Alloc> LAlloc; typedef simple_alloc<__rope_RopeLeaf<charT,Alloc>, Alloc> LAlloc;
typedef simple_alloc<__rope_RopeFunction<charT,Alloc>, Alloc> FAlloc; typedef simple_alloc<__rope_RopeFunction<charT,Alloc>, Alloc> FAlloc;
...@@ -368,12 +369,17 @@ struct __rope_RopeBase { ...@@ -368,12 +369,17 @@ struct __rope_RopeBase {
{ {
if (0 != t) t -> incr_refcount(); if (0 != t) t -> incr_refcount();
} }
static void free_if_unref(__rope_RopeBase* t)
{
if (0 != t && 0 == t -> refcount) t -> free_tree();
}
# else /* __GC */ # else /* __GC */
void unref_nonnil() {} void unref_nonnil() {}
void ref_nonnil() {} void ref_nonnil() {}
static void unref(__rope_RopeBase* t) {} static void unref(__rope_RopeBase* t) {}
static void ref(__rope_RopeBase* t) {} static void ref(__rope_RopeBase* t) {}
static void fn_finalization_proc(void * tree, void *); static void fn_finalization_proc(void * tree, void *);
static void free_if_unref(__rope_RopeBase* t) {}
# endif # endif
// The data fields of leaves are allocated with some // The data fields of leaves are allocated with some
...@@ -384,9 +390,9 @@ struct __rope_RopeBase { ...@@ -384,9 +390,9 @@ struct __rope_RopeBase {
size_t size_with_eos; size_t size_with_eos;
if (__is_basic_char_type((charT *)0)) { if (__is_basic_char_type((charT *)0)) {
size_with_eos = (n + 1) * sizeof(charT); size_with_eos = n + 1;
} else { } else {
size_with_eos = n * sizeof(charT); size_with_eos = n;
} }
# ifdef __GC # ifdef __GC
return size_with_eos; return size_with_eos;
...@@ -684,6 +690,11 @@ class __rope_const_iterator : public __rope_iterator_base<charT,Alloc> { ...@@ -684,6 +690,11 @@ class __rope_const_iterator : public __rope_iterator_base<charT,Alloc> {
const_cast<RopeBase *>(root), pos) const_cast<RopeBase *>(root), pos)
// Only nonconst iterators modify root ref count // Only nonconst iterators modify root ref count
{} {}
public:
typedef charT reference; // Really a value. Returning a reference
// Would be a mess, since it would have
// to be included in refcount.
typedef const charT* pointer;
public: public:
__rope_const_iterator() {}; __rope_const_iterator() {};
...@@ -702,7 +713,7 @@ class __rope_const_iterator : public __rope_iterator_base<charT,Alloc> { ...@@ -702,7 +713,7 @@ class __rope_const_iterator : public __rope_iterator_base<charT,Alloc> {
} }
return(*this); return(*this);
} }
const charT& operator*() { reference operator*() {
if (0 == buf_ptr) setcache(*this); if (0 == buf_ptr) setcache(*this);
return *buf_ptr; return *buf_ptr;
} }
...@@ -758,7 +769,7 @@ class __rope_const_iterator : public __rope_iterator_base<charT,Alloc> { ...@@ -758,7 +769,7 @@ class __rope_const_iterator : public __rope_iterator_base<charT,Alloc> {
friend __rope_const_iterator<charT,Alloc> operator+ friend __rope_const_iterator<charT,Alloc> operator+
(ptrdiff_t n, (ptrdiff_t n,
const __rope_const_iterator<charT,Alloc> & x); const __rope_const_iterator<charT,Alloc> & x);
charT operator[](size_t n) { reference operator[](size_t n) {
return rope<charT,Alloc>::fetch(root, current_pos + n); return rope<charT,Alloc>::fetch(root, current_pos + n);
} }
friend bool operator== friend bool operator==
...@@ -791,6 +802,10 @@ class __rope_iterator : public __rope_iterator_base<charT,Alloc> { ...@@ -791,6 +802,10 @@ class __rope_iterator : public __rope_iterator_base<charT,Alloc> {
} }
void check(); void check();
public: public:
typedef __rope_charT_ref_proxy<charT,Alloc> reference;
typedef __rope_charT_ref_proxy<charT,Alloc>* pointer;
public:
rope<charT,Alloc>& container() { return *root_rope; } rope<charT,Alloc>& container() { return *root_rope; }
__rope_iterator() { __rope_iterator() {
root = 0; // Needed for reference counting. root = 0; // Needed for reference counting.
...@@ -819,7 +834,7 @@ class __rope_iterator : public __rope_iterator_base<charT,Alloc> { ...@@ -819,7 +834,7 @@ class __rope_iterator : public __rope_iterator_base<charT,Alloc> {
RopeBase::unref(old); RopeBase::unref(old);
return(*this); return(*this);
} }
__rope_charT_ref_proxy<charT,Alloc> operator*() { reference operator*() {
check(); check();
if (0 == buf_ptr) { if (0 == buf_ptr) {
return __rope_charT_ref_proxy<charT,Alloc>(root_rope, current_pos); return __rope_charT_ref_proxy<charT,Alloc>(root_rope, current_pos);
...@@ -862,7 +877,7 @@ class __rope_iterator : public __rope_iterator_base<charT,Alloc> { ...@@ -862,7 +877,7 @@ class __rope_iterator : public __rope_iterator_base<charT,Alloc> {
decr(1); decr(1);
return __rope_iterator<charT,Alloc>(root_rope, old_pos); return __rope_iterator<charT,Alloc>(root_rope, old_pos);
} }
__rope_charT_ref_proxy<charT,Alloc> operator[](ptrdiff_t n) { reference operator[](ptrdiff_t n) {
return __rope_charT_ref_proxy<charT,Alloc>(root_rope, current_pos + n); return __rope_charT_ref_proxy<charT,Alloc>(root_rope, current_pos + n);
} }
friend bool operator== friend bool operator==
...@@ -892,7 +907,7 @@ class rope { ...@@ -892,7 +907,7 @@ class rope {
typedef charT value_type; typedef charT value_type;
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
typedef size_t size_type; typedef size_t size_type;
typedef const charT& const_reference; typedef charT const_reference;
typedef const charT* const_pointer; typedef const charT* const_pointer;
typedef __rope_iterator<charT,Alloc> iterator; typedef __rope_iterator<charT,Alloc> iterator;
typedef __rope_const_iterator<charT,Alloc> const_iterator; typedef __rope_const_iterator<charT,Alloc> const_iterator;
...@@ -945,6 +960,7 @@ class rope { ...@@ -945,6 +960,7 @@ class rope {
static charT empty_c_str[1]; static charT empty_c_str[1];
typedef simple_alloc<charT, Alloc> DataAlloc;
typedef simple_alloc<__rope_RopeConcatenation<charT,Alloc>, Alloc> CAlloc; typedef simple_alloc<__rope_RopeConcatenation<charT,Alloc>, Alloc> CAlloc;
typedef simple_alloc<__rope_RopeLeaf<charT,Alloc>, Alloc> LAlloc; typedef simple_alloc<__rope_RopeLeaf<charT,Alloc>, Alloc> LAlloc;
typedef simple_alloc<__rope_RopeFunction<charT,Alloc>, Alloc> FAlloc; typedef simple_alloc<__rope_RopeFunction<charT,Alloc>, Alloc> FAlloc;
...@@ -1054,8 +1070,7 @@ class rope { ...@@ -1054,8 +1070,7 @@ class rope {
// Adds a trailing NULL for basic char types. // Adds a trailing NULL for basic char types.
static charT * alloc_copy(const charT *s, size_t size) static charT * alloc_copy(const charT *s, size_t size)
{ {
charT * result = (charT *) charT * result = DataAlloc::allocate(rounded_up_size(size));
Alloc::allocate(rounded_up_size(size));
uninitialized_copy_n(s, size, result); uninitialized_copy_n(s, size, result);
__cond_store_eos(result[size]); __cond_store_eos(result[size]);
...@@ -1073,6 +1088,15 @@ class rope { ...@@ -1073,6 +1088,15 @@ class rope {
// In the nonGC case, it was allocated from Alloc with // In the nonGC case, it was allocated from Alloc with
// rounded_up_size(size). // rounded_up_size(size).
static RopeLeaf * RopeLeaf_from_unowned_char_ptr(const charT *s,
size_t size) {
charT * buf = alloc_copy(s, size);
__STL_TRY
return RopeLeaf_from_char_ptr(buf, size);
__STL_UNWIND(RopeBase::free_string(buf, size))
}
// Concatenation of nonempty strings. // Concatenation of nonempty strings.
// Always builds a concatenation node. // Always builds a concatenation node.
// Rebalances if the result is too deep. // Rebalances if the result is too deep.
...@@ -1107,24 +1131,14 @@ class rope { ...@@ -1107,24 +1131,14 @@ class rope {
friend struct rope<charT,Alloc>::concat_fn; friend struct rope<charT,Alloc>::concat_fn;
struct concat_fn struct concat_fn
: binary_function<RopeBase *, RopeBase *, RopeBase *> { : binary_function<rope<charT,Alloc>, rope<charT,Alloc>,
RopeBase * operator() (RopeBase * x, RopeBase *y) { rope<charT,Alloc> > {
RopeBase * result; rope operator() (const rope& x, const rope& y) {
x -> ref_nonnil(); return x + y;
y -> ref_nonnil();
__STL_TRY
result = tree_concat(x, y);
# ifndef __GC
result -> refcount = 0;
# endif
__STL_UNWIND(unref(x); unref(y));
return result;
// In the nonGC case, x and y must remain accessible through
// the result. Use of concat could result on a memory leak.
} }
}; };
friend RopeBase* identity_element(concat_fn) { return 0; } friend rope identity_element(concat_fn) { return rope<charT,Alloc>(); }
static size_t char_ptr_len(const charT * s); static size_t char_ptr_len(const charT * s);
// slightly generalized strlen // slightly generalized strlen
...@@ -1202,7 +1216,7 @@ class rope { ...@@ -1202,7 +1216,7 @@ class rope {
if (0 == len) { if (0 == len) {
tree_ptr = 0; tree_ptr = 0;
} else { } else {
tree_ptr = RopeLeaf_from_char_ptr(alloc_copy(s, len), len); tree_ptr = RopeLeaf_from_unowned_char_ptr(s, len);
# ifndef __GC # ifndef __GC
__stl_assert(1 == tree_ptr -> refcount); __stl_assert(1 == tree_ptr -> refcount);
# endif # endif
...@@ -1214,7 +1228,7 @@ class rope { ...@@ -1214,7 +1228,7 @@ class rope {
if (0 == len) { if (0 == len) {
tree_ptr = 0; tree_ptr = 0;
} else { } else {
tree_ptr = RopeLeaf_from_char_ptr(alloc_copy(s, len), len); tree_ptr = RopeLeaf_from_unowned_char_ptr(s, len);
} }
} }
...@@ -1225,7 +1239,7 @@ class rope { ...@@ -1225,7 +1239,7 @@ class rope {
if (0 == len) { if (0 == len) {
tree_ptr = 0; tree_ptr = 0;
} else { } else {
tree_ptr = RopeLeaf_from_char_ptr(alloc_copy(s, len), len); tree_ptr = RopeLeaf_from_unowned_char_ptr(s, len);
} }
} }
...@@ -1241,10 +1255,12 @@ class rope { ...@@ -1241,10 +1255,12 @@ class rope {
rope(charT c) rope(charT c)
{ {
charT * buf = (charT *)Alloc::allocate(rounded_up_size(1)); charT * buf = DataAlloc::allocate(rounded_up_size(1));
construct(buf, c); construct(buf, c);
__STL_TRY
tree_ptr = RopeLeaf_from_char_ptr(buf, 1); tree_ptr = RopeLeaf_from_char_ptr(buf, 1);
__STL_UNWIND(RopeBase::free_string(buf, 1))
} }
rope(size_t n, charT c); rope(size_t n, charT c);
...@@ -1258,7 +1274,7 @@ class rope { ...@@ -1258,7 +1274,7 @@ class rope {
tree_ptr = 0; tree_ptr = 0;
} else { } else {
size_t len = j - i; size_t len = j - i;
tree_ptr = RopeLeaf_from_char_ptr(alloc_copy(i, len), len); tree_ptr = RopeLeaf_from_unowned_char_ptr(i, len);
} }
} }
...@@ -1312,15 +1328,12 @@ class rope { ...@@ -1312,15 +1328,12 @@ class rope {
return fetch(tree_ptr, tree_ptr -> size - 1); return fetch(tree_ptr, tree_ptr -> size - 1);
} }
void push_front(const charT& x) void push_front(charT x)
{ {
RopeBase *old = tree_ptr; RopeBase *old = tree_ptr;
charT *buf = alloc_copy(&x, 1);
RopeBase *left; RopeBase *left;
__STL_TRY left = RopeLeaf_from_unowned_char_ptr(&x, 1);
left = RopeLeaf_from_char_ptr(buf, 1);
__STL_UNWIND(RopeBase::free_string(buf, 1))
__STL_TRY __STL_TRY
tree_ptr = concat(left, tree_ptr); tree_ptr = concat(left, tree_ptr);
unref(old); unref(old);
...@@ -1436,8 +1449,12 @@ class rope { ...@@ -1436,8 +1449,12 @@ class rope {
// but it's harder to make guarantees. // but it's harder to make guarantees.
} }
# ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
typedef reverse_iterator<const_iterator> const_reverse_iterator;
# else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
typedef reverse_iterator<const_iterator, value_type, const_reference, typedef reverse_iterator<const_iterator, value_type, const_reference,
difference_type> const_reverse_iterator; difference_type> const_reverse_iterator;
# endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
const_reverse_iterator rbegin() const { const_reverse_iterator rbegin() const {
return const_reverse_iterator(end()); return const_reverse_iterator(end());
...@@ -1794,8 +1811,12 @@ class rope { ...@@ -1794,8 +1811,12 @@ class rope {
return(iterator(this, size())); return(iterator(this, size()));
} }
# ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
typedef reverse_iterator<iterator> reverse_iterator;
# else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
typedef reverse_iterator<iterator, value_type, reference, typedef reverse_iterator<iterator, value_type, reference,
difference_type> reverse_iterator; difference_type> reverse_iterator;
# endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
reverse_iterator mutable_rbegin() { reverse_iterator mutable_rbegin() {
return reverse_iterator(mutable_end()); return reverse_iterator(mutable_end());
......
...@@ -99,24 +99,27 @@ struct __slist_iterator_base ...@@ -99,24 +99,27 @@ struct __slist_iterator_base
} }
}; };
template <class T, class Ref> template <class T, class Ref, class Ptr>
struct __slist_iterator : public __slist_iterator_base struct __slist_iterator : public __slist_iterator_base
{ {
typedef __slist_iterator<T, T&> iterator; typedef __slist_iterator<T, T&, T*> iterator;
typedef __slist_iterator<T, const T&> const_iterator; typedef __slist_iterator<T, const T&, const T*> const_iterator;
typedef __slist_iterator<T, Ref> self; typedef __slist_iterator<T, Ref, Ptr> self;
typedef T value_type; typedef T value_type;
typedef value_type* pointer; typedef Ptr pointer;
typedef value_type& reference; typedef Ref reference;
typedef const value_type& const_reference;
typedef __slist_node<T> list_node; typedef __slist_node<T> list_node;
__slist_iterator(list_node* x) : __slist_iterator_base(x) {} __slist_iterator(list_node* x) : __slist_iterator_base(x) {}
__slist_iterator() : __slist_iterator_base(0) {} __slist_iterator() : __slist_iterator_base(0) {}
__slist_iterator(const iterator& x) : __slist_iterator_base(x.node) {} __slist_iterator(const iterator& x) : __slist_iterator_base(x.node) {}
Ref operator*() const { return ((list_node*) node)->data; } reference operator*() const { return ((list_node*) node)->data; }
#ifndef __SGI_STL_NO_ARROW_OPERATOR
pointer operator->() const { return &(operator*()); }
#endif /* __SGI_STL_NO_ARROW_OPERATOR */
self& operator++() self& operator++()
{ {
incr(); incr();
...@@ -130,6 +133,8 @@ struct __slist_iterator : public __slist_iterator_base ...@@ -130,6 +133,8 @@ struct __slist_iterator : public __slist_iterator_base
} }
}; };
#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
inline ptrdiff_t* inline ptrdiff_t*
distance_type(const __slist_iterator_base&) distance_type(const __slist_iterator_base&)
{ {
...@@ -142,12 +147,14 @@ iterator_category(const __slist_iterator_base&) ...@@ -142,12 +147,14 @@ iterator_category(const __slist_iterator_base&)
return forward_iterator_tag(); return forward_iterator_tag();
} }
template <class T, class Ref> template <class T, class Ref, class Ptr>
inline T* inline T*
value_type(const __slist_iterator<T, Ref>&) { value_type(const __slist_iterator<T, Ref, Ptr>&) {
return 0; return 0;
} }
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
inline size_t __slist_size(__slist_node_base* node) inline size_t __slist_size(__slist_node_base* node)
{ {
size_t result = 0; size_t result = 0;
...@@ -167,8 +174,8 @@ public: ...@@ -167,8 +174,8 @@ public:
typedef size_t size_type; typedef size_t size_type;
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
typedef __slist_iterator<T, reference> iterator; typedef __slist_iterator<T, T&, T*> iterator;
typedef __slist_iterator<T, const_reference> const_iterator; typedef __slist_iterator<T, const T&, const T*> const_iterator;
private: private:
typedef __slist_node<T> list_node; typedef __slist_node<T> list_node;
......
...@@ -47,14 +47,16 @@ ...@@ -47,14 +47,16 @@
// (9) Defines __STL_NON_TYPE_TMPL_PARAM_BUG if the compiler has // (9) Defines __STL_NON_TYPE_TMPL_PARAM_BUG if the compiler has
// trouble performing function template argument deduction for // trouble performing function template argument deduction for
// non-type template parameters. // non-type template parameters.
// (10) Defines __STL_USE_EXCEPTIONS if the compiler (in the current // (10) Defines __SGI_STL_NO_ARROW_OPERATOR if the compiler is unable
// to support the -> operator for iterators.
// (11) Defines __STL_USE_EXCEPTIONS if the compiler (in the current
// compilation mode) supports exceptions. // compilation mode) supports exceptions.
// (11) Defines __STL_SGI_THREADS if this is being compiled on an SGI // (12) Defines __STL_SGI_THREADS if this is being compiled on an SGI
// compiler, and if the user hasn't selected pthreads or no threads // compiler, and if the user hasn't selected pthreads or no threads
// instead. // instead.
// (12) Defines __STL_WIN32THREADS if this is being compiled on a // (13) Defines __STL_WIN32THREADS if this is being compiled on a
// WIN32 compiler in multithreaded mode. // WIN32 compiler in multithreaded mode.
// (13) Defines __stl_assert either as a test or as a null macro, // (14) Defines __stl_assert either as a test or as a null macro,
// depending on whether or not __STL_ASSERTIONS is defined. // depending on whether or not __STL_ASSERTIONS is defined.
# if defined(__sgi) && !defined(__GNUC__) # if defined(__sgi) && !defined(__GNUC__)
...@@ -120,6 +122,7 @@ ...@@ -120,6 +122,7 @@
# define __STL_NEED_EXPLICIT # define __STL_NEED_EXPLICIT
# endif # endif
# define __STL_NON_TYPE_TMPL_PARAM_BUG # define __STL_NON_TYPE_TMPL_PARAM_BUG
# define __SGI_STL_NO_ARROW_OPERATOR
# ifdef _CPPUNWIND # ifdef _CPPUNWIND
# define __STL_USE_EXCEPTIONS # define __STL_USE_EXCEPTIONS
# endif # endif
...@@ -132,6 +135,7 @@ ...@@ -132,6 +135,7 @@
# define __STL_NO_DRAND48 # define __STL_NO_DRAND48
# define __STL_NEED_TYPENAME # define __STL_NEED_TYPENAME
# define __STL_LIMITED_DEFAULT_TEMPLATES # define __STL_LIMITED_DEFAULT_TEMPLATES
# define __SGI_STL_NO_ARROW_OPERATOR
# define __STL_NON_TYPE_TMPL_PARAM_BUG # define __STL_NON_TYPE_TMPL_PARAM_BUG
# ifdef _CPPUNWIND # ifdef _CPPUNWIND
# define __STL_USE_EXCEPTIONS # define __STL_USE_EXCEPTIONS
......
...@@ -137,23 +137,25 @@ struct __rb_tree_base_iterator ...@@ -137,23 +137,25 @@ struct __rb_tree_base_iterator
} }
}; };
template <class Value, class Ref> template <class Value, class Ref, class Ptr>
struct __rb_tree_iterator : public __rb_tree_base_iterator struct __rb_tree_iterator : public __rb_tree_base_iterator
{ {
typedef Value value_type; typedef Value value_type;
typedef Value& reference; typedef Value& reference;
typedef const Value& const_reference;
typedef Value* pointer; typedef Value* pointer;
typedef __rb_tree_iterator<Value, reference> iterator; typedef __rb_tree_iterator<Value, Value&, Value*> iterator;
typedef __rb_tree_iterator<Value, const_reference> const_iterator; typedef __rb_tree_iterator<Value, const Value&, const Value*> const_iterator;
typedef __rb_tree_iterator<Value, Ref> self; typedef __rb_tree_iterator<Value, Ref, Ptr> self;
typedef __rb_tree_node<Value>* link_type; typedef __rb_tree_node<Value>* link_type;
__rb_tree_iterator() {} __rb_tree_iterator() {}
__rb_tree_iterator(link_type x) { node = x; } __rb_tree_iterator(link_type x) { node = x; }
__rb_tree_iterator(const iterator& it) { node = it.node; } __rb_tree_iterator(const iterator& it) { node = it.node; }
Ref operator*() const { return link_type(node)->value_field; } reference operator*() const { return link_type(node)->value_field; }
#ifndef __SGI_STL_NO_ARROW_OPERATOR
pointer operator->() const { return &(operator*()); }
#endif /* __SGI_STL_NO_ARROW_OPERATOR */
self& operator++() { increment(); return *this; } self& operator++() { increment(); return *this; }
self operator++(int) { self operator++(int) {
...@@ -180,6 +182,8 @@ inline bool operator!=(const __rb_tree_base_iterator& x, ...@@ -180,6 +182,8 @@ inline bool operator!=(const __rb_tree_base_iterator& x,
return x.node != y.node; return x.node != y.node;
} }
#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
inline bidirectional_iterator_tag inline bidirectional_iterator_tag
iterator_category(const __rb_tree_base_iterator&) { iterator_category(const __rb_tree_base_iterator&) {
return bidirectional_iterator_tag(); return bidirectional_iterator_tag();
...@@ -190,11 +194,13 @@ distance_type(const __rb_tree_base_iterator&) { ...@@ -190,11 +194,13 @@ distance_type(const __rb_tree_base_iterator&) {
return (__rb_tree_base_iterator::difference_type*) 0; return (__rb_tree_base_iterator::difference_type*) 0;
} }
template <class Value, class Ref> template <class Value, class Ref, class Ptr>
inline Value* value_type(const __rb_tree_iterator<Value, Ref>&) { inline Value* value_type(const __rb_tree_iterator<Value, Ref, Ptr>&) {
return (Value*) 0; return (Value*) 0;
} }
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
inline void inline void
__rb_tree_rotate_left(__rb_tree_node_base* x, __rb_tree_node_base*& root) __rb_tree_rotate_left(__rb_tree_node_base* x, __rb_tree_node_base*& root)
{ {
...@@ -487,15 +493,21 @@ protected: ...@@ -487,15 +493,21 @@ protected:
} }
public: public:
typedef __rb_tree_iterator<value_type, reference> iterator; typedef __rb_tree_iterator<value_type, reference, pointer> iterator;
typedef __rb_tree_iterator<value_type, const_reference> const_iterator; typedef __rb_tree_iterator<value_type, const_reference, const_pointer>
const_iterator;
#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
typedef reverse_iterator<const_iterator> const_reverse_iterator;
typedef reverse_iterator<iterator> reverse_iterator;
#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
typedef reverse_bidirectional_iterator<iterator, value_type, reference, typedef reverse_bidirectional_iterator<iterator, value_type, reference,
difference_type> difference_type>
reverse_iterator; reverse_iterator;
typedef reverse_bidirectional_iterator<const_iterator, value_type, typedef reverse_bidirectional_iterator<const_iterator, value_type,
const_reference, difference_type> const_reference, difference_type>
const_reverse_iterator; const_reverse_iterator;
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
private: private:
iterator __insert(base_ptr x, base_ptr y, const value_type& v); iterator __insert(base_ptr x, base_ptr y, const value_type& v);
link_type __copy(link_type x, link_type p); link_type __copy(link_type x, link_type p);
......
...@@ -42,10 +42,16 @@ public: ...@@ -42,10 +42,16 @@ public:
typedef const value_type& const_reference; typedef const value_type& const_reference;
typedef size_t size_type; typedef size_t size_type;
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
typedef reverse_iterator<const_iterator> const_reverse_iterator;
typedef reverse_iterator<iterator> reverse_iterator;
#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
typedef reverse_iterator<const_iterator, value_type, const_reference, typedef reverse_iterator<const_iterator, value_type, const_reference,
difference_type> const_reverse_iterator; difference_type> const_reverse_iterator;
typedef reverse_iterator<iterator, value_type, reference, difference_type> typedef reverse_iterator<iterator, value_type, reference, difference_type>
reverse_iterator; reverse_iterator;
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
protected: protected:
typedef simple_alloc<value_type, Alloc> data_allocator; typedef simple_alloc<value_type, Alloc> data_allocator;
iterator start; iterator start;
...@@ -256,20 +262,6 @@ protected: ...@@ -256,20 +262,6 @@ protected:
end_of_storage = finish; end_of_storage = finish;
} }
template <class BidirectionalIterator>
void range_initialize(BidirectionalIterator first,
BidirectionalIterator last,
bidirectional_iterator_tag) {
range_initialize(first, last, forward_iterator_tag());
}
template <class RandomAccessIterator>
void range_initialize(RandomAccessIterator first,
RandomAccessIterator last,
random_access_iterator_tag) {
range_initialize(first, last, forward_iterator_tag());
}
template <class InputIterator> template <class InputIterator>
void range_insert(iterator pos, void range_insert(iterator pos,
InputIterator first, InputIterator last, InputIterator first, InputIterator last,
...@@ -280,19 +272,6 @@ protected: ...@@ -280,19 +272,6 @@ protected:
ForwardIterator first, ForwardIterator last, ForwardIterator first, ForwardIterator last,
forward_iterator_tag); forward_iterator_tag);
template <class BidirectionalIterator>
void range_insert(iterator pos,
BidirectionalIterator first, BidirectionalIterator last,
bidirectional_iterator_tag) {
range_insert(pos, first, last, forward_iterator_tag());
}
template <class RandomAccessIterator>
void range_insert(iterator pos,
RandomAccessIterator first, RandomAccessIterator last,
random_access_iterator_tag) {
range_insert(pos, first, last, forward_iterator_tag());
}
#endif /* __STL_MEMBER_TEMPLATES */ #endif /* __STL_MEMBER_TEMPLATES */
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment