1 | // Functor implementations -*- C++ -*- |
---|---|

2 | |

3 | // Copyright (C) 2001-2017 Free Software Foundation, Inc. |

4 | // |

5 | // This file is part of the GNU ISO C++ Library. This library is free |

6 | // software; you can redistribute it and/or modify it under the |

7 | // terms of the GNU General Public License as published by the |

8 | // Free Software Foundation; either version 3, or (at your option) |

9 | // any later version. |

10 | |

11 | // This library is distributed in the hope that it will be useful, |

12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |

13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |

14 | // GNU General Public License for more details. |

15 | |

16 | // Under Section 7 of GPL version 3, you are granted additional |

17 | // permissions described in the GCC Runtime Library Exception, version |

18 | // 3.1, as published by the Free Software Foundation. |

19 | |

20 | // You should have received a copy of the GNU General Public License and |

21 | // a copy of the GCC Runtime Library Exception along with this program; |

22 | // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |

23 | // <http://www.gnu.org/licenses/>. |

24 | |

25 | /* |

26 | * |

27 | * Copyright (c) 1994 |

28 | * Hewlett-Packard Company |

29 | * |

30 | * Permission to use, copy, modify, distribute and sell this software |

31 | * and its documentation for any purpose is hereby granted without fee, |

32 | * provided that the above copyright notice appear in all copies and |

33 | * that both that copyright notice and this permission notice appear |

34 | * in supporting documentation. Hewlett-Packard Company makes no |

35 | * representations about the suitability of this software for any |

36 | * purpose. It is provided "as is" without express or implied warranty. |

37 | * |

38 | * |

39 | * Copyright (c) 1996-1998 |

40 | * Silicon Graphics Computer Systems, Inc. |

41 | * |

42 | * Permission to use, copy, modify, distribute and sell this software |

43 | * and its documentation for any purpose is hereby granted without fee, |

44 | * provided that the above copyright notice appear in all copies and |

45 | * that both that copyright notice and this permission notice appear |

46 | * in supporting documentation. Silicon Graphics makes no |

47 | * representations about the suitability of this software for any |

48 | * purpose. It is provided "as is" without express or implied warranty. |

49 | */ |

50 | |

51 | /** @file bits/stl_function.h |

52 | * This is an internal header file, included by other library headers. |

53 | * Do not attempt to use it directly. @headername{functional} |

54 | */ |

55 | |

56 | #ifndef _STL_FUNCTION_H |

57 | #define _STL_FUNCTION_H 1 |

58 | |

59 | #if __cplusplus > 201103L |

60 | #include <bits/move.h> |

61 | #endif |

62 | |

63 | namespace std _GLIBCXX_VISIBILITY(default) |

64 | { |

65 | _GLIBCXX_BEGIN_NAMESPACE_VERSION |

66 | |

67 | // 20.3.1 base classes |

68 | /** @defgroup functors Function Objects |

69 | * @ingroup utilities |

70 | * |

71 | * Function objects, or @e functors, are objects with an @c operator() |

72 | * defined and accessible. They can be passed as arguments to algorithm |

73 | * templates and used in place of a function pointer. Not only is the |

74 | * resulting expressiveness of the library increased, but the generated |

75 | * code can be more efficient than what you might write by hand. When we |

76 | * refer to @a functors, then, generally we include function pointers in |

77 | * the description as well. |

78 | * |

79 | * Often, functors are only created as temporaries passed to algorithm |

80 | * calls, rather than being created as named variables. |

81 | * |

82 | * Two examples taken from the standard itself follow. To perform a |

83 | * by-element addition of two vectors @c a and @c b containing @c double, |

84 | * and put the result in @c a, use |

85 | * \code |

86 | * transform (a.begin(), a.end(), b.begin(), a.begin(), plus<double>()); |

87 | * \endcode |

88 | * To negate every element in @c a, use |

89 | * \code |

90 | * transform(a.begin(), a.end(), a.begin(), negate<double>()); |

91 | * \endcode |

92 | * The addition and negation functions will be inlined directly. |

93 | * |

94 | * The standard functors are derived from structs named @c unary_function |

95 | * and @c binary_function. These two classes contain nothing but typedefs, |

96 | * to aid in generic (template) programming. If you write your own |

97 | * functors, you might consider doing the same. |

98 | * |

99 | * @{ |

100 | */ |

101 | /** |

102 | * This is one of the @link functors functor base classes@endlink. |

103 | */ |

104 | template<typename _Arg, typename _Result> |

105 | struct unary_function |

106 | { |

107 | /// @c argument_type is the type of the argument |

108 | typedef _Arg argument_type; |

109 | |

110 | /// @c result_type is the return type |

111 | typedef _Result result_type; |

112 | }; |

113 | |

114 | /** |

115 | * This is one of the @link functors functor base classes@endlink. |

116 | */ |

117 | template<typename _Arg1, typename _Arg2, typename _Result> |

118 | struct binary_function |

119 | { |

120 | /// @c first_argument_type is the type of the first argument |

121 | typedef _Arg1 first_argument_type; |

122 | |

123 | /// @c second_argument_type is the type of the second argument |

124 | typedef _Arg2 second_argument_type; |

125 | |

126 | /// @c result_type is the return type |

127 | typedef _Result result_type; |

128 | }; |

129 | /** @} */ |

130 | |

131 | // 20.3.2 arithmetic |

132 | /** @defgroup arithmetic_functors Arithmetic Classes |

133 | * @ingroup functors |

134 | * |

135 | * Because basic math often needs to be done during an algorithm, |

136 | * the library provides functors for those operations. See the |

137 | * documentation for @link functors the base classes@endlink |

138 | * for examples of their use. |

139 | * |

140 | * @{ |

141 | */ |

142 | |

143 | #if __cplusplus > 201103L |

144 | struct __is_transparent; // undefined |

145 | |

146 | template<typename _Tp = void> |

147 | struct plus; |

148 | |

149 | template<typename _Tp = void> |

150 | struct minus; |

151 | |

152 | template<typename _Tp = void> |

153 | struct multiplies; |

154 | |

155 | template<typename _Tp = void> |

156 | struct divides; |

157 | |

158 | template<typename _Tp = void> |

159 | struct modulus; |

160 | |

161 | template<typename _Tp = void> |

162 | struct negate; |

163 | #endif |

164 | |

165 | /// One of the @link arithmetic_functors math functors@endlink. |

166 | template<typename _Tp> |

167 | struct plus : public binary_function<_Tp, _Tp, _Tp> |

168 | { |

169 | _GLIBCXX14_CONSTEXPR |

170 | _Tp |

171 | operator()(const _Tp& __x, const _Tp& __y) const |

172 | { return __x + __y; } |

173 | }; |

174 | |

175 | /// One of the @link arithmetic_functors math functors@endlink. |

176 | template<typename _Tp> |

177 | struct minus : public binary_function<_Tp, _Tp, _Tp> |

178 | { |

179 | _GLIBCXX14_CONSTEXPR |

180 | _Tp |

181 | operator()(const _Tp& __x, const _Tp& __y) const |

182 | { return __x - __y; } |

183 | }; |

184 | |

185 | /// One of the @link arithmetic_functors math functors@endlink. |

186 | template<typename _Tp> |

187 | struct multiplies : public binary_function<_Tp, _Tp, _Tp> |

188 | { |

189 | _GLIBCXX14_CONSTEXPR |

190 | _Tp |

191 | operator()(const _Tp& __x, const _Tp& __y) const |

192 | { return __x * __y; } |

193 | }; |

194 | |

195 | /// One of the @link arithmetic_functors math functors@endlink. |

196 | template<typename _Tp> |

197 | struct divides : public binary_function<_Tp, _Tp, _Tp> |

198 | { |

199 | _GLIBCXX14_CONSTEXPR |

200 | _Tp |

201 | operator()(const _Tp& __x, const _Tp& __y) const |

202 | { return __x / __y; } |

203 | }; |

204 | |

205 | /// One of the @link arithmetic_functors math functors@endlink. |

206 | template<typename _Tp> |

207 | struct modulus : public binary_function<_Tp, _Tp, _Tp> |

208 | { |

209 | _GLIBCXX14_CONSTEXPR |

210 | _Tp |

211 | operator()(const _Tp& __x, const _Tp& __y) const |

212 | { return __x % __y; } |

213 | }; |

214 | |

215 | /// One of the @link arithmetic_functors math functors@endlink. |

216 | template<typename _Tp> |

217 | struct negate : public unary_function<_Tp, _Tp> |

218 | { |

219 | _GLIBCXX14_CONSTEXPR |

220 | _Tp |

221 | operator()(const _Tp& __x) const |

222 | { return -__x; } |

223 | }; |

224 | |

225 | #if __cplusplus > 201103L |

226 | |

227 | #define __cpp_lib_transparent_operators 201510 |

228 | |

229 | template<> |

230 | struct plus<void> |

231 | { |

232 | template <typename _Tp, typename _Up> |

233 | _GLIBCXX14_CONSTEXPR |

234 | auto |

235 | operator()(_Tp&& __t, _Up&& __u) const |

236 | noexcept(noexcept(std::forward<_Tp>(__t) + std::forward<_Up>(__u))) |

237 | -> decltype(std::forward<_Tp>(__t) + std::forward<_Up>(__u)) |

238 | { return std::forward<_Tp>(__t) + std::forward<_Up>(__u); } |

239 | |

240 | typedef __is_transparent is_transparent; |

241 | }; |

242 | |

243 | /// One of the @link arithmetic_functors math functors@endlink. |

244 | template<> |

245 | struct minus<void> |

246 | { |

247 | template <typename _Tp, typename _Up> |

248 | _GLIBCXX14_CONSTEXPR |

249 | auto |

250 | operator()(_Tp&& __t, _Up&& __u) const |

251 | noexcept(noexcept(std::forward<_Tp>(__t) - std::forward<_Up>(__u))) |

252 | -> decltype(std::forward<_Tp>(__t) - std::forward<_Up>(__u)) |

253 | { return std::forward<_Tp>(__t) - std::forward<_Up>(__u); } |

254 | |

255 | typedef __is_transparent is_transparent; |

256 | }; |

257 | |

258 | /// One of the @link arithmetic_functors math functors@endlink. |

259 | template<> |

260 | struct multiplies<void> |

261 | { |

262 | template <typename _Tp, typename _Up> |

263 | _GLIBCXX14_CONSTEXPR |

264 | auto |

265 | operator()(_Tp&& __t, _Up&& __u) const |

266 | noexcept(noexcept(std::forward<_Tp>(__t) * std::forward<_Up>(__u))) |

267 | -> decltype(std::forward<_Tp>(__t) * std::forward<_Up>(__u)) |

268 | { return std::forward<_Tp>(__t) * std::forward<_Up>(__u); } |

269 | |

270 | typedef __is_transparent is_transparent; |

271 | }; |

272 | |

273 | /// One of the @link arithmetic_functors math functors@endlink. |

274 | template<> |

275 | struct divides<void> |

276 | { |

277 | template <typename _Tp, typename _Up> |

278 | _GLIBCXX14_CONSTEXPR |

279 | auto |

280 | operator()(_Tp&& __t, _Up&& __u) const |

281 | noexcept(noexcept(std::forward<_Tp>(__t) / std::forward<_Up>(__u))) |

282 | -> decltype(std::forward<_Tp>(__t) / std::forward<_Up>(__u)) |

283 | { return std::forward<_Tp>(__t) / std::forward<_Up>(__u); } |

284 | |

285 | typedef __is_transparent is_transparent; |

286 | }; |

287 | |

288 | /// One of the @link arithmetic_functors math functors@endlink. |

289 | template<> |

290 | struct modulus<void> |

291 | { |

292 | template <typename _Tp, typename _Up> |

293 | _GLIBCXX14_CONSTEXPR |

294 | auto |

295 | operator()(_Tp&& __t, _Up&& __u) const |

296 | noexcept(noexcept(std::forward<_Tp>(__t) % std::forward<_Up>(__u))) |

297 | -> decltype(std::forward<_Tp>(__t) % std::forward<_Up>(__u)) |

298 | { return std::forward<_Tp>(__t) % std::forward<_Up>(__u); } |

299 | |

300 | typedef __is_transparent is_transparent; |

301 | }; |

302 | |

303 | /// One of the @link arithmetic_functors math functors@endlink. |

304 | template<> |

305 | struct negate<void> |

306 | { |

307 | template <typename _Tp> |

308 | _GLIBCXX14_CONSTEXPR |

309 | auto |

310 | operator()(_Tp&& __t) const |

311 | noexcept(noexcept(-std::forward<_Tp>(__t))) |

312 | -> decltype(-std::forward<_Tp>(__t)) |

313 | { return -std::forward<_Tp>(__t); } |

314 | |

315 | typedef __is_transparent is_transparent; |

316 | }; |

317 | #endif |

318 | /** @} */ |

319 | |

320 | // 20.3.3 comparisons |

321 | /** @defgroup comparison_functors Comparison Classes |

322 | * @ingroup functors |

323 | * |

324 | * The library provides six wrapper functors for all the basic comparisons |

325 | * in C++, like @c <. |

326 | * |

327 | * @{ |

328 | */ |

329 | #if __cplusplus > 201103L |

330 | template<typename _Tp = void> |

331 | struct equal_to; |

332 | |

333 | template<typename _Tp = void> |

334 | struct not_equal_to; |

335 | |

336 | template<typename _Tp = void> |

337 | struct greater; |

338 | |

339 | template<typename _Tp = void> |

340 | struct less; |

341 | |

342 | template<typename _Tp = void> |

343 | struct greater_equal; |

344 | |

345 | template<typename _Tp = void> |

346 | struct less_equal; |

347 | #endif |

348 | |

349 | /// One of the @link comparison_functors comparison functors@endlink. |

350 | template<typename _Tp> |

351 | struct equal_to : public binary_function<_Tp, _Tp, bool> |

352 | { |

353 | _GLIBCXX14_CONSTEXPR |

354 | bool |

355 | operator()(const _Tp& __x, const _Tp& __y) const |

356 | { return __x == __y; } |

357 | }; |

358 | |

359 | /// One of the @link comparison_functors comparison functors@endlink. |

360 | template<typename _Tp> |

361 | struct not_equal_to : public binary_function<_Tp, _Tp, bool> |

362 | { |

363 | _GLIBCXX14_CONSTEXPR |

364 | bool |

365 | operator()(const _Tp& __x, const _Tp& __y) const |

366 | { return __x != __y; } |

367 | }; |

368 | |

369 | /// One of the @link comparison_functors comparison functors@endlink. |

370 | template<typename _Tp> |

371 | struct greater : public binary_function<_Tp, _Tp, bool> |

372 | { |

373 | _GLIBCXX14_CONSTEXPR |

374 | bool |

375 | operator()(const _Tp& __x, const _Tp& __y) const |

376 | { return __x > __y; } |

377 | }; |

378 | |

379 | /// One of the @link comparison_functors comparison functors@endlink. |

380 | template<typename _Tp> |

381 | struct less : public binary_function<_Tp, _Tp, bool> |

382 | { |

383 | _GLIBCXX14_CONSTEXPR |

384 | bool |

385 | operator()(const _Tp& __x, const _Tp& __y) const |

386 | { return __x < __y; } |

387 | }; |

388 | |

389 | /// One of the @link comparison_functors comparison functors@endlink. |

390 | template<typename _Tp> |

391 | struct greater_equal : public binary_function<_Tp, _Tp, bool> |

392 | { |

393 | _GLIBCXX14_CONSTEXPR |

394 | bool |

395 | operator()(const _Tp& __x, const _Tp& __y) const |

396 | { return __x >= __y; } |

397 | }; |

398 | |

399 | /// One of the @link comparison_functors comparison functors@endlink. |

400 | template<typename _Tp> |

401 | struct less_equal : public binary_function<_Tp, _Tp, bool> |

402 | { |

403 | _GLIBCXX14_CONSTEXPR |

404 | bool |

405 | operator()(const _Tp& __x, const _Tp& __y) const |

406 | { return __x <= __y; } |

407 | }; |

408 | |

409 | #if __cplusplus > 201103L |

410 | /// One of the @link comparison_functors comparison functors@endlink. |

411 | template<> |

412 | struct equal_to<void> |

413 | { |

414 | template <typename _Tp, typename _Up> |

415 | _GLIBCXX14_CONSTEXPR |

416 | auto |

417 | operator()(_Tp&& __t, _Up&& __u) const |

418 | noexcept(noexcept(std::forward<_Tp>(__t) == std::forward<_Up>(__u))) |

419 | -> decltype(std::forward<_Tp>(__t) == std::forward<_Up>(__u)) |

420 | { return std::forward<_Tp>(__t) == std::forward<_Up>(__u); } |

421 | |

422 | typedef __is_transparent is_transparent; |

423 | }; |

424 | |

425 | /// One of the @link comparison_functors comparison functors@endlink. |

426 | template<> |

427 | struct not_equal_to<void> |

428 | { |

429 | template <typename _Tp, typename _Up> |

430 | _GLIBCXX14_CONSTEXPR |

431 | auto |

432 | operator()(_Tp&& __t, _Up&& __u) const |

433 | noexcept(noexcept(std::forward<_Tp>(__t) != std::forward<_Up>(__u))) |

434 | -> decltype(std::forward<_Tp>(__t) != std::forward<_Up>(__u)) |

435 | { return std::forward<_Tp>(__t) != std::forward<_Up>(__u); } |

436 | |

437 | typedef __is_transparent is_transparent; |

438 | }; |

439 | |

440 | /// One of the @link comparison_functors comparison functors@endlink. |

441 | template<> |

442 | struct greater<void> |

443 | { |

444 | template <typename _Tp, typename _Up> |

445 | _GLIBCXX14_CONSTEXPR |

446 | auto |

447 | operator()(_Tp&& __t, _Up&& __u) const |

448 | noexcept(noexcept(std::forward<_Tp>(__t) > std::forward<_Up>(__u))) |

449 | -> decltype(std::forward<_Tp>(__t) > std::forward<_Up>(__u)) |

450 | { return std::forward<_Tp>(__t) > std::forward<_Up>(__u); } |

451 | |

452 | typedef __is_transparent is_transparent; |

453 | }; |

454 | |

455 | /// One of the @link comparison_functors comparison functors@endlink. |

456 | template<> |

457 | struct less<void> |

458 | { |

459 | template <typename _Tp, typename _Up> |

460 | _GLIBCXX14_CONSTEXPR |

461 | auto |

462 | operator()(_Tp&& __t, _Up&& __u) const |

463 | noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u))) |

464 | -> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u)) |

465 | { return std::forward<_Tp>(__t) < std::forward<_Up>(__u); } |

466 | |

467 | typedef __is_transparent is_transparent; |

468 | }; |

469 | |

470 | /// One of the @link comparison_functors comparison functors@endlink. |

471 | template<> |

472 | struct greater_equal<void> |

473 | { |

474 | template <typename _Tp, typename _Up> |

475 | _GLIBCXX14_CONSTEXPR |

476 | auto |

477 | operator()(_Tp&& __t, _Up&& __u) const |

478 | noexcept(noexcept(std::forward<_Tp>(__t) >= std::forward<_Up>(__u))) |

479 | -> decltype(std::forward<_Tp>(__t) >= std::forward<_Up>(__u)) |

480 | { return std::forward<_Tp>(__t) >= std::forward<_Up>(__u); } |

481 | |

482 | typedef __is_transparent is_transparent; |

483 | }; |

484 | |

485 | /// One of the @link comparison_functors comparison functors@endlink. |

486 | template<> |

487 | struct less_equal<void> |

488 | { |

489 | template <typename _Tp, typename _Up> |

490 | _GLIBCXX14_CONSTEXPR |

491 | auto |

492 | operator()(_Tp&& __t, _Up&& __u) const |

493 | noexcept(noexcept(std::forward<_Tp>(__t) <= std::forward<_Up>(__u))) |

494 | -> decltype(std::forward<_Tp>(__t) <= std::forward<_Up>(__u)) |

495 | { return std::forward<_Tp>(__t) <= std::forward<_Up>(__u); } |

496 | |

497 | typedef __is_transparent is_transparent; |

498 | }; |

499 | #endif |

500 | /** @} */ |

501 | |

502 | // 20.3.4 logical operations |

503 | /** @defgroup logical_functors Boolean Operations Classes |

504 | * @ingroup functors |

505 | * |

506 | * Here are wrapper functors for Boolean operations: @c &&, @c ||, |

507 | * and @c !. |

508 | * |

509 | * @{ |

510 | */ |

511 | #if __cplusplus > 201103L |

512 | template<typename _Tp = void> |

513 | struct logical_and; |

514 | |

515 | template<typename _Tp = void> |

516 | struct logical_or; |

517 | |

518 | template<typename _Tp = void> |

519 | struct logical_not; |

520 | #endif |

521 | |

522 | /// One of the @link logical_functors Boolean operations functors@endlink. |

523 | template<typename _Tp> |

524 | struct logical_and : public binary_function<_Tp, _Tp, bool> |

525 | { |

526 | _GLIBCXX14_CONSTEXPR |

527 | bool |

528 | operator()(const _Tp& __x, const _Tp& __y) const |

529 | { return __x && __y; } |

530 | }; |

531 | |

532 | /// One of the @link logical_functors Boolean operations functors@endlink. |

533 | template<typename _Tp> |

534 | struct logical_or : public binary_function<_Tp, _Tp, bool> |

535 | { |

536 | _GLIBCXX14_CONSTEXPR |

537 | bool |

538 | operator()(const _Tp& __x, const _Tp& __y) const |

539 | { return __x || __y; } |

540 | }; |

541 | |

542 | /// One of the @link logical_functors Boolean operations functors@endlink. |

543 | template<typename _Tp> |

544 | struct logical_not : public unary_function<_Tp, bool> |

545 | { |

546 | _GLIBCXX14_CONSTEXPR |

547 | bool |

548 | operator()(const _Tp& __x) const |

549 | { return !__x; } |

550 | }; |

551 | |

552 | #if __cplusplus > 201103L |

553 | /// One of the @link logical_functors Boolean operations functors@endlink. |

554 | template<> |

555 | struct logical_and<void> |

556 | { |

557 | template <typename _Tp, typename _Up> |

558 | _GLIBCXX14_CONSTEXPR |

559 | auto |

560 | operator()(_Tp&& __t, _Up&& __u) const |

561 | noexcept(noexcept(std::forward<_Tp>(__t) && std::forward<_Up>(__u))) |

562 | -> decltype(std::forward<_Tp>(__t) && std::forward<_Up>(__u)) |

563 | { return std::forward<_Tp>(__t) && std::forward<_Up>(__u); } |

564 | |

565 | typedef __is_transparent is_transparent; |

566 | }; |

567 | |

568 | /// One of the @link logical_functors Boolean operations functors@endlink. |

569 | template<> |

570 | struct logical_or<void> |

571 | { |

572 | template <typename _Tp, typename _Up> |

573 | _GLIBCXX14_CONSTEXPR |

574 | auto |

575 | operator()(_Tp&& __t, _Up&& __u) const |

576 | noexcept(noexcept(std::forward<_Tp>(__t) || std::forward<_Up>(__u))) |

577 | -> decltype(std::forward<_Tp>(__t) || std::forward<_Up>(__u)) |

578 | { return std::forward<_Tp>(__t) || std::forward<_Up>(__u); } |

579 | |

580 | typedef __is_transparent is_transparent; |

581 | }; |

582 | |

583 | /// One of the @link logical_functors Boolean operations functors@endlink. |

584 | template<> |

585 | struct logical_not<void> |

586 | { |

587 | template <typename _Tp> |

588 | _GLIBCXX14_CONSTEXPR |

589 | auto |

590 | operator()(_Tp&& __t) const |

591 | noexcept(noexcept(!std::forward<_Tp>(__t))) |

592 | -> decltype(!std::forward<_Tp>(__t)) |

593 | { return !std::forward<_Tp>(__t); } |

594 | |

595 | typedef __is_transparent is_transparent; |

596 | }; |

597 | #endif |

598 | /** @} */ |

599 | |

600 | #if __cplusplus > 201103L |

601 | template<typename _Tp = void> |

602 | struct bit_and; |

603 | |

604 | template<typename _Tp = void> |

605 | struct bit_or; |

606 | |

607 | template<typename _Tp = void> |

608 | struct bit_xor; |

609 | |

610 | template<typename _Tp = void> |

611 | struct bit_not; |

612 | #endif |

613 | |

614 | // _GLIBCXX_RESOLVE_LIB_DEFECTS |

615 | // DR 660. Missing Bitwise Operations. |

616 | template<typename _Tp> |

617 | struct bit_and : public binary_function<_Tp, _Tp, _Tp> |

618 | { |

619 | _GLIBCXX14_CONSTEXPR |

620 | _Tp |

621 | operator()(const _Tp& __x, const _Tp& __y) const |

622 | { return __x & __y; } |

623 | }; |

624 | |

625 | template<typename _Tp> |

626 | struct bit_or : public binary_function<_Tp, _Tp, _Tp> |

627 | { |

628 | _GLIBCXX14_CONSTEXPR |

629 | _Tp |

630 | operator()(const _Tp& __x, const _Tp& __y) const |

631 | { return __x | __y; } |

632 | }; |

633 | |

634 | template<typename _Tp> |

635 | struct bit_xor : public binary_function<_Tp, _Tp, _Tp> |

636 | { |

637 | _GLIBCXX14_CONSTEXPR |

638 | _Tp |

639 | operator()(const _Tp& __x, const _Tp& __y) const |

640 | { return __x ^ __y; } |

641 | }; |

642 | |

643 | template<typename _Tp> |

644 | struct bit_not : public unary_function<_Tp, _Tp> |

645 | { |

646 | _GLIBCXX14_CONSTEXPR |

647 | _Tp |

648 | operator()(const _Tp& __x) const |

649 | { return ~__x; } |

650 | }; |

651 | |

652 | #if __cplusplus > 201103L |

653 | template <> |

654 | struct bit_and<void> |

655 | { |

656 | template <typename _Tp, typename _Up> |

657 | _GLIBCXX14_CONSTEXPR |

658 | auto |

659 | operator()(_Tp&& __t, _Up&& __u) const |

660 | noexcept(noexcept(std::forward<_Tp>(__t) & std::forward<_Up>(__u))) |

661 | -> decltype(std::forward<_Tp>(__t) & std::forward<_Up>(__u)) |

662 | { return std::forward<_Tp>(__t) & std::forward<_Up>(__u); } |

663 | |

664 | typedef __is_transparent is_transparent; |

665 | }; |

666 | |

667 | template <> |

668 | struct bit_or<void> |

669 | { |

670 | template <typename _Tp, typename _Up> |

671 | _GLIBCXX14_CONSTEXPR |

672 | auto |

673 | operator()(_Tp&& __t, _Up&& __u) const |

674 | noexcept(noexcept(std::forward<_Tp>(__t) | std::forward<_Up>(__u))) |

675 | -> decltype(std::forward<_Tp>(__t) | std::forward<_Up>(__u)) |

676 | { return std::forward<_Tp>(__t) | std::forward<_Up>(__u); } |

677 | |

678 | typedef __is_transparent is_transparent; |

679 | }; |

680 | |

681 | template <> |

682 | struct bit_xor<void> |

683 | { |

684 | template <typename _Tp, typename _Up> |

685 | _GLIBCXX14_CONSTEXPR |

686 | auto |

687 | operator()(_Tp&& __t, _Up&& __u) const |

688 | noexcept(noexcept(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u))) |

689 | -> decltype(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u)) |

690 | { return std::forward<_Tp>(__t) ^ std::forward<_Up>(__u); } |

691 | |

692 | typedef __is_transparent is_transparent; |

693 | }; |

694 | |

695 | template <> |

696 | struct bit_not<void> |

697 | { |

698 | template <typename _Tp> |

699 | _GLIBCXX14_CONSTEXPR |

700 | auto |

701 | operator()(_Tp&& __t) const |

702 | noexcept(noexcept(~std::forward<_Tp>(__t))) |

703 | -> decltype(~std::forward<_Tp>(__t)) |

704 | { return ~std::forward<_Tp>(__t); } |

705 | |

706 | typedef __is_transparent is_transparent; |

707 | }; |

708 | #endif |

709 | |

710 | // 20.3.5 negators |

711 | /** @defgroup negators Negators |

712 | * @ingroup functors |

713 | * |

714 | * The functions @c not1 and @c not2 each take a predicate functor |

715 | * and return an instance of @c unary_negate or |

716 | * @c binary_negate, respectively. These classes are functors whose |

717 | * @c operator() performs the stored predicate function and then returns |

718 | * the negation of the result. |

719 | * |

720 | * For example, given a vector of integers and a trivial predicate, |

721 | * \code |

722 | * struct IntGreaterThanThree |

723 | * : public std::unary_function<int, bool> |

724 | * { |

725 | * bool operator() (int x) { return x > 3; } |

726 | * }; |

727 | * |

728 | * std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree())); |

729 | * \endcode |

730 | * The call to @c find_if will locate the first index (i) of @c v for which |

731 | * <code>!(v[i] > 3)</code> is true. |

732 | * |

733 | * The not1/unary_negate combination works on predicates taking a single |

734 | * argument. The not2/binary_negate combination works on predicates which |

735 | * take two arguments. |

736 | * |

737 | * @{ |

738 | */ |

739 | /// One of the @link negators negation functors@endlink. |

740 | template<typename _Predicate> |

741 | class unary_negate |

742 | : public unary_function<typename _Predicate::argument_type, bool> |

743 | { |

744 | protected: |

745 | _Predicate _M_pred; |

746 | |

747 | public: |

748 | _GLIBCXX14_CONSTEXPR |

749 | explicit |

750 | unary_negate(const _Predicate& __x) : _M_pred(__x) { } |

751 | |

752 | _GLIBCXX14_CONSTEXPR |

753 | bool |

754 | operator()(const typename _Predicate::argument_type& __x) const |

755 | { return !_M_pred(__x); } |

756 | }; |

757 | |

758 | /// One of the @link negators negation functors@endlink. |

759 | template<typename _Predicate> |

760 | _GLIBCXX14_CONSTEXPR |

761 | inline unary_negate<_Predicate> |

762 | not1(const _Predicate& __pred) |

763 | { return unary_negate<_Predicate>(__pred); } |

764 | |

765 | /// One of the @link negators negation functors@endlink. |

766 | template<typename _Predicate> |

767 | class binary_negate |

768 | : public binary_function<typename _Predicate::first_argument_type, |

769 | typename _Predicate::second_argument_type, bool> |

770 | { |

771 | protected: |

772 | _Predicate _M_pred; |

773 | |

774 | public: |

775 | _GLIBCXX14_CONSTEXPR |

776 | explicit |

777 | binary_negate(const _Predicate& __x) : _M_pred(__x) { } |

778 | |

779 | _GLIBCXX14_CONSTEXPR |

780 | bool |

781 | operator()(const typename _Predicate::first_argument_type& __x, |

782 | const typename _Predicate::second_argument_type& __y) const |

783 | { return !_M_pred(__x, __y); } |

784 | }; |

785 | |

786 | /// One of the @link negators negation functors@endlink. |

787 | template<typename _Predicate> |

788 | _GLIBCXX14_CONSTEXPR |

789 | inline binary_negate<_Predicate> |

790 | not2(const _Predicate& __pred) |

791 | { return binary_negate<_Predicate>(__pred); } |

792 | /** @} */ |

793 | |

794 | // 20.3.7 adaptors pointers functions |

795 | /** @defgroup pointer_adaptors Adaptors for pointers to functions |

796 | * @ingroup functors |

797 | * |

798 | * The advantage of function objects over pointers to functions is that |

799 | * the objects in the standard library declare nested typedefs describing |

800 | * their argument and result types with uniform names (e.g., @c result_type |

801 | * from the base classes @c unary_function and @c binary_function). |

802 | * Sometimes those typedefs are required, not just optional. |

803 | * |

804 | * Adaptors are provided to turn pointers to unary (single-argument) and |

805 | * binary (double-argument) functions into function objects. The |

806 | * long-winded functor @c pointer_to_unary_function is constructed with a |

807 | * function pointer @c f, and its @c operator() called with argument @c x |

808 | * returns @c f(x). The functor @c pointer_to_binary_function does the same |

809 | * thing, but with a double-argument @c f and @c operator(). |

810 | * |

811 | * The function @c ptr_fun takes a pointer-to-function @c f and constructs |

812 | * an instance of the appropriate functor. |

813 | * |

814 | * @{ |

815 | */ |

816 | /// One of the @link pointer_adaptors adaptors for function pointers@endlink. |

817 | template<typename _Arg, typename _Result> |

818 | class pointer_to_unary_function : public unary_function<_Arg, _Result> |

819 | { |

820 | protected: |

821 | _Result (*_M_ptr)(_Arg); |

822 | |

823 | public: |

824 | pointer_to_unary_function() { } |

825 | |

826 | explicit |

827 | pointer_to_unary_function(_Result (*__x)(_Arg)) |

828 | : _M_ptr(__x) { } |

829 | |

830 | _Result |

831 | operator()(_Arg __x) const |

832 | { return _M_ptr(__x); } |

833 | }; |

834 | |

835 | /// One of the @link pointer_adaptors adaptors for function pointers@endlink. |

836 | template<typename _Arg, typename _Result> |

837 | inline pointer_to_unary_function<_Arg, _Result> |

838 | ptr_fun(_Result (*__x)(_Arg)) |

839 | { return pointer_to_unary_function<_Arg, _Result>(__x); } |

840 | |

841 | /// One of the @link pointer_adaptors adaptors for function pointers@endlink. |

842 | template<typename _Arg1, typename _Arg2, typename _Result> |

843 | class pointer_to_binary_function |

844 | : public binary_function<_Arg1, _Arg2, _Result> |

845 | { |

846 | protected: |

847 | _Result (*_M_ptr)(_Arg1, _Arg2); |

848 | |

849 | public: |

850 | pointer_to_binary_function() { } |

851 | |

852 | explicit |

853 | pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2)) |

854 | : _M_ptr(__x) { } |

855 | |

856 | _Result |

857 | operator()(_Arg1 __x, _Arg2 __y) const |

858 | { return _M_ptr(__x, __y); } |

859 | }; |

860 | |

861 | /// One of the @link pointer_adaptors adaptors for function pointers@endlink. |

862 | template<typename _Arg1, typename _Arg2, typename _Result> |

863 | inline pointer_to_binary_function<_Arg1, _Arg2, _Result> |

864 | ptr_fun(_Result (*__x)(_Arg1, _Arg2)) |

865 | { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); } |

866 | /** @} */ |

867 | |

868 | template<typename _Tp> |

869 | struct _Identity |

870 | : public unary_function<_Tp,_Tp> |

871 | { |

872 | _Tp& |

873 | operator()(_Tp& __x) const |

874 | { return __x; } |

875 | |

876 | const _Tp& |

877 | operator()(const _Tp& __x) const |

878 | { return __x; } |

879 | }; |

880 | |

881 | template<typename _Pair> |

882 | struct _Select1st |

883 | : public unary_function<_Pair, typename _Pair::first_type> |

884 | { |

885 | typename _Pair::first_type& |

886 | operator()(_Pair& __x) const |

887 | { return __x.first; } |

888 | |

889 | const typename _Pair::first_type& |

890 | operator()(const _Pair& __x) const |

891 | { return __x.first; } |

892 | |

893 | #if __cplusplus >= 201103L |

894 | template<typename _Pair2> |

895 | typename _Pair2::first_type& |

896 | operator()(_Pair2& __x) const |

897 | { return __x.first; } |

898 | |

899 | template<typename _Pair2> |

900 | const typename _Pair2::first_type& |

901 | operator()(const _Pair2& __x) const |

902 | { return __x.first; } |

903 | #endif |

904 | }; |

905 | |

906 | template<typename _Pair> |

907 | struct _Select2nd |

908 | : public unary_function<_Pair, typename _Pair::second_type> |

909 | { |

910 | typename _Pair::second_type& |

911 | operator()(_Pair& __x) const |

912 | { return __x.second; } |

913 | |

914 | const typename _Pair::second_type& |

915 | operator()(const _Pair& __x) const |

916 | { return __x.second; } |

917 | }; |

918 | |

919 | // 20.3.8 adaptors pointers members |

920 | /** @defgroup memory_adaptors Adaptors for pointers to members |

921 | * @ingroup functors |

922 | * |

923 | * There are a total of 8 = 2^3 function objects in this family. |

924 | * (1) Member functions taking no arguments vs member functions taking |

925 | * one argument. |

926 | * (2) Call through pointer vs call through reference. |

927 | * (3) Const vs non-const member function. |

928 | * |

929 | * All of this complexity is in the function objects themselves. You can |

930 | * ignore it by using the helper function mem_fun and mem_fun_ref, |

931 | * which create whichever type of adaptor is appropriate. |

932 | * |

933 | * @{ |

934 | */ |

935 | /// One of the @link memory_adaptors adaptors for member |

936 | /// pointers@endlink. |

937 | template<typename _Ret, typename _Tp> |

938 | class mem_fun_t : public unary_function<_Tp*, _Ret> |

939 | { |

940 | public: |

941 | explicit |

942 | mem_fun_t(_Ret (_Tp::*__pf)()) |

943 | : _M_f(__pf) { } |

944 | |

945 | _Ret |

946 | operator()(_Tp* __p) const |

947 | { return (__p->*_M_f)(); } |

948 | |

949 | private: |

950 | _Ret (_Tp::*_M_f)(); |

951 | }; |

952 | |

953 | /// One of the @link memory_adaptors adaptors for member |

954 | /// pointers@endlink. |

955 | template<typename _Ret, typename _Tp> |

956 | class const_mem_fun_t : public unary_function<const _Tp*, _Ret> |

957 | { |

958 | public: |

959 | explicit |

960 | const_mem_fun_t(_Ret (_Tp::*__pf)() const) |

961 | : _M_f(__pf) { } |

962 | |

963 | _Ret |

964 | operator()(const _Tp* __p) const |

965 | { return (__p->*_M_f)(); } |

966 | |

967 | private: |

968 | _Ret (_Tp::*_M_f)() const; |

969 | }; |

970 | |

971 | /// One of the @link memory_adaptors adaptors for member |

972 | /// pointers@endlink. |

973 | template<typename _Ret, typename _Tp> |

974 | class mem_fun_ref_t : public unary_function<_Tp, _Ret> |

975 | { |

976 | public: |

977 | explicit |

978 | mem_fun_ref_t(_Ret (_Tp::*__pf)()) |

979 | : _M_f(__pf) { } |

980 | |

981 | _Ret |

982 | operator()(_Tp& __r) const |

983 | { return (__r.*_M_f)(); } |

984 | |

985 | private: |

986 | _Ret (_Tp::*_M_f)(); |

987 | }; |

988 | |

989 | /// One of the @link memory_adaptors adaptors for member |

990 | /// pointers@endlink. |

991 | template<typename _Ret, typename _Tp> |

992 | class const_mem_fun_ref_t : public unary_function<_Tp, _Ret> |

993 | { |

994 | public: |

995 | explicit |

996 | const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const) |

997 | : _M_f(__pf) { } |

998 | |

999 | _Ret |

1000 | operator()(const _Tp& __r) const |

1001 | { return (__r.*_M_f)(); } |

1002 | |

1003 | private: |

1004 | _Ret (_Tp::*_M_f)() const; |

1005 | }; |

1006 | |

1007 | /// One of the @link memory_adaptors adaptors for member |

1008 | /// pointers@endlink. |

1009 | template<typename _Ret, typename _Tp, typename _Arg> |

1010 | class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret> |

1011 | { |

1012 | public: |

1013 | explicit |

1014 | mem_fun1_t(_Ret (_Tp::*__pf)(_Arg)) |

1015 | : _M_f(__pf) { } |

1016 | |

1017 | _Ret |

1018 | operator()(_Tp* __p, _Arg __x) const |

1019 | { return (__p->*_M_f)(__x); } |

1020 | |

1021 | private: |

1022 | _Ret (_Tp::*_M_f)(_Arg); |

1023 | }; |

1024 | |

1025 | /// One of the @link memory_adaptors adaptors for member |

1026 | /// pointers@endlink. |

1027 | template<typename _Ret, typename _Tp, typename _Arg> |

1028 | class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret> |

1029 | { |

1030 | public: |

1031 | explicit |

1032 | const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const) |

1033 | : _M_f(__pf) { } |

1034 | |

1035 | _Ret |

1036 | operator()(const _Tp* __p, _Arg __x) const |

1037 | { return (__p->*_M_f)(__x); } |

1038 | |

1039 | private: |

1040 | _Ret (_Tp::*_M_f)(_Arg) const; |

1041 | }; |

1042 | |

1043 | /// One of the @link memory_adaptors adaptors for member |

1044 | /// pointers@endlink. |

1045 | template<typename _Ret, typename _Tp, typename _Arg> |

1046 | class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret> |

1047 | { |

1048 | public: |

1049 | explicit |

1050 | mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg)) |

1051 | : _M_f(__pf) { } |

1052 | |

1053 | _Ret |

1054 | operator()(_Tp& __r, _Arg __x) const |

1055 | { return (__r.*_M_f)(__x); } |

1056 | |

1057 | private: |

1058 | _Ret (_Tp::*_M_f)(_Arg); |

1059 | }; |

1060 | |

1061 | /// One of the @link memory_adaptors adaptors for member |

1062 | /// pointers@endlink. |

1063 | template<typename _Ret, typename _Tp, typename _Arg> |

1064 | class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret> |

1065 | { |

1066 | public: |

1067 | explicit |

1068 | const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const) |

1069 | : _M_f(__pf) { } |

1070 | |

1071 | _Ret |

1072 | operator()(const _Tp& __r, _Arg __x) const |

1073 | { return (__r.*_M_f)(__x); } |

1074 | |

1075 | private: |

1076 | _Ret (_Tp::*_M_f)(_Arg) const; |

1077 | }; |

1078 | |

1079 | // Mem_fun adaptor helper functions. There are only two: |

1080 | // mem_fun and mem_fun_ref. |

1081 | template<typename _Ret, typename _Tp> |

1082 | inline mem_fun_t<_Ret, _Tp> |

1083 | mem_fun(_Ret (_Tp::*__f)()) |

1084 | { return mem_fun_t<_Ret, _Tp>(__f); } |

1085 | |

1086 | template<typename _Ret, typename _Tp> |

1087 | inline const_mem_fun_t<_Ret, _Tp> |

1088 | mem_fun(_Ret (_Tp::*__f)() const) |

1089 | { return const_mem_fun_t<_Ret, _Tp>(__f); } |

1090 | |

1091 | template<typename _Ret, typename _Tp> |

1092 | inline mem_fun_ref_t<_Ret, _Tp> |

1093 | mem_fun_ref(_Ret (_Tp::*__f)()) |

1094 | { return mem_fun_ref_t<_Ret, _Tp>(__f); } |

1095 | |

1096 | template<typename _Ret, typename _Tp> |

1097 | inline const_mem_fun_ref_t<_Ret, _Tp> |

1098 | mem_fun_ref(_Ret (_Tp::*__f)() const) |

1099 | { return const_mem_fun_ref_t<_Ret, _Tp>(__f); } |

1100 | |

1101 | template<typename _Ret, typename _Tp, typename _Arg> |

1102 | inline mem_fun1_t<_Ret, _Tp, _Arg> |

1103 | mem_fun(_Ret (_Tp::*__f)(_Arg)) |

1104 | { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); } |

1105 | |

1106 | template<typename _Ret, typename _Tp, typename _Arg> |

1107 | inline const_mem_fun1_t<_Ret, _Tp, _Arg> |

1108 | mem_fun(_Ret (_Tp::*__f)(_Arg) const) |

1109 | { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); } |

1110 | |

1111 | template<typename _Ret, typename _Tp, typename _Arg> |

1112 | inline mem_fun1_ref_t<_Ret, _Tp, _Arg> |

1113 | mem_fun_ref(_Ret (_Tp::*__f)(_Arg)) |

1114 | { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); } |

1115 | |

1116 | template<typename _Ret, typename _Tp, typename _Arg> |

1117 | inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg> |

1118 | mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const) |

1119 | { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); } |

1120 | |

1121 | /** @} */ |

1122 | |

1123 | _GLIBCXX_END_NAMESPACE_VERSION |

1124 | } // namespace |

1125 | |

1126 | #if (__cplusplus < 201103L) || _GLIBCXX_USE_DEPRECATED |

1127 | # include <backward/binders.h> |

1128 | #endif |

1129 | |

1130 | #endif /* _STL_FUNCTION_H */ |

1131 |