epoc32/include/stdapis/stlport/stl/_heap.c
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@4
     1
/*
williamr@4
     2
 *
williamr@4
     3
 *
williamr@4
     4
 * Copyright (c) 1994
williamr@4
     5
 * Hewlett-Packard Company
williamr@4
     6
 *
williamr@4
     7
 * Copyright (c) 1996,1997
williamr@4
     8
 * Silicon Graphics Computer Systems, Inc.
williamr@4
     9
 *
williamr@4
    10
 * Copyright (c) 1997
williamr@4
    11
 * Moscow Center for SPARC Technology
williamr@4
    12
 *
williamr@4
    13
 * Copyright (c) 1999 
williamr@4
    14
 * Boris Fomitchev
williamr@4
    15
 *
williamr@4
    16
 * This material is provided "as is", with absolutely no warranty expressed
williamr@4
    17
 * or implied. Any use is at your own risk.
williamr@4
    18
 *
williamr@4
    19
 * Permission to use or copy this software for any purpose is hereby granted 
williamr@4
    20
 * without fee, provided the above notices are retained on all copies.
williamr@4
    21
 * Permission to modify the code and to distribute modified code is granted,
williamr@4
    22
 * provided the above notices are retained, and a notice that the code was
williamr@4
    23
 * modified is included with the above copyright notice.
williamr@4
    24
 *
williamr@4
    25
 */
williamr@4
    26
#ifndef _STLP_HEAP_C
williamr@4
    27
#define _STLP_HEAP_C
williamr@4
    28
williamr@4
    29
#ifndef _STLP_INTERNAL_HEAP_H
williamr@4
    30
# include <stl/_heap.h>
williamr@4
    31
#endif
williamr@4
    32
williamr@4
    33
#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
williamr@4
    34
# include <stl/_iterator_base.h>
williamr@4
    35
#endif
williamr@4
    36
williamr@4
    37
_STLP_BEGIN_NAMESPACE
williamr@4
    38
williamr@4
    39
template <class _RandomAccessIterator, class _Distance, class _Tp>
williamr@4
    40
_STLP_INLINE_LOOP
williamr@4
    41
void 
williamr@4
    42
__push_heap(_RandomAccessIterator __first,
williamr@4
    43
            _Distance __holeIndex, _Distance __topIndex, _Tp __val)
williamr@4
    44
{
williamr@4
    45
  _Distance __parent = (__holeIndex - 1) / 2;
williamr@4
    46
  while (__holeIndex > __topIndex && *(__first + __parent) < __val) {
williamr@4
    47
    *(__first + __holeIndex) = *(__first + __parent);
williamr@4
    48
    __holeIndex = __parent;
williamr@4
    49
    __parent = (__holeIndex - 1) / 2;
williamr@4
    50
  }    
williamr@4
    51
  *(__first + __holeIndex) = __val;
williamr@4
    52
}
williamr@4
    53
williamr@4
    54
template <class _RandomAccessIterator, class _Distance, class _Tp>
williamr@4
    55
inline void 
williamr@4
    56
__push_heap_aux(_RandomAccessIterator __first,
williamr@4
    57
                _RandomAccessIterator __last, _Distance*, _Tp*)
williamr@4
    58
{
williamr@4
    59
  __push_heap(__first, _Distance((__last - __first) - 1), _Distance(0), 
williamr@4
    60
              _Tp(*(__last - 1)));
williamr@4
    61
}
williamr@4
    62
williamr@4
    63
template <class _RandomAccessIterator>
williamr@4
    64
void 
williamr@4
    65
push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
williamr@4
    66
{
williamr@4
    67
  __push_heap_aux(__first, __last,
williamr@4
    68
                  _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator), _STLP_VALUE_TYPE(__first, _RandomAccessIterator));
williamr@4
    69
}
williamr@4
    70
williamr@4
    71
williamr@4
    72
template <class _RandomAccessIterator, class _Distance, class _Tp, 
williamr@4
    73
          class _Compare>
williamr@4
    74
_STLP_INLINE_LOOP
williamr@4
    75
void
williamr@4
    76
__push_heap(_RandomAccessIterator __first, _Distance __holeIndex,
williamr@4
    77
            _Distance __topIndex, _Tp __val, _Compare __comp)
williamr@4
    78
{
williamr@4
    79
  _Distance __parent = (__holeIndex - 1) / 2;
williamr@4
    80
  while (__holeIndex > __topIndex && __comp(*(__first + __parent), __val)) {
williamr@4
    81
    *(__first + __holeIndex) = *(__first + __parent);
williamr@4
    82
    __holeIndex = __parent;
williamr@4
    83
    __parent = (__holeIndex - 1) / 2;
williamr@4
    84
  }
williamr@4
    85
  *(__first + __holeIndex) = __val;
williamr@4
    86
}
williamr@4
    87
williamr@4
    88
template <class _RandomAccessIterator, class _Compare,
williamr@4
    89
          class _Distance, class _Tp>
williamr@4
    90
inline void 
williamr@4
    91
__push_heap_aux(_RandomAccessIterator __first,
williamr@4
    92
                _RandomAccessIterator __last, _Compare __comp,
williamr@4
    93
                _Distance*, _Tp*) 
williamr@4
    94
{
williamr@4
    95
  __push_heap(__first, _Distance((__last - __first) - 1), _Distance(0), 
williamr@4
    96
              _Tp(*(__last - 1)), __comp);
williamr@4
    97
}
williamr@4
    98
williamr@4
    99
template <class _RandomAccessIterator, class _Compare>
williamr@4
   100
void 
williamr@4
   101
push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
williamr@4
   102
          _Compare __comp) 
williamr@4
   103
{
williamr@4
   104
  __push_heap_aux(__first, __last, __comp,
williamr@4
   105
                  _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator), _STLP_VALUE_TYPE(__first, _RandomAccessIterator));
williamr@4
   106
}
williamr@4
   107
williamr@4
   108
template <class _RandomAccessIterator, class _Distance, class _Tp>
williamr@4
   109
void 
williamr@4
   110
__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
williamr@4
   111
              _Distance __len, _Tp __val) {
williamr@4
   112
  _Distance __topIndex = __holeIndex;
williamr@4
   113
  _Distance __secondChild = 2 * __holeIndex + 2;
williamr@4
   114
  while (__secondChild < __len) {
williamr@4
   115
    if (*(__first + __secondChild) < *(__first + (__secondChild - 1)))
williamr@4
   116
      __secondChild--;
williamr@4
   117
    *(__first + __holeIndex) = *(__first + __secondChild);
williamr@4
   118
    __holeIndex = __secondChild;
williamr@4
   119
    __secondChild = 2 * (__secondChild + 1);
williamr@4
   120
  }
williamr@4
   121
  if (__secondChild == __len) {
williamr@4
   122
    *(__first + __holeIndex) = *(__first + (__secondChild - 1));
williamr@4
   123
    __holeIndex = __secondChild - 1;
williamr@4
   124
  }
williamr@4
   125
  __push_heap(__first, __holeIndex, __topIndex, __val);
williamr@4
   126
}
williamr@4
   127
williamr@4
   128
williamr@4
   129
template <class _RandomAccessIterator, class _Tp>
williamr@4
   130
inline void 
williamr@4
   131
__pop_heap_aux(_RandomAccessIterator __first, _RandomAccessIterator __last, _Tp*) {
williamr@4
   132
  __pop_heap(__first, __last - 1, __last - 1, 
williamr@4
   133
             _Tp(*(__last - 1)), _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator));
williamr@4
   134
}
williamr@4
   135
williamr@4
   136
template <class _RandomAccessIterator>
williamr@4
   137
void pop_heap(_RandomAccessIterator __first, 
williamr@4
   138
	      _RandomAccessIterator __last) {
williamr@4
   139
  __pop_heap_aux(__first, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIterator));
williamr@4
   140
}
williamr@4
   141
williamr@4
   142
template <class _RandomAccessIterator, class _Distance,
williamr@4
   143
          class _Tp, class _Compare>
williamr@4
   144
void
williamr@4
   145
__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
williamr@4
   146
              _Distance __len, _Tp __val, _Compare __comp)
williamr@4
   147
{
williamr@4
   148
  _Distance __topIndex = __holeIndex;
williamr@4
   149
  _Distance __secondChild = 2 * __holeIndex + 2;
williamr@4
   150
  while (__secondChild < __len) {
williamr@4
   151
    if (__comp(*(__first + __secondChild), *(__first + (__secondChild - 1))))
williamr@4
   152
      __secondChild--;
williamr@4
   153
    *(__first + __holeIndex) = *(__first + __secondChild);
williamr@4
   154
    __holeIndex = __secondChild;
williamr@4
   155
    __secondChild = 2 * (__secondChild + 1);
williamr@4
   156
  }
williamr@4
   157
  if (__secondChild == __len) {
williamr@4
   158
    *(__first + __holeIndex) = *(__first + (__secondChild - 1));
williamr@4
   159
    __holeIndex = __secondChild - 1;
williamr@4
   160
  }
williamr@4
   161
  __push_heap(__first, __holeIndex, __topIndex, __val, __comp);
williamr@4
   162
}
williamr@4
   163
williamr@4
   164
williamr@4
   165
template <class _RandomAccessIterator, class _Tp, class _Compare>
williamr@4
   166
inline void 
williamr@4
   167
__pop_heap_aux(_RandomAccessIterator __first,
williamr@4
   168
               _RandomAccessIterator __last, _Tp*, _Compare __comp)
williamr@4
   169
{
williamr@4
   170
  __pop_heap(__first, __last - 1, __last - 1, _Tp(*(__last - 1)), __comp,
williamr@4
   171
             _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator));
williamr@4
   172
}
williamr@4
   173
williamr@4
   174
williamr@4
   175
template <class _RandomAccessIterator, class _Compare>
williamr@4
   176
void 
williamr@4
   177
pop_heap(_RandomAccessIterator __first,
williamr@4
   178
         _RandomAccessIterator __last, _Compare __comp)
williamr@4
   179
{
williamr@4
   180
    __pop_heap_aux(__first, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIterator), __comp);
williamr@4
   181
}
williamr@4
   182
williamr@4
   183
template <class _RandomAccessIterator, class _Tp, class _Distance>
williamr@4
   184
_STLP_INLINE_LOOP
williamr@4
   185
void 
williamr@4
   186
__make_heap(_RandomAccessIterator __first,
williamr@4
   187
            _RandomAccessIterator __last, _Tp*, _Distance*)
williamr@4
   188
{
williamr@4
   189
  if (__last - __first < 2) return;
williamr@4
   190
  _Distance __len = __last - __first;
williamr@4
   191
  _Distance __parent = (__len - 2)/2;
williamr@4
   192
    
williamr@4
   193
  while (true) {
williamr@4
   194
    __adjust_heap(__first, __parent, __len, _Tp(*(__first + __parent)));
williamr@4
   195
    if (__parent == 0) return;
williamr@4
   196
    __parent--;
williamr@4
   197
  }
williamr@4
   198
}
williamr@4
   199
williamr@4
   200
template <class _RandomAccessIterator>
williamr@4
   201
void 
williamr@4
   202
make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
williamr@4
   203
{
williamr@4
   204
  __make_heap(__first, __last,
williamr@4
   205
              _STLP_VALUE_TYPE(__first, _RandomAccessIterator), _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator));
williamr@4
   206
}
williamr@4
   207
williamr@4
   208
template <class _RandomAccessIterator, class _Compare,
williamr@4
   209
          class _Tp, class _Distance>
williamr@4
   210
_STLP_INLINE_LOOP
williamr@4
   211
void
williamr@4
   212
__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
williamr@4
   213
            _Compare __comp, _Tp*, _Distance*)
williamr@4
   214
{
williamr@4
   215
  if (__last - __first < 2) return;
williamr@4
   216
  _Distance __len = __last - __first;
williamr@4
   217
  _Distance __parent = (__len - 2)/2;
williamr@4
   218
    
williamr@4
   219
  while (true) {
williamr@4
   220
    __adjust_heap(__first, __parent, __len, _Tp(*(__first + __parent)),
williamr@4
   221
                  __comp);
williamr@4
   222
    if (__parent == 0) return;
williamr@4
   223
    __parent--;
williamr@4
   224
  }
williamr@4
   225
}
williamr@4
   226
williamr@4
   227
template <class _RandomAccessIterator, class _Compare>
williamr@4
   228
void 
williamr@4
   229
make_heap(_RandomAccessIterator __first, 
williamr@4
   230
          _RandomAccessIterator __last, _Compare __comp)
williamr@4
   231
{
williamr@4
   232
  __make_heap(__first, __last, __comp,
williamr@4
   233
              _STLP_VALUE_TYPE(__first, _RandomAccessIterator), _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator));
williamr@4
   234
}
williamr@4
   235
williamr@4
   236
_STLP_END_NAMESPACE
williamr@4
   237
williamr@4
   238
#endif /*  _STLP_HEAP_C */
williamr@4
   239
williamr@4
   240
// Local Variables:
williamr@4
   241
// mode:C++
williamr@4
   242
// End: