Advertisement
fcamuso

C++ 20 - lezione 1

Sep 15th, 2022
1,330
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 18.58 KB | None | 0 0
  1. // //credits cppreference.com
  2. static struct PrintOptions {
  3.     constexpr static bool titles = 1;
  4.     constexpr static bool counters = 1;
  5.     constexpr static bool attributes = 1;
  6.     constexpr static bool general_features = 1;
  7.     constexpr static bool core_features = 1;
  8.     constexpr static bool lib_features = 1;
  9.     constexpr static bool supported_features = 1;
  10.     constexpr static bool unsupported_features = 1;
  11.     constexpr static bool sort_by_date = 0;
  12.     constexpr static bool separate_year_month = 0;
  13.     constexpr static bool cxx11 = 1;
  14.     constexpr static bool cxx14 = 1;
  15.     constexpr static bool cxx17 = 1;
  16.     constexpr static bool cxx20 = 1;
  17.     constexpr static bool cxx23 = 1;
  18.     constexpr static bool cxx26 = 0;
  19. }   print;
  20.  
  21. #if __cplusplus < 201100
  22.    #error "C++11 or better is required"
  23. #endif
  24.  
  25. #include <algorithm>
  26. #include <cstring>
  27. #include <iomanip>
  28. #include <iostream>
  29. #include <string>
  30.  
  31. #ifdef __has_include
  32. # if __has_include(<version>)
  33. #   include <version>
  34. # endif
  35. #endif
  36.  
  37. #define COMPILER_FEATURE_VALUE(value) #value
  38. #define COMPILER_FEATURE_ENTRY(name) { #name, COMPILER_FEATURE_VALUE(name) },
  39.  
  40. #ifdef __has_cpp_attribute
  41. # define COMPILER_ATTRIBUTE_VALUE_AS_STRING(s) #s
  42. # define COMPILER_ATTRIBUTE_AS_NUMBER(x) COMPILER_ATTRIBUTE_VALUE_AS_STRING(x)
  43. # define COMPILER_ATTRIBUTE_ENTRY(attr) \
  44.   { #attr, COMPILER_ATTRIBUTE_AS_NUMBER(__has_cpp_attribute(attr)) },
  45. #else
  46. # define COMPILER_ATTRIBUTE_ENTRY(attr) { #attr, "_" },
  47. #endif
  48.  
  49. struct CompilerFeature {
  50.     CompilerFeature(const char* name = nullptr, const char* value = nullptr)
  51.         : name(name), value(value) {}
  52.     const char* name; const char* value;
  53. };
  54.  
  55. static CompilerFeature cxx_core[] = {
  56. COMPILER_FEATURE_ENTRY(__cplusplus)
  57. COMPILER_FEATURE_ENTRY(__cpp_exceptions)
  58. COMPILER_FEATURE_ENTRY(__cpp_rtti)
  59. #if 0
  60. COMPILER_FEATURE_ENTRY(__GNUC__)
  61. COMPILER_FEATURE_ENTRY(__GNUC_MINOR__)
  62. COMPILER_FEATURE_ENTRY(__GNUC_PATCHLEVEL__)
  63. COMPILER_FEATURE_ENTRY(__GNUG__)
  64. COMPILER_FEATURE_ENTRY(__clang__)
  65. COMPILER_FEATURE_ENTRY(__clang_major__)
  66. COMPILER_FEATURE_ENTRY(__clang_minor__)
  67. COMPILER_FEATURE_ENTRY(__clang_patchlevel__)
  68. #endif
  69. };
  70. static CompilerFeature cxx11_core[] = {
  71. COMPILER_FEATURE_ENTRY(__cpp_alias_templates)
  72. COMPILER_FEATURE_ENTRY(__cpp_attributes)
  73. COMPILER_FEATURE_ENTRY(__cpp_constexpr)
  74. COMPILER_FEATURE_ENTRY(__cpp_decltype)
  75. COMPILER_FEATURE_ENTRY(__cpp_delegating_constructors)
  76. COMPILER_FEATURE_ENTRY(__cpp_inheriting_constructors)
  77. COMPILER_FEATURE_ENTRY(__cpp_initializer_lists)
  78. COMPILER_FEATURE_ENTRY(__cpp_lambdas)
  79. COMPILER_FEATURE_ENTRY(__cpp_nsdmi)
  80. COMPILER_FEATURE_ENTRY(__cpp_range_based_for)
  81. COMPILER_FEATURE_ENTRY(__cpp_raw_strings)
  82. COMPILER_FEATURE_ENTRY(__cpp_ref_qualifiers)
  83. COMPILER_FEATURE_ENTRY(__cpp_rvalue_references)
  84. COMPILER_FEATURE_ENTRY(__cpp_static_assert)
  85. COMPILER_FEATURE_ENTRY(__cpp_threadsafe_static_init)
  86. COMPILER_FEATURE_ENTRY(__cpp_unicode_characters)
  87. COMPILER_FEATURE_ENTRY(__cpp_unicode_literals)
  88. COMPILER_FEATURE_ENTRY(__cpp_user_defined_literals)
  89. COMPILER_FEATURE_ENTRY(__cpp_variadic_templates)
  90. };
  91. static CompilerFeature cxx14_core[] = {
  92. COMPILER_FEATURE_ENTRY(__cpp_aggregate_nsdmi)
  93. COMPILER_FEATURE_ENTRY(__cpp_binary_literals)
  94. COMPILER_FEATURE_ENTRY(__cpp_constexpr)
  95. COMPILER_FEATURE_ENTRY(__cpp_decltype_auto)
  96. COMPILER_FEATURE_ENTRY(__cpp_generic_lambdas)
  97. COMPILER_FEATURE_ENTRY(__cpp_init_captures)
  98. COMPILER_FEATURE_ENTRY(__cpp_return_type_deduction)
  99. COMPILER_FEATURE_ENTRY(__cpp_sized_deallocation)
  100. COMPILER_FEATURE_ENTRY(__cpp_variable_templates)
  101. };
  102. static CompilerFeature cxx14_lib[] = {
  103. COMPILER_FEATURE_ENTRY(__cpp_lib_chrono_udls)
  104. COMPILER_FEATURE_ENTRY(__cpp_lib_complex_udls)
  105. COMPILER_FEATURE_ENTRY(__cpp_lib_exchange_function)
  106. COMPILER_FEATURE_ENTRY(__cpp_lib_generic_associative_lookup)
  107. COMPILER_FEATURE_ENTRY(__cpp_lib_integer_sequence)
  108. COMPILER_FEATURE_ENTRY(__cpp_lib_integral_constant_callable)
  109. COMPILER_FEATURE_ENTRY(__cpp_lib_is_final)
  110. COMPILER_FEATURE_ENTRY(__cpp_lib_is_null_pointer)
  111. COMPILER_FEATURE_ENTRY(__cpp_lib_make_reverse_iterator)
  112. COMPILER_FEATURE_ENTRY(__cpp_lib_make_unique)
  113. COMPILER_FEATURE_ENTRY(__cpp_lib_null_iterators)
  114. COMPILER_FEATURE_ENTRY(__cpp_lib_quoted_string_io)
  115. COMPILER_FEATURE_ENTRY(__cpp_lib_result_of_sfinae)
  116. COMPILER_FEATURE_ENTRY(__cpp_lib_robust_nonmodifying_seq_ops)
  117. COMPILER_FEATURE_ENTRY(__cpp_lib_shared_timed_mutex)
  118. COMPILER_FEATURE_ENTRY(__cpp_lib_string_udls)
  119. COMPILER_FEATURE_ENTRY(__cpp_lib_transformation_trait_aliases)
  120. COMPILER_FEATURE_ENTRY(__cpp_lib_transparent_operators)
  121. COMPILER_FEATURE_ENTRY(__cpp_lib_tuple_element_t)
  122. COMPILER_FEATURE_ENTRY(__cpp_lib_tuples_by_type)
  123. };
  124.  
  125. static CompilerFeature cxx17_core[] = {
  126. COMPILER_FEATURE_ENTRY(__cpp_aggregate_bases)
  127. COMPILER_FEATURE_ENTRY(__cpp_aligned_new)
  128. COMPILER_FEATURE_ENTRY(__cpp_capture_star_this)
  129. COMPILER_FEATURE_ENTRY(__cpp_constexpr)
  130. COMPILER_FEATURE_ENTRY(__cpp_deduction_guides)
  131. COMPILER_FEATURE_ENTRY(__cpp_enumerator_attributes)
  132. COMPILER_FEATURE_ENTRY(__cpp_fold_expressions)
  133. COMPILER_FEATURE_ENTRY(__cpp_guaranteed_copy_elision)
  134. COMPILER_FEATURE_ENTRY(__cpp_hex_float)
  135. COMPILER_FEATURE_ENTRY(__cpp_if_constexpr)
  136. COMPILER_FEATURE_ENTRY(__cpp_inheriting_constructors)
  137. COMPILER_FEATURE_ENTRY(__cpp_inline_variables)
  138. COMPILER_FEATURE_ENTRY(__cpp_namespace_attributes)
  139. COMPILER_FEATURE_ENTRY(__cpp_noexcept_function_type)
  140. COMPILER_FEATURE_ENTRY(__cpp_nontype_template_args)
  141. COMPILER_FEATURE_ENTRY(__cpp_nontype_template_parameter_auto)
  142. COMPILER_FEATURE_ENTRY(__cpp_range_based_for)
  143. COMPILER_FEATURE_ENTRY(__cpp_static_assert)
  144. COMPILER_FEATURE_ENTRY(__cpp_structured_bindings)
  145. COMPILER_FEATURE_ENTRY(__cpp_template_template_args)
  146. COMPILER_FEATURE_ENTRY(__cpp_variadic_using)
  147. };
  148. static CompilerFeature cxx17_lib[] = {
  149. COMPILER_FEATURE_ENTRY(__cpp_lib_addressof_constexpr)
  150. COMPILER_FEATURE_ENTRY(__cpp_lib_allocator_traits_is_always_equal)
  151. COMPILER_FEATURE_ENTRY(__cpp_lib_any)
  152. COMPILER_FEATURE_ENTRY(__cpp_lib_apply)
  153. COMPILER_FEATURE_ENTRY(__cpp_lib_array_constexpr)
  154. COMPILER_FEATURE_ENTRY(__cpp_lib_as_const)
  155. COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_is_always_lock_free)
  156. COMPILER_FEATURE_ENTRY(__cpp_lib_bool_constant)
  157. COMPILER_FEATURE_ENTRY(__cpp_lib_boyer_moore_searcher)
  158. COMPILER_FEATURE_ENTRY(__cpp_lib_byte)
  159. COMPILER_FEATURE_ENTRY(__cpp_lib_chrono)
  160. COMPILER_FEATURE_ENTRY(__cpp_lib_clamp)
  161. COMPILER_FEATURE_ENTRY(__cpp_lib_enable_shared_from_this)
  162. COMPILER_FEATURE_ENTRY(__cpp_lib_execution)
  163. COMPILER_FEATURE_ENTRY(__cpp_lib_filesystem)
  164. COMPILER_FEATURE_ENTRY(__cpp_lib_gcd_lcm)
  165. COMPILER_FEATURE_ENTRY(__cpp_lib_hardware_interference_size)
  166. COMPILER_FEATURE_ENTRY(__cpp_lib_has_unique_object_representations)
  167. COMPILER_FEATURE_ENTRY(__cpp_lib_hypot)
  168. COMPILER_FEATURE_ENTRY(__cpp_lib_incomplete_container_elements)
  169. COMPILER_FEATURE_ENTRY(__cpp_lib_invoke)
  170. COMPILER_FEATURE_ENTRY(__cpp_lib_is_aggregate)
  171. COMPILER_FEATURE_ENTRY(__cpp_lib_is_invocable)
  172. COMPILER_FEATURE_ENTRY(__cpp_lib_is_swappable)
  173. COMPILER_FEATURE_ENTRY(__cpp_lib_launder)
  174. COMPILER_FEATURE_ENTRY(__cpp_lib_logical_traits)
  175. COMPILER_FEATURE_ENTRY(__cpp_lib_make_from_tuple)
  176. COMPILER_FEATURE_ENTRY(__cpp_lib_map_try_emplace)
  177. COMPILER_FEATURE_ENTRY(__cpp_lib_math_special_functions)
  178. COMPILER_FEATURE_ENTRY(__cpp_lib_memory_resource)
  179. COMPILER_FEATURE_ENTRY(__cpp_lib_node_extract)
  180. COMPILER_FEATURE_ENTRY(__cpp_lib_nonmember_container_access)
  181. COMPILER_FEATURE_ENTRY(__cpp_lib_not_fn)
  182. COMPILER_FEATURE_ENTRY(__cpp_lib_optional)
  183. COMPILER_FEATURE_ENTRY(__cpp_lib_parallel_algorithm)
  184. COMPILER_FEATURE_ENTRY(__cpp_lib_raw_memory_algorithms)
  185. COMPILER_FEATURE_ENTRY(__cpp_lib_sample)
  186. COMPILER_FEATURE_ENTRY(__cpp_lib_scoped_lock)
  187. COMPILER_FEATURE_ENTRY(__cpp_lib_shared_mutex)
  188. COMPILER_FEATURE_ENTRY(__cpp_lib_shared_ptr_arrays)
  189. COMPILER_FEATURE_ENTRY(__cpp_lib_shared_ptr_weak_type)
  190. COMPILER_FEATURE_ENTRY(__cpp_lib_string_view)
  191. COMPILER_FEATURE_ENTRY(__cpp_lib_to_chars)
  192. COMPILER_FEATURE_ENTRY(__cpp_lib_transparent_operators)
  193. COMPILER_FEATURE_ENTRY(__cpp_lib_type_trait_variable_templates)
  194. COMPILER_FEATURE_ENTRY(__cpp_lib_uncaught_exceptions)
  195. COMPILER_FEATURE_ENTRY(__cpp_lib_unordered_map_try_emplace)
  196. COMPILER_FEATURE_ENTRY(__cpp_lib_variant)
  197. COMPILER_FEATURE_ENTRY(__cpp_lib_void_t)
  198. };
  199.  
  200. static CompilerFeature cxx20_core[] = {
  201. COMPILER_FEATURE_ENTRY(__cpp_aggregate_paren_init)
  202. COMPILER_FEATURE_ENTRY(__cpp_char8_t)
  203. COMPILER_FEATURE_ENTRY(__cpp_concepts)
  204. COMPILER_FEATURE_ENTRY(__cpp_conditional_explicit)
  205. COMPILER_FEATURE_ENTRY(__cpp_consteval)
  206. COMPILER_FEATURE_ENTRY(__cpp_constexpr)
  207. COMPILER_FEATURE_ENTRY(__cpp_constexpr_dynamic_alloc)
  208. COMPILER_FEATURE_ENTRY(__cpp_constexpr_in_decltype)
  209. COMPILER_FEATURE_ENTRY(__cpp_constinit)
  210. COMPILER_FEATURE_ENTRY(__cpp_deduction_guides)
  211. COMPILER_FEATURE_ENTRY(__cpp_designated_initializers)
  212. COMPILER_FEATURE_ENTRY(__cpp_generic_lambdas)
  213. COMPILER_FEATURE_ENTRY(__cpp_impl_coroutine)
  214. COMPILER_FEATURE_ENTRY(__cpp_impl_destroying_delete)
  215. COMPILER_FEATURE_ENTRY(__cpp_impl_three_way_comparison)
  216. COMPILER_FEATURE_ENTRY(__cpp_init_captures)
  217. COMPILER_FEATURE_ENTRY(__cpp_modules)
  218. COMPILER_FEATURE_ENTRY(__cpp_nontype_template_args)
  219. COMPILER_FEATURE_ENTRY(__cpp_using_enum)
  220. };
  221. static CompilerFeature cxx20_lib[] = {
  222. COMPILER_FEATURE_ENTRY(__cpp_lib_array_constexpr)
  223. COMPILER_FEATURE_ENTRY(__cpp_lib_assume_aligned)
  224. COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_flag_test)
  225. COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_float)
  226. COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_lock_free_type_aliases)
  227. COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_ref)
  228. COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_shared_ptr)
  229. COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_value_initialization)
  230. COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_wait)
  231. COMPILER_FEATURE_ENTRY(__cpp_lib_barrier)
  232. COMPILER_FEATURE_ENTRY(__cpp_lib_bind_front)
  233. COMPILER_FEATURE_ENTRY(__cpp_lib_bit_cast)
  234. COMPILER_FEATURE_ENTRY(__cpp_lib_bitops)
  235. COMPILER_FEATURE_ENTRY(__cpp_lib_bounded_array_traits)
  236. COMPILER_FEATURE_ENTRY(__cpp_lib_char8_t)
  237. COMPILER_FEATURE_ENTRY(__cpp_lib_chrono)
  238. COMPILER_FEATURE_ENTRY(__cpp_lib_concepts)
  239. COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_algorithms)
  240. COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_complex)
  241. COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_dynamic_alloc)
  242. COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_functional)
  243. COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_iterator)
  244. COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_memory)
  245. COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_numeric)
  246. COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_string)
  247. COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_string_view)
  248. COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_tuple)
  249. COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_utility)
  250. COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_vector)
  251. COMPILER_FEATURE_ENTRY(__cpp_lib_coroutine)
  252. COMPILER_FEATURE_ENTRY(__cpp_lib_destroying_delete)
  253. COMPILER_FEATURE_ENTRY(__cpp_lib_endian)
  254. COMPILER_FEATURE_ENTRY(__cpp_lib_erase_if)
  255. COMPILER_FEATURE_ENTRY(__cpp_lib_execution)
  256. COMPILER_FEATURE_ENTRY(__cpp_lib_format)
  257. COMPILER_FEATURE_ENTRY(__cpp_lib_generic_unordered_lookup)
  258. COMPILER_FEATURE_ENTRY(__cpp_lib_int_pow2)
  259. COMPILER_FEATURE_ENTRY(__cpp_lib_integer_comparison_functions)
  260. COMPILER_FEATURE_ENTRY(__cpp_lib_interpolate)
  261. COMPILER_FEATURE_ENTRY(__cpp_lib_is_constant_evaluated)
  262. COMPILER_FEATURE_ENTRY(__cpp_lib_is_layout_compatible)
  263. COMPILER_FEATURE_ENTRY(__cpp_lib_is_nothrow_convertible)
  264. COMPILER_FEATURE_ENTRY(__cpp_lib_is_pointer_interconvertible)
  265. COMPILER_FEATURE_ENTRY(__cpp_lib_jthread)
  266. COMPILER_FEATURE_ENTRY(__cpp_lib_latch)
  267. COMPILER_FEATURE_ENTRY(__cpp_lib_list_remove_return_type)
  268. COMPILER_FEATURE_ENTRY(__cpp_lib_math_constants)
  269. COMPILER_FEATURE_ENTRY(__cpp_lib_polymorphic_allocator)
  270. COMPILER_FEATURE_ENTRY(__cpp_lib_ranges)
  271. COMPILER_FEATURE_ENTRY(__cpp_lib_remove_cvref)
  272. COMPILER_FEATURE_ENTRY(__cpp_lib_semaphore)
  273. COMPILER_FEATURE_ENTRY(__cpp_lib_shared_ptr_arrays)
  274. COMPILER_FEATURE_ENTRY(__cpp_lib_shift)
  275. COMPILER_FEATURE_ENTRY(__cpp_lib_smart_ptr_for_overwrite)
  276. COMPILER_FEATURE_ENTRY(__cpp_lib_source_location)
  277. COMPILER_FEATURE_ENTRY(__cpp_lib_span)
  278. COMPILER_FEATURE_ENTRY(__cpp_lib_ssize)
  279. COMPILER_FEATURE_ENTRY(__cpp_lib_starts_ends_with)
  280. COMPILER_FEATURE_ENTRY(__cpp_lib_string_view)
  281. COMPILER_FEATURE_ENTRY(__cpp_lib_syncbuf)
  282. COMPILER_FEATURE_ENTRY(__cpp_lib_three_way_comparison)
  283. COMPILER_FEATURE_ENTRY(__cpp_lib_to_address)
  284. COMPILER_FEATURE_ENTRY(__cpp_lib_to_array)
  285. COMPILER_FEATURE_ENTRY(__cpp_lib_type_identity)
  286. COMPILER_FEATURE_ENTRY(__cpp_lib_unwrap_ref)
  287. };
  288.  
  289. static CompilerFeature cxx23_core[] = {
  290.     //< Continue to Populate
  291.     COMPILER_FEATURE_ENTRY(__cpp_char8_t)
  292.     COMPILER_FEATURE_ENTRY(__cpp_concepts)
  293.     COMPILER_FEATURE_ENTRY(__cpp_constexpr)
  294.     COMPILER_FEATURE_ENTRY(__cpp_explicit_this_parameter)
  295.     COMPILER_FEATURE_ENTRY(__cpp_if_consteval)
  296.     COMPILER_FEATURE_ENTRY(__cpp_implicit_move)
  297.     COMPILER_FEATURE_ENTRY(__cpp_multidimensional_subscript)
  298.     COMPILER_FEATURE_ENTRY(__cpp_named_character_escapes)
  299.     COMPILER_FEATURE_ENTRY(__cpp_size_t_suffix)
  300.     COMPILER_FEATURE_ENTRY(__cpp_static_call_operator)
  301. };
  302. static CompilerFeature cxx23_lib[] = {
  303.     //< Continue to Populate
  304.     COMPILER_FEATURE_ENTRY(__cpp_lib_adaptor_iterator_pair_constructor)
  305.     COMPILER_FEATURE_ENTRY(__cpp_lib_algorithm_iterator_requirements)
  306.     COMPILER_FEATURE_ENTRY(__cpp_lib_allocate_at_least)
  307.     COMPILER_FEATURE_ENTRY(__cpp_lib_associative_heterogeneous_erasure)
  308.     COMPILER_FEATURE_ENTRY(__cpp_lib_bind_back)
  309.     COMPILER_FEATURE_ENTRY(__cpp_lib_byteswap)
  310.     COMPILER_FEATURE_ENTRY(__cpp_lib_concepts)
  311.     COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_bitset)
  312.     COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_charconv)
  313.     COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_cmath)
  314.     COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_memory)
  315.     COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_typeinfo)
  316.     COMPILER_FEATURE_ENTRY(__cpp_lib_containers_ranges)
  317.     COMPILER_FEATURE_ENTRY(__cpp_lib_expected)
  318.     COMPILER_FEATURE_ENTRY(__cpp_lib_find_last)
  319.     COMPILER_FEATURE_ENTRY(__cpp_lib_flat_map)
  320.     COMPILER_FEATURE_ENTRY(__cpp_lib_flat_set)
  321.     COMPILER_FEATURE_ENTRY(__cpp_lib_format)
  322.     COMPILER_FEATURE_ENTRY(__cpp_lib_format_ranges)
  323.     COMPILER_FEATURE_ENTRY(__cpp_lib_forward_like)
  324.     COMPILER_FEATURE_ENTRY(__cpp_lib_generator)
  325.     COMPILER_FEATURE_ENTRY(__cpp_lib_invoke_r)
  326.     COMPILER_FEATURE_ENTRY(__cpp_lib_ios_noreplace)
  327.     COMPILER_FEATURE_ENTRY(__cpp_lib_is_scoped_enum)
  328.     COMPILER_FEATURE_ENTRY(__cpp_lib_mdspan)
  329.     COMPILER_FEATURE_ENTRY(__cpp_lib_modules)
  330.     COMPILER_FEATURE_ENTRY(__cpp_lib_move_iterator_concept)
  331.     COMPILER_FEATURE_ENTRY(__cpp_lib_move_only_function)
  332.     COMPILER_FEATURE_ENTRY(__cpp_lib_optional)
  333.     COMPILER_FEATURE_ENTRY(__cpp_lib_out_ptr)
  334.     COMPILER_FEATURE_ENTRY(__cpp_lib_print)
  335.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges)
  336.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_as_const)
  337.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_as_rvalue)
  338.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_cartesian_product)
  339.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_chunk)
  340.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_chunk_by)
  341.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_contains)
  342.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_fold)
  343.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_iota)
  344.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_join_with)
  345.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_repeat)
  346.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_slide)
  347.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_starts_ends_with)
  348.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_stride)
  349.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_to_container)
  350.     COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_zip)
  351.     COMPILER_FEATURE_ENTRY(__cpp_lib_reference_from_temporary)
  352.     COMPILER_FEATURE_ENTRY(__cpp_lib_shift)
  353.     COMPILER_FEATURE_ENTRY(__cpp_lib_spanstream)
  354.     COMPILER_FEATURE_ENTRY(__cpp_lib_stacktrace)
  355.     COMPILER_FEATURE_ENTRY(__cpp_lib_start_lifetime_as)
  356.     COMPILER_FEATURE_ENTRY(__cpp_lib_stdatomic_h)
  357.     COMPILER_FEATURE_ENTRY(__cpp_lib_string_contains)
  358.     COMPILER_FEATURE_ENTRY(__cpp_lib_string_resize_and_overwrite)
  359.     COMPILER_FEATURE_ENTRY(__cpp_lib_to_underlying)
  360.     COMPILER_FEATURE_ENTRY(__cpp_lib_tuple_like)
  361.     COMPILER_FEATURE_ENTRY(__cpp_lib_unreachable)
  362.     COMPILER_FEATURE_ENTRY(__cpp_lib_variant)
  363. };
  364.  
  365. static CompilerFeature cxx26_core[] = {
  366.     //< Populate
  367.     COMPILER_FEATURE_ENTRY(__cpp_core_TODO)
  368. };
  369. static CompilerFeature cxx26_lib[] = {
  370.     //< Populate
  371.     COMPILER_FEATURE_ENTRY(__cpp_lib_TODO)
  372. };
  373.  
  374. static CompilerFeature attributes[] = {
  375. COMPILER_ATTRIBUTE_ENTRY(assume)
  376. COMPILER_ATTRIBUTE_ENTRY(carries_dependency)
  377. COMPILER_ATTRIBUTE_ENTRY(deprecated)
  378. COMPILER_ATTRIBUTE_ENTRY(fallthrough)
  379. COMPILER_ATTRIBUTE_ENTRY(likely)
  380. COMPILER_ATTRIBUTE_ENTRY(maybe_unused)
  381. COMPILER_ATTRIBUTE_ENTRY(nodiscard)
  382. COMPILER_ATTRIBUTE_ENTRY(noreturn)
  383. COMPILER_ATTRIBUTE_ENTRY(no_unique_address)
  384. COMPILER_ATTRIBUTE_ENTRY(unlikely)
  385. };
  386.  
  387. constexpr bool is_feature_supported(const CompilerFeature& x) {
  388.     return x.value[0] != '_' && x.value[0] != '0';
  389. }
  390.  
  391. inline void print_compiler_feature(const CompilerFeature& x) {
  392.     constexpr static int max_name_length = 44; //< Update if necessary
  393.     std::string value{ is_feature_supported(x) ? x.value : "------" };
  394.     if (value.back() == 'L') value.pop_back(); //~ 201603L -> 201603
  395.     if (print.separate_year_month) value.insert(4, 1, '-'); //~ 201603 -> 2016-03
  396.     if ((print.supported_features && is_feature_supported(x))
  397.         or (print.unsupported_features && !is_feature_supported(x))) {
  398.         std::cout << std::left << std::setw(max_name_length)
  399.             << x.name << " " << value << '\n';
  400.     }
  401. }
  402.  
  403. template<size_t N>
  404. inline void show(char const* title, CompilerFeature(&features)[N]) {
  405.     if (print.titles) {
  406.         std::cout << std::left << title << " (";
  407.         if (print.counters)
  408.             std::cout << std::count_if(
  409.                 std::begin(features), std::end(features), is_feature_supported) << '/';
  410.         std::cout << N << ")\n";
  411.     }
  412.     if (print.sort_by_date) {
  413.         std::sort(std::begin(features), std::end(features),
  414.             [](CompilerFeature const& lhs, CompilerFeature const& rhs) {
  415.                 return std::strcmp(lhs.value, rhs.value) < 0;
  416.             });
  417.     }
  418.     for (const CompilerFeature& x : features) {
  419.         print_compiler_feature(x);
  420.     }
  421.     std::cout << '\n';
  422. }
  423.  
  424. int main() {
  425.     if (print.general_features) show("C++ GENERAL", cxx_core);
  426.     if (print.cxx11 && print.core_features) show("C++11 CORE", cxx11_core);
  427.     if (print.cxx14 && print.core_features) show("C++14 CORE", cxx14_core);
  428.     if (print.cxx14 && print.lib_features) show("C++14 LIB", cxx14_lib);
  429.     if (print.cxx17 && print.core_features) show("C++17 CORE", cxx17_core);
  430.     if (print.cxx17 && print.lib_features) show("C++17 LIB", cxx17_lib);
  431.     if (print.cxx20 && print.core_features) show("C++20 CORE", cxx20_core);
  432.     if (print.cxx20 && print.lib_features) show("C++20 LIB", cxx20_lib);
  433.     if (print.cxx23 && print.core_features) show("C++23 CORE", cxx23_core);
  434.     if (print.cxx23 && print.lib_features) show("C++23 LIB", cxx23_lib);
  435.     if (print.cxx26 && print.core_features) show("C++26 CORE", cxx26_core);
  436.     if (print.cxx26 && print.lib_features) show("C++26 LIB", cxx26_lib);
  437.     if (print.attributes) show("ATTRIBUTES", attributes);
  438. }
  439.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement