Skip to content

Commit d5c654b

Browse files
authored
[libc++][RFC] Only include what is required by-version in the umbrella headers (#83740)
This is a relatively low cost way of reducing the include sizes in older language modes compared to the effect. For example, in C++14 mode the include time of `<algorithm>` is reduced from 198ms to 127ms.
1 parent 7cfe736 commit d5c654b

19 files changed

+374
-222
lines changed

libcxx/include/algorithm

Lines changed: 134 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -1794,15 +1794,11 @@ template <class BidirectionalIterator, class Compare>
17941794
*/
17951795

17961796
#include <__config>
1797-
#include <version>
17981797

17991798
#include <__algorithm/adjacent_find.h>
18001799
#include <__algorithm/all_of.h>
18011800
#include <__algorithm/any_of.h>
18021801
#include <__algorithm/binary_search.h>
1803-
#include <__algorithm/clamp.h>
1804-
#include <__algorithm/comp.h>
1805-
#include <__algorithm/comp_ref_type.h>
18061802
#include <__algorithm/copy.h>
18071803
#include <__algorithm/copy_backward.h>
18081804
#include <__algorithm/copy_if.h>
@@ -1818,18 +1814,9 @@ template <class BidirectionalIterator, class Compare>
18181814
#include <__algorithm/find_first_of.h>
18191815
#include <__algorithm/find_if.h>
18201816
#include <__algorithm/find_if_not.h>
1821-
#include <__algorithm/fold.h>
18221817
#include <__algorithm/for_each.h>
1823-
#include <__algorithm/for_each_n.h>
18241818
#include <__algorithm/generate.h>
18251819
#include <__algorithm/generate_n.h>
1826-
#include <__algorithm/half_positive.h>
1827-
#include <__algorithm/in_found_result.h>
1828-
#include <__algorithm/in_fun_result.h>
1829-
#include <__algorithm/in_in_out_result.h>
1830-
#include <__algorithm/in_in_result.h>
1831-
#include <__algorithm/in_out_out_result.h>
1832-
#include <__algorithm/in_out_result.h>
18331820
#include <__algorithm/includes.h>
18341821
#include <__algorithm/inplace_merge.h>
18351822
#include <__algorithm/is_heap.h>
@@ -1840,15 +1827,13 @@ template <class BidirectionalIterator, class Compare>
18401827
#include <__algorithm/is_sorted_until.h>
18411828
#include <__algorithm/iter_swap.h>
18421829
#include <__algorithm/lexicographical_compare.h>
1843-
#include <__algorithm/lexicographical_compare_three_way.h>
18441830
#include <__algorithm/lower_bound.h>
18451831
#include <__algorithm/make_heap.h>
18461832
#include <__algorithm/max.h>
18471833
#include <__algorithm/max_element.h>
18481834
#include <__algorithm/merge.h>
18491835
#include <__algorithm/min.h>
18501836
#include <__algorithm/min_element.h>
1851-
#include <__algorithm/min_max_result.h>
18521837
#include <__algorithm/minmax.h>
18531838
#include <__algorithm/minmax_element.h>
18541839
#include <__algorithm/mismatch.h>
@@ -1864,112 +1849,7 @@ template <class BidirectionalIterator, class Compare>
18641849
#include <__algorithm/partition_point.h>
18651850
#include <__algorithm/pop_heap.h>
18661851
#include <__algorithm/prev_permutation.h>
1867-
#include <__algorithm/pstl_any_all_none_of.h>
1868-
#include <__algorithm/pstl_copy.h>
1869-
#include <__algorithm/pstl_count.h>
1870-
#include <__algorithm/pstl_equal.h>
1871-
#include <__algorithm/pstl_fill.h>
1872-
#include <__algorithm/pstl_find.h>
1873-
#include <__algorithm/pstl_for_each.h>
1874-
#include <__algorithm/pstl_generate.h>
1875-
#include <__algorithm/pstl_is_partitioned.h>
1876-
#include <__algorithm/pstl_merge.h>
1877-
#include <__algorithm/pstl_move.h>
1878-
#include <__algorithm/pstl_replace.h>
1879-
#include <__algorithm/pstl_rotate_copy.h>
1880-
#include <__algorithm/pstl_sort.h>
1881-
#include <__algorithm/pstl_stable_sort.h>
1882-
#include <__algorithm/pstl_transform.h>
18831852
#include <__algorithm/push_heap.h>
1884-
#include <__algorithm/ranges_adjacent_find.h>
1885-
#include <__algorithm/ranges_all_of.h>
1886-
#include <__algorithm/ranges_any_of.h>
1887-
#include <__algorithm/ranges_binary_search.h>
1888-
#include <__algorithm/ranges_clamp.h>
1889-
#include <__algorithm/ranges_contains.h>
1890-
#include <__algorithm/ranges_contains_subrange.h>
1891-
#include <__algorithm/ranges_copy.h>
1892-
#include <__algorithm/ranges_copy_backward.h>
1893-
#include <__algorithm/ranges_copy_if.h>
1894-
#include <__algorithm/ranges_copy_n.h>
1895-
#include <__algorithm/ranges_count.h>
1896-
#include <__algorithm/ranges_count_if.h>
1897-
#include <__algorithm/ranges_ends_with.h>
1898-
#include <__algorithm/ranges_equal.h>
1899-
#include <__algorithm/ranges_equal_range.h>
1900-
#include <__algorithm/ranges_fill.h>
1901-
#include <__algorithm/ranges_fill_n.h>
1902-
#include <__algorithm/ranges_find.h>
1903-
#include <__algorithm/ranges_find_end.h>
1904-
#include <__algorithm/ranges_find_first_of.h>
1905-
#include <__algorithm/ranges_find_if.h>
1906-
#include <__algorithm/ranges_find_if_not.h>
1907-
#include <__algorithm/ranges_for_each.h>
1908-
#include <__algorithm/ranges_for_each_n.h>
1909-
#include <__algorithm/ranges_generate.h>
1910-
#include <__algorithm/ranges_generate_n.h>
1911-
#include <__algorithm/ranges_includes.h>
1912-
#include <__algorithm/ranges_inplace_merge.h>
1913-
#include <__algorithm/ranges_is_heap.h>
1914-
#include <__algorithm/ranges_is_heap_until.h>
1915-
#include <__algorithm/ranges_is_partitioned.h>
1916-
#include <__algorithm/ranges_is_permutation.h>
1917-
#include <__algorithm/ranges_is_sorted.h>
1918-
#include <__algorithm/ranges_is_sorted_until.h>
1919-
#include <__algorithm/ranges_lexicographical_compare.h>
1920-
#include <__algorithm/ranges_lower_bound.h>
1921-
#include <__algorithm/ranges_make_heap.h>
1922-
#include <__algorithm/ranges_max.h>
1923-
#include <__algorithm/ranges_max_element.h>
1924-
#include <__algorithm/ranges_merge.h>
1925-
#include <__algorithm/ranges_min.h>
1926-
#include <__algorithm/ranges_min_element.h>
1927-
#include <__algorithm/ranges_minmax.h>
1928-
#include <__algorithm/ranges_minmax_element.h>
1929-
#include <__algorithm/ranges_mismatch.h>
1930-
#include <__algorithm/ranges_move.h>
1931-
#include <__algorithm/ranges_move_backward.h>
1932-
#include <__algorithm/ranges_next_permutation.h>
1933-
#include <__algorithm/ranges_none_of.h>
1934-
#include <__algorithm/ranges_nth_element.h>
1935-
#include <__algorithm/ranges_partial_sort.h>
1936-
#include <__algorithm/ranges_partial_sort_copy.h>
1937-
#include <__algorithm/ranges_partition.h>
1938-
#include <__algorithm/ranges_partition_copy.h>
1939-
#include <__algorithm/ranges_partition_point.h>
1940-
#include <__algorithm/ranges_pop_heap.h>
1941-
#include <__algorithm/ranges_prev_permutation.h>
1942-
#include <__algorithm/ranges_push_heap.h>
1943-
#include <__algorithm/ranges_remove.h>
1944-
#include <__algorithm/ranges_remove_copy.h>
1945-
#include <__algorithm/ranges_remove_copy_if.h>
1946-
#include <__algorithm/ranges_remove_if.h>
1947-
#include <__algorithm/ranges_replace.h>
1948-
#include <__algorithm/ranges_replace_copy.h>
1949-
#include <__algorithm/ranges_replace_copy_if.h>
1950-
#include <__algorithm/ranges_replace_if.h>
1951-
#include <__algorithm/ranges_reverse.h>
1952-
#include <__algorithm/ranges_reverse_copy.h>
1953-
#include <__algorithm/ranges_rotate.h>
1954-
#include <__algorithm/ranges_rotate_copy.h>
1955-
#include <__algorithm/ranges_sample.h>
1956-
#include <__algorithm/ranges_search.h>
1957-
#include <__algorithm/ranges_search_n.h>
1958-
#include <__algorithm/ranges_set_difference.h>
1959-
#include <__algorithm/ranges_set_intersection.h>
1960-
#include <__algorithm/ranges_set_symmetric_difference.h>
1961-
#include <__algorithm/ranges_set_union.h>
1962-
#include <__algorithm/ranges_shuffle.h>
1963-
#include <__algorithm/ranges_sort.h>
1964-
#include <__algorithm/ranges_sort_heap.h>
1965-
#include <__algorithm/ranges_stable_partition.h>
1966-
#include <__algorithm/ranges_stable_sort.h>
1967-
#include <__algorithm/ranges_starts_with.h>
1968-
#include <__algorithm/ranges_swap_ranges.h>
1969-
#include <__algorithm/ranges_transform.h>
1970-
#include <__algorithm/ranges_unique.h>
1971-
#include <__algorithm/ranges_unique_copy.h>
1972-
#include <__algorithm/ranges_upper_bound.h>
19731853
#include <__algorithm/remove.h>
19741854
#include <__algorithm/remove_copy.h>
19751855
#include <__algorithm/remove_copy_if.h>
@@ -1982,17 +1862,13 @@ template <class BidirectionalIterator, class Compare>
19821862
#include <__algorithm/reverse_copy.h>
19831863
#include <__algorithm/rotate.h>
19841864
#include <__algorithm/rotate_copy.h>
1985-
#include <__algorithm/sample.h>
19861865
#include <__algorithm/search.h>
19871866
#include <__algorithm/search_n.h>
19881867
#include <__algorithm/set_difference.h>
19891868
#include <__algorithm/set_intersection.h>
19901869
#include <__algorithm/set_symmetric_difference.h>
19911870
#include <__algorithm/set_union.h>
1992-
#include <__algorithm/shift_left.h>
1993-
#include <__algorithm/shift_right.h>
19941871
#include <__algorithm/shuffle.h>
1995-
#include <__algorithm/sift_down.h>
19961872
#include <__algorithm/sort.h>
19971873
#include <__algorithm/sort_heap.h>
19981874
#include <__algorithm/stable_partition.h>
@@ -2001,9 +1877,138 @@ template <class BidirectionalIterator, class Compare>
20011877
#include <__algorithm/transform.h>
20021878
#include <__algorithm/unique.h>
20031879
#include <__algorithm/unique_copy.h>
2004-
#include <__algorithm/unwrap_iter.h>
20051880
#include <__algorithm/upper_bound.h>
20061881

1882+
#if _LIBCPP_STD_VER >= 17
1883+
# include <__algorithm/clamp.h>
1884+
# include <__algorithm/for_each_n.h>
1885+
# include <__algorithm/pstl_any_all_none_of.h>
1886+
# include <__algorithm/pstl_copy.h>
1887+
# include <__algorithm/pstl_count.h>
1888+
# include <__algorithm/pstl_equal.h>
1889+
# include <__algorithm/pstl_fill.h>
1890+
# include <__algorithm/pstl_find.h>
1891+
# include <__algorithm/pstl_for_each.h>
1892+
# include <__algorithm/pstl_generate.h>
1893+
# include <__algorithm/pstl_is_partitioned.h>
1894+
# include <__algorithm/pstl_merge.h>
1895+
# include <__algorithm/pstl_move.h>
1896+
# include <__algorithm/pstl_replace.h>
1897+
# include <__algorithm/pstl_rotate_copy.h>
1898+
# include <__algorithm/pstl_sort.h>
1899+
# include <__algorithm/pstl_stable_sort.h>
1900+
# include <__algorithm/pstl_transform.h>
1901+
# include <__algorithm/sample.h>
1902+
#endif // _LIBCPP_STD_VER >= 17
1903+
1904+
#if _LIBCPP_STD_VER >= 20
1905+
# include <__algorithm/in_found_result.h>
1906+
# include <__algorithm/in_fun_result.h>
1907+
# include <__algorithm/in_in_out_result.h>
1908+
# include <__algorithm/in_in_result.h>
1909+
# include <__algorithm/in_out_out_result.h>
1910+
# include <__algorithm/in_out_result.h>
1911+
# include <__algorithm/lexicographical_compare_three_way.h>
1912+
# include <__algorithm/min_max_result.h>
1913+
# include <__algorithm/ranges_adjacent_find.h>
1914+
# include <__algorithm/ranges_all_of.h>
1915+
# include <__algorithm/ranges_any_of.h>
1916+
# include <__algorithm/ranges_binary_search.h>
1917+
# include <__algorithm/ranges_clamp.h>
1918+
# include <__algorithm/ranges_contains.h>
1919+
# include <__algorithm/ranges_copy.h>
1920+
# include <__algorithm/ranges_copy_backward.h>
1921+
# include <__algorithm/ranges_copy_if.h>
1922+
# include <__algorithm/ranges_copy_n.h>
1923+
# include <__algorithm/ranges_count.h>
1924+
# include <__algorithm/ranges_count_if.h>
1925+
# include <__algorithm/ranges_equal.h>
1926+
# include <__algorithm/ranges_equal_range.h>
1927+
# include <__algorithm/ranges_fill.h>
1928+
# include <__algorithm/ranges_fill_n.h>
1929+
# include <__algorithm/ranges_find.h>
1930+
# include <__algorithm/ranges_find_end.h>
1931+
# include <__algorithm/ranges_find_first_of.h>
1932+
# include <__algorithm/ranges_find_if.h>
1933+
# include <__algorithm/ranges_find_if_not.h>
1934+
# include <__algorithm/ranges_for_each.h>
1935+
# include <__algorithm/ranges_for_each_n.h>
1936+
# include <__algorithm/ranges_generate.h>
1937+
# include <__algorithm/ranges_generate_n.h>
1938+
# include <__algorithm/ranges_includes.h>
1939+
# include <__algorithm/ranges_inplace_merge.h>
1940+
# include <__algorithm/ranges_is_heap.h>
1941+
# include <__algorithm/ranges_is_heap_until.h>
1942+
# include <__algorithm/ranges_is_partitioned.h>
1943+
# include <__algorithm/ranges_is_permutation.h>
1944+
# include <__algorithm/ranges_is_sorted.h>
1945+
# include <__algorithm/ranges_is_sorted_until.h>
1946+
# include <__algorithm/ranges_lexicographical_compare.h>
1947+
# include <__algorithm/ranges_lower_bound.h>
1948+
# include <__algorithm/ranges_make_heap.h>
1949+
# include <__algorithm/ranges_max.h>
1950+
# include <__algorithm/ranges_max_element.h>
1951+
# include <__algorithm/ranges_merge.h>
1952+
# include <__algorithm/ranges_min.h>
1953+
# include <__algorithm/ranges_min_element.h>
1954+
# include <__algorithm/ranges_minmax.h>
1955+
# include <__algorithm/ranges_minmax_element.h>
1956+
# include <__algorithm/ranges_mismatch.h>
1957+
# include <__algorithm/ranges_move.h>
1958+
# include <__algorithm/ranges_move_backward.h>
1959+
# include <__algorithm/ranges_next_permutation.h>
1960+
# include <__algorithm/ranges_none_of.h>
1961+
# include <__algorithm/ranges_nth_element.h>
1962+
# include <__algorithm/ranges_partial_sort.h>
1963+
# include <__algorithm/ranges_partial_sort_copy.h>
1964+
# include <__algorithm/ranges_partition.h>
1965+
# include <__algorithm/ranges_partition_copy.h>
1966+
# include <__algorithm/ranges_partition_point.h>
1967+
# include <__algorithm/ranges_pop_heap.h>
1968+
# include <__algorithm/ranges_prev_permutation.h>
1969+
# include <__algorithm/ranges_push_heap.h>
1970+
# include <__algorithm/ranges_remove.h>
1971+
# include <__algorithm/ranges_remove_copy.h>
1972+
# include <__algorithm/ranges_remove_copy_if.h>
1973+
# include <__algorithm/ranges_remove_if.h>
1974+
# include <__algorithm/ranges_replace.h>
1975+
# include <__algorithm/ranges_replace_copy.h>
1976+
# include <__algorithm/ranges_replace_copy_if.h>
1977+
# include <__algorithm/ranges_replace_if.h>
1978+
# include <__algorithm/ranges_reverse.h>
1979+
# include <__algorithm/ranges_reverse_copy.h>
1980+
# include <__algorithm/ranges_rotate.h>
1981+
# include <__algorithm/ranges_rotate_copy.h>
1982+
# include <__algorithm/ranges_sample.h>
1983+
# include <__algorithm/ranges_search.h>
1984+
# include <__algorithm/ranges_search_n.h>
1985+
# include <__algorithm/ranges_set_difference.h>
1986+
# include <__algorithm/ranges_set_intersection.h>
1987+
# include <__algorithm/ranges_set_symmetric_difference.h>
1988+
# include <__algorithm/ranges_set_union.h>
1989+
# include <__algorithm/ranges_shuffle.h>
1990+
# include <__algorithm/ranges_sort.h>
1991+
# include <__algorithm/ranges_sort_heap.h>
1992+
# include <__algorithm/ranges_stable_partition.h>
1993+
# include <__algorithm/ranges_stable_sort.h>
1994+
# include <__algorithm/ranges_swap_ranges.h>
1995+
# include <__algorithm/ranges_transform.h>
1996+
# include <__algorithm/ranges_unique.h>
1997+
# include <__algorithm/ranges_unique_copy.h>
1998+
# include <__algorithm/ranges_upper_bound.h>
1999+
# include <__algorithm/shift_left.h>
2000+
# include <__algorithm/shift_right.h>
2001+
#endif
2002+
2003+
#if _LIBCPP_STD_VER >= 23
2004+
# include <__algorithm/fold.h>
2005+
# include <__algorithm/ranges_contains_subrange.h>
2006+
# include <__algorithm/ranges_ends_with.h>
2007+
# include <__algorithm/ranges_starts_with.h>
2008+
#endif // _LIBCPP_STD_VER >= 23
2009+
2010+
#include <version>
2011+
20072012
// standard-mandated includes
20082013

20092014
// [algorithm.syn]
@@ -2013,6 +2018,10 @@ template <class BidirectionalIterator, class Compare>
20132018
# pragma GCC system_header
20142019
#endif
20152020

2021+
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER == 14
2022+
# include <execution>
2023+
#endif
2024+
20162025
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
20172026
# include <atomic>
20182027
# include <bit>

libcxx/include/bit

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,26 +61,36 @@ namespace std {
6161
6262
*/
6363

64-
#include <__bit/bit_cast.h>
65-
#include <__bit/bit_ceil.h>
66-
#include <__bit/bit_floor.h>
67-
#include <__bit/bit_log2.h>
68-
#include <__bit/bit_width.h>
69-
#include <__bit/blsr.h>
70-
#include <__bit/byteswap.h>
71-
#include <__bit/countl.h>
72-
#include <__bit/countr.h>
73-
#include <__bit/endian.h>
74-
#include <__bit/has_single_bit.h>
75-
#include <__bit/popcount.h>
76-
#include <__bit/rotate.h>
7764
#include <__config>
65+
66+
#if _LIBCPP_STD_VER >= 20
67+
# include <__bit/bit_cast.h>
68+
# include <__bit/bit_ceil.h>
69+
# include <__bit/bit_floor.h>
70+
# include <__bit/bit_log2.h>
71+
# include <__bit/bit_width.h>
72+
# include <__bit/countl.h>
73+
# include <__bit/countr.h>
74+
# include <__bit/endian.h>
75+
# include <__bit/has_single_bit.h>
76+
# include <__bit/popcount.h>
77+
# include <__bit/rotate.h>
78+
#endif
79+
80+
#if _LIBCPP_STD_VER >= 23
81+
# include <__bit/byteswap.h>
82+
#endif
83+
7884
#include <version>
7985

8086
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
8187
# pragma GCC system_header
8288
#endif
8389

90+
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
91+
# include <cstdint>
92+
#endif
93+
8494
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
8595
# include <cstdlib>
8696
# include <iosfwd>

0 commit comments

Comments
 (0)