@@ -136,6 +136,56 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
136
136
return __b;
137
137
}
138
138
139
+ // / Swaps the median value of *__a, *__b and *__c to *__a
140
+ template <typename _Iterator>
141
+ void
142
+ __move_median_first (_Iterator __a, _Iterator __b, _Iterator __c)
143
+ {
144
+ // concept requirements
145
+ __glibcxx_function_requires (_LessThanComparableConcept<
146
+ typename iterator_traits<_Iterator>::value_type>)
147
+
148
+ if (*__a < *__b)
149
+ {
150
+ if (*__b < *__c)
151
+ std::iter_swap (__a, __b);
152
+ else if (*__a < *__c)
153
+ std::iter_swap (__a, __c);
154
+ }
155
+ else if (*__a < *__c)
156
+ return ;
157
+ else if (*__b < *__c)
158
+ std::iter_swap (__a, __c);
159
+ else
160
+ std::iter_swap (__a, __b);
161
+ }
162
+
163
+ // / Swaps the median value of *__a, *__b and *__c under __comp to *__a
164
+ template <typename _Iterator, typename _Compare>
165
+ void
166
+ __move_median_first (_Iterator __a, _Iterator __b, _Iterator __c,
167
+ _Compare __comp)
168
+ {
169
+ // concept requirements
170
+ __glibcxx_function_requires (_BinaryFunctionConcept<_Compare, bool ,
171
+ typename iterator_traits<_Iterator>::value_type,
172
+ typename iterator_traits<_Iterator>::value_type>)
173
+
174
+ if (__comp (*__a, *__b))
175
+ {
176
+ if (__comp (*__b, *__c))
177
+ std::iter_swap (__a, __b);
178
+ else if (__comp (*__a, *__c))
179
+ std::iter_swap (__a, __c);
180
+ }
181
+ else if (__comp (*__a, *__c))
182
+ return ;
183
+ else if (__comp (*__b, *__c))
184
+ std::iter_swap (__a, __c);
185
+ else
186
+ std::iter_swap (__a, __b);
187
+ }
188
+
139
189
// for_each
140
190
141
191
// / This is an overload used by find() for the Input Iterator case.
@@ -2058,36 +2108,40 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2058
2108
}
2059
2109
2060
2110
// / This is a helper function for the sort routine.
2061
- template <typename _RandomAccessIterator, typename _Tp >
2111
+ template <typename _RandomAccessIterator>
2062
2112
void
2063
- __unguarded_linear_insert (_RandomAccessIterator __last, _Tp __val )
2113
+ __unguarded_linear_insert (_RandomAccessIterator __last)
2064
2114
{
2115
+ typename iterator_traits<_RandomAccessIterator>::value_type
2116
+ __val = _GLIBCXX_MOVE (*__last);
2065
2117
_RandomAccessIterator __next = __last;
2066
2118
--__next;
2067
2119
while (__val < *__next)
2068
2120
{
2069
- *__last = *__next;
2121
+ *__last = _GLIBCXX_MOVE ( *__next) ;
2070
2122
__last = __next;
2071
2123
--__next;
2072
2124
}
2073
- *__last = __val;
2125
+ *__last = _GLIBCXX_MOVE ( __val) ;
2074
2126
}
2075
2127
2076
2128
// / This is a helper function for the sort routine.
2077
- template <typename _RandomAccessIterator, typename _Tp, typename _Compare>
2129
+ template <typename _RandomAccessIterator, typename _Compare>
2078
2130
void
2079
- __unguarded_linear_insert (_RandomAccessIterator __last, _Tp __val,
2131
+ __unguarded_linear_insert (_RandomAccessIterator __last,
2080
2132
_Compare __comp)
2081
2133
{
2134
+ typename iterator_traits<_RandomAccessIterator>::value_type
2135
+ __val = _GLIBCXX_MOVE (*__last);
2082
2136
_RandomAccessIterator __next = __last;
2083
2137
--__next;
2084
2138
while (__comp (__val, *__next))
2085
2139
{
2086
- *__last = *__next;
2140
+ *__last = _GLIBCXX_MOVE ( *__next) ;
2087
2141
__last = __next;
2088
2142
--__next;
2089
2143
}
2090
- *__last = __val;
2144
+ *__last = _GLIBCXX_MOVE ( __val) ;
2091
2145
}
2092
2146
2093
2147
// / This is a helper function for the sort routine.
@@ -2101,15 +2155,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2101
2155
2102
2156
for (_RandomAccessIterator __i = __first + 1 ; __i != __last; ++__i)
2103
2157
{
2104
- typename iterator_traits<_RandomAccessIterator>::value_type
2105
- __val = *__i;
2106
- if (__val < *__first)
2158
+ if (*__i < *__first)
2107
2159
{
2108
- std::copy_backward (__first, __i, __i + 1 );
2109
- *__first = __val;
2160
+ typename iterator_traits<_RandomAccessIterator>::value_type
2161
+ __val = _GLIBCXX_MOVE (*__i);
2162
+ _GLIBCXX_MOVE_BACKWARD3 (__first, __i, __i + 1 );
2163
+ *__first = _GLIBCXX_MOVE (__val);
2110
2164
}
2111
2165
else
2112
- std::__unguarded_linear_insert (__i, __val );
2166
+ std::__unguarded_linear_insert (__i);
2113
2167
}
2114
2168
}
2115
2169
@@ -2123,15 +2177,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2123
2177
2124
2178
for (_RandomAccessIterator __i = __first + 1 ; __i != __last; ++__i)
2125
2179
{
2126
- typename iterator_traits<_RandomAccessIterator>::value_type
2127
- __val = *__i;
2128
- if (__comp (__val, *__first))
2180
+ if (__comp (*__i, *__first))
2129
2181
{
2130
- std::copy_backward (__first, __i, __i + 1 );
2131
- *__first = __val;
2182
+ typename iterator_traits<_RandomAccessIterator>::value_type
2183
+ __val = _GLIBCXX_MOVE (*__i);
2184
+ _GLIBCXX_MOVE_BACKWARD3 (__first, __i, __i + 1 );
2185
+ *__first = _GLIBCXX_MOVE (__val);
2132
2186
}
2133
2187
else
2134
- std::__unguarded_linear_insert (__i, __val, __comp);
2188
+ std::__unguarded_linear_insert (__i, __comp);
2135
2189
}
2136
2190
}
2137
2191
@@ -2145,7 +2199,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2145
2199
_ValueType;
2146
2200
2147
2201
for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
2148
- std::__unguarded_linear_insert (__i, _ValueType (*__i) );
2202
+ std::__unguarded_linear_insert (__i);
2149
2203
}
2150
2204
2151
2205
// / This is a helper function for the sort routine.
@@ -2158,7 +2212,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2158
2212
_ValueType;
2159
2213
2160
2214
for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
2161
- std::__unguarded_linear_insert (__i, _ValueType (*__i), __comp);
2215
+ std::__unguarded_linear_insert (__i, __comp);
2162
2216
}
2163
2217
2164
2218
/* *
@@ -2202,7 +2256,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2202
2256
template <typename _RandomAccessIterator, typename _Tp>
2203
2257
_RandomAccessIterator
2204
2258
__unguarded_partition (_RandomAccessIterator __first,
2205
- _RandomAccessIterator __last, _Tp __pivot)
2259
+ _RandomAccessIterator __last, const _Tp& __pivot)
2206
2260
{
2207
2261
while (true )
2208
2262
{
@@ -2223,7 +2277,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2223
2277
_RandomAccessIterator
2224
2278
__unguarded_partition (_RandomAccessIterator __first,
2225
2279
_RandomAccessIterator __last,
2226
- _Tp __pivot, _Compare __comp)
2280
+ const _Tp& __pivot, _Compare __comp)
2227
2281
{
2228
2282
while (true )
2229
2283
{
@@ -2239,16 +2293,36 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2239
2293
}
2240
2294
}
2241
2295
2296
+ // / This is a helper function...
2297
+ template <typename _RandomAccessIterator>
2298
+ inline _RandomAccessIterator
2299
+ __unguarded_partition_pivot (_RandomAccessIterator __first,
2300
+ _RandomAccessIterator __last)
2301
+ {
2302
+ _RandomAccessIterator __mid = __first + (__last - __first) / 2 ;
2303
+ std::__move_median_first (__first, __mid, (__last - 1 ));
2304
+ return std::__unguarded_partition (__first + 1 , __last, *__first);
2305
+ }
2306
+
2307
+
2308
+ // / This is a helper function...
2309
+ template <typename _RandomAccessIterator, typename _Compare>
2310
+ inline _RandomAccessIterator
2311
+ __unguarded_partition_pivot (_RandomAccessIterator __first,
2312
+ _RandomAccessIterator __last, _Compare __comp)
2313
+ {
2314
+ _RandomAccessIterator __mid = __first + (__last - __first) / 2 ;
2315
+ std::__move_median_first (__first, __mid, (__last - 1 ), __comp);
2316
+ return std::__unguarded_partition (__first + 1 , __last, *__first, __comp);
2317
+ }
2318
+
2242
2319
// / This is a helper function for the sort routine.
2243
2320
template <typename _RandomAccessIterator, typename _Size>
2244
2321
void
2245
2322
__introsort_loop (_RandomAccessIterator __first,
2246
2323
_RandomAccessIterator __last,
2247
2324
_Size __depth_limit)
2248
2325
{
2249
- typedef typename iterator_traits<_RandomAccessIterator>::value_type
2250
- _ValueType;
2251
-
2252
2326
while (__last - __first > int (_S_threshold))
2253
2327
{
2254
2328
if (__depth_limit == 0 )
@@ -2258,14 +2332,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2258
2332
}
2259
2333
--__depth_limit;
2260
2334
_RandomAccessIterator __cut =
2261
- std::__unguarded_partition (__first, __last,
2262
- _ValueType (std::__median (*__first,
2263
- *(__first
2264
- + (__last
2265
- - __first)
2266
- / 2 ),
2267
- *(__last
2268
- - 1 ))));
2335
+ std::__unguarded_partition_pivot (__first, __last);
2269
2336
std::__introsort_loop (__cut, __last, __depth_limit);
2270
2337
__last = __cut;
2271
2338
}
@@ -2278,9 +2345,6 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2278
2345
_RandomAccessIterator __last,
2279
2346
_Size __depth_limit, _Compare __comp)
2280
2347
{
2281
- typedef typename iterator_traits<_RandomAccessIterator>::value_type
2282
- _ValueType;
2283
-
2284
2348
while (__last - __first > int (_S_threshold))
2285
2349
{
2286
2350
if (__depth_limit == 0 )
@@ -2290,15 +2354,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2290
2354
}
2291
2355
--__depth_limit;
2292
2356
_RandomAccessIterator __cut =
2293
- std::__unguarded_partition (__first, __last,
2294
- _ValueType (std::__median (*__first,
2295
- *(__first
2296
- + (__last
2297
- - __first)
2298
- / 2 ),
2299
- *(__last - 1 ),
2300
- __comp)),
2301
- __comp);
2357
+ std::__unguarded_partition_pivot (__first, __last, __comp);
2302
2358
std::__introsort_loop (__cut, __last, __depth_limit, __comp);
2303
2359
__last = __cut;
2304
2360
}
@@ -2349,14 +2405,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2349
2405
}
2350
2406
--__depth_limit;
2351
2407
_RandomAccessIterator __cut =
2352
- std::__unguarded_partition (__first, __last,
2353
- _ValueType (std::__median (*__first,
2354
- *(__first
2355
- + (__last
2356
- - __first)
2357
- / 2 ),
2358
- *(__last
2359
- - 1 ))));
2408
+ std::__unguarded_partition_pivot (__first, __last);
2360
2409
if (__cut <= __nth)
2361
2410
__first = __cut;
2362
2411
else
@@ -2385,15 +2434,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
2385
2434
}
2386
2435
--__depth_limit;
2387
2436
_RandomAccessIterator __cut =
2388
- std::__unguarded_partition (__first, __last,
2389
- _ValueType (std::__median (*__first,
2390
- *(__first
2391
- + (__last
2392
- - __first)
2393
- / 2 ),
2394
- *(__last - 1 ),
2395
- __comp)),
2396
- __comp);
2437
+ std::__unguarded_partition_pivot (__first, __last, __comp);
2397
2438
if (__cut <= __nth)
2398
2439
__first = __cut;
2399
2440
else
0 commit comments