summaryrefslogtreecommitdiff
path: root/libcxx/modules/std/algorithm.inc
AgeCommit message (Collapse)Author
2025-04-05[libc++] Implement ranges::iota (#68494)James E T Smith
# Overview As a disclaimer, this is my first PR to LLVM and while I've tried to ensure I've followed the LLVM and libc++ contributing guidelines, there's probably a good chance I missed something. If I have, just let me know and I'll try to correct it as soon as I can. This PR implements `std::ranges::iota` and `std::ranges::out_value_result` outlined in [P2440r1](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2440r1.html). As outlined in the paper above, I've: - Implemented `out_value_result` and added to `<algorithm>` - Added `out_value_result`, `iota_result`, and two overloads of `iota` to `std::ranges` in `<numeric>` - Updated the version macro `__cpp_lib_ranges_iota` in `<version>` I've also added tests for `ranges::iota` and `ranges::out_value_result`. Lastly, I added those structs to the appropriate module files. Partially implements #105184 EDIT: Forgot to mention in the original post, thanks to @hawkinsw for taking a look at a preliminary version of this PR! # TODOs - [x] Updating the range [status doc](https://github.com/jamesETsmith/llvm-project/blob/main/libcxx/docs/Status/RangesMajorFeatures.csv) - [x] Ensure all comments from https://reviews.llvm.org/D121436 are addressed here - [X] EDIT (I'll do this in a separate PR). ~~I'm open to implementing the rest of P2440r1 (`ranges::shift_left` and `ranges::shift_right`) if that's ok, I just wanted to get feedback on `ranges::iota` first~~ - [x] I've been having trouble building the modules locally and want to make sure that's working properly Closes: #134060
2024-07-19[libc++][ranges] P1223R5: `find_last` (#99312)nicole mazzuca
Implements [P1223R5][] completely. Includes an implementation of `find_last`, `find_last_if`, and `find_last_if_not`. [P1223R5]: https://wg21.link/p1223r5
2024-02-13[libc++][ranges] Implement ranges::contains_subrange (#66963)ZijunZhaoCCK
2023-12-23[libc++][modules] Fixes C++20 build errors.Mark de Wever
Recent CI changes have disabled testing modules in different configurations. This broke building the std and std.compat module in C++20. This was found by the CI in #76246.
2023-12-19[libcxx] adds ranges::fold_left_with_iter and ranges::fold_left (#75259)Christopher Di Bella
Notable things in this commit: * refactors `__indirect_binary_left_foldable`, making it slightly different (but equivalent) to _`indirect-binary-left-foldable`_, which improves readability (a [patch to the Working Paper][patch] was made) * omits `__cpo` namespace, since it is not required for implementing niebloids (a cleanup should happen in 2024) * puts tests ensuring invocable robustness and dangling correctness inside the correctness testing to ensure that the algorithms' results are still correct [patch]: https://github.com/cplusplus/draft/pull/6734
2023-12-19[libc++] Implement ranges::contains (#65148)ZijunZhaoCCK
Differential Revision: https://reviews.llvm.org/D159232 ``` Running ./ranges_contains.libcxx.out Run on (10 X 24.121 MHz CPU s) CPU Caches: L1 Data 64 KiB (x10) L1 Instruction 128 KiB (x10) L2 Unified 4096 KiB (x5) Load Average: 3.37, 6.77, 5.27 -------------------------------------------------------------------- Benchmark Time CPU Iterations -------------------------------------------------------------------- bm_contains_char/16 1.88 ns 1.87 ns 371607095 bm_contains_char/256 7.48 ns 7.47 ns 93292285 bm_contains_char/4096 99.7 ns 99.6 ns 7013185 bm_contains_char/65536 1296 ns 1294 ns 540436 bm_contains_char/1048576 23887 ns 23860 ns 29302 bm_contains_char/16777216 389420 ns 389095 ns 1796 bm_contains_int/16 7.14 ns 7.14 ns 97776288 bm_contains_int/256 90.4 ns 90.3 ns 7558089 bm_contains_int/4096 1294 ns 1290 ns 543052 bm_contains_int/65536 20482 ns 20443 ns 34334 bm_contains_int/1048576 328817 ns 327965 ns 2147 bm_contains_int/16777216 5246279 ns 5239361 ns 133 bm_contains_bool/16 2.19 ns 2.19 ns 322565780 bm_contains_bool/256 3.42 ns 3.41 ns 205025467 bm_contains_bool/4096 22.1 ns 22.1 ns 31780479 bm_contains_bool/65536 333 ns 332 ns 2106606 bm_contains_bool/1048576 5126 ns 5119 ns 135901 bm_contains_bool/16777216 81656 ns 81574 ns 8569 ``` --------- Co-authored-by: Nathan Gauër <brioche@google.com>
2023-09-18[libc++] Implement ranges::ends_withZijun Zhao
Reviewed By: #libc, var-const Differential Revision: https://reviews.llvm.org/D150831
2023-09-05[libc++][C++20 modules] Enabling in C++20.Mark de Wever
The vendors of the MSVC STL, libstdc++ and libc++ have agreed [1] to make the C++23 modules std and std.compat available in C++20. This provides the std module; libc++ has not implemented the std.compat module yet. [1] https://github.com/microsoft/STL/issues/3945 Depends on D158357 Reviewed By: #libc, ldionne Differential Revision: https://reviews.llvm.org/D158358
2023-08-09[libc++][modules] Removes the module partitions.Mark de Wever
This patch is based on the suggestion by @ChuanqiXu on discourse (https://discourse.llvm.org/t/alternatives-to-the-implementation-of-std-modules/71958) Instead of making a module partition per header every header gets an inc file which contains the exports per header. The std module then includes all public headers and these inc files. The one file per header is useful for testing purposes. The CI tests whether the exports of a header's module partition matches the "public" named declarations in the header. With one file per header this can still be done. The patch improves compilation time of files using "import std;" and the size of the std module. A comparision of the compilation speed using a libc++ test build/bin/llvm-lit -a -Dstd=c++23 -Denable_modules=std libcxx/test/std/modules/std.pass.cpp Which boils down to import std; int main(int, char**) { std::println("Hello modular world"); return 0; } and has -ftime-report enabled Before ===-------------------------------------------------------------------------=== Clang front-end time report ===-------------------------------------------------------------------------=== Total Execution Time: 8.6585 seconds (8.6619 wall clock) ---User Time--- --System Time-- --User+System-- ---Wall Time--- --- Name --- 4.5041 ( 57.2%) 0.4264 ( 54.4%) 4.9305 ( 56.9%) 4.9331 ( 57.0%) Clang front-end timer 3.2037 ( 40.7%) 0.2408 ( 30.7%) 3.4445 ( 39.8%) 3.4452 ( 39.8%) Reading modules 0.1665 ( 2.1%) 0.1170 ( 14.9%) 0.2835 ( 3.3%) 0.2837 ( 3.3%) Loading .../build/test/__config_module__/CMakeFiles/std.dir/std.pcm 7.8744 (100.0%) 0.7842 (100.0%) 8.6585 (100.0%) 8.6619 (100.0%) Total After ===-------------------------------------------------------------------------=== Clang front-end time report ===-------------------------------------------------------------------------=== Total Execution Time: 1.2420 seconds (1.2423 wall clock) ---User Time--- --System Time-- --User+System-- ---Wall Time--- --- Name --- 0.8892 ( 84.6%) 0.1698 ( 88.8%) 1.0590 ( 85.3%) 1.0590 ( 85.2%) Clang front-end timer 0.1533 ( 14.6%) 0.0168 ( 8.8%) 0.1701 ( 13.7%) 0.1704 ( 13.7%) Reading modules 0.0082 ( 0.8%) 0.0047 ( 2.5%) 0.0129 ( 1.0%) 0.0129 ( 1.0%) Loading .../build/test/__config_module__/CMakeFiles/std.dir/std.pcm 1.0507 (100.0%) 0.1913 (100.0%) 1.2420 (100.0%) 1.2423 (100.0%) Total Using "include <print>" instead of "import module;" ===-------------------------------------------------------------------------=== Clang front-end time report ===-------------------------------------------------------------------------=== Total Execution Time: 2.1507 seconds (2.1517 wall clock) ---User Time--- --System Time-- --User+System-- ---Wall Time--- --- Name --- 1.9714 (100.0%) 0.1793 (100.0%) 2.1507 (100.0%) 2.1517 (100.0%) Clang front-end timer 1.9714 (100.0%) 0.1793 (100.0%) 2.1507 (100.0%) 2.1517 (100.0%) Total It's possible to use the std module in external projects (https://libcxx.llvm.org/Modules.html#using-in-external-projects) Tested this with a private project to validate the size of the generated files: Before $ du -sch std-* 448M std-build 508K std-src 120K std-subbuild 449M total After $ du -sch std-* 29M std-build 1004K std-src 132K std-subbuild 30M total Reviewed By: ldionne, #libc Differential Revision: https://reviews.llvm.org/D156907