Commit Graph

372 Commits

Author SHA1 Message Date
Jonathan Poelen 81b8660466 optimize mp_nth_element
compiler | gcc-15 | clang-20
before   | 0:00.66s - 206316K | 0:01.77s - 246832K
after    | 0:00.63s - 192944K | 0:01.76s - 245956K

```cpp
template<class I> using test = mp_nth_element<mp_iota_c<I::value+1>, I, mp_less>;

using r1 = mp_transform<test, mp_iota_c<30>>;
```
2026-03-26 15:39:34 +02:00
Peter Dimov da34232d24 Rename mp_sort_impl_f<>::f to fn, use _q form 2026-03-26 15:37:56 +02:00
Jonathan Poelen fe850e97ca optimize mp_sort (extract f from the struct to benefit from memoization)
compiler |       gcc-12       |      clang-15
before   | 0:00.46s - 198848K | 0:00.49s - 132632K
after    | 0:00.42s - 183384K | 0:00.48s - 131748K

```cpp
using namespace boost::mp11;

template<class I> using test = mp_sort<mp_iota<I>, mp_less>;

using r1 = mp_transform<test, mp_iota_c<25>>;
```
2026-03-26 15:30:45 +02:00
Peter Dimov fe1f7af136 Rename mp_power_set_impl_f<>::_f to fn, use _q form 2026-03-26 13:25:40 +02:00
Jonathan Poelen 0be25a2ec7 optimize mp_power_set (extract f from the struct to benefit from memoization)
compiler |       gcc-12       |      clang-15
before   | 0:01.35s - 538732K | 0:00.65s - 203924K
after    | 0:01.02s - 396032K | 0:00.65s - 203080K

```cpp
using namespace boost::mp11;

template<class I> using test = mp_power_set<mp_iota<I>>;

using r1 = mp_transform<test, mp_iota_c<15>>;
```
2026-03-26 13:17:02 +02:00
Jonathan Poelen 5e44572f44 optimize mp_drop (extract f from the struct to benefit from memoization)
compiler |       gcc-12       |      clang-15
before   | 0:00.48s - 192464K | 0:00.48s - 154480K
after    | 0:00.43s - 172472K | 0:00.46s - 150404K

```cpp
template<class L> struct f { template<class I> using g = mp_drop<L, I>; };
template<class I, class L = mp_iota<I>> using test = mp_transform<f<L>::template g, L>;

using r1 = mp_transform<test, mp_iota_c<50>>;
```
2026-03-26 11:29:41 +02:00
Peter Dimov efa2a7b554 Rename mp_map_update_impl_f<>::_f, mp_map_update_impl_f3<>::_f3 to fn, use _q form 2026-03-26 06:15:52 +02:00
Jonathan Poelen 825991fafc optimize mp_map_update (extract f from the struct to benefit from memoization)
compiler |       gcc-12       |      clang-15
before   | 0:00.73s - 270224K | 0:00.54s - 156112K
after    | 0:00.19s - 85004K  | 0:00.29s - 119232K

```cpp
using namespace boost::mp11;

template<class L, class M = mp_transform<mp_list, L>>
struct f { template<class I> using g = mp_map_update<M, mp_list<I>, mp_list>; };

template<class I, class L = mp_iota<I>> using test
  = mp_transform<f<L>::template g, L>;

using r1 = mp_transform<test, mp_iota_c<20>>;
```
2026-03-26 02:05:18 +02:00
Peter Dimov e388a13c6d Inline mp_map_erase_impl 2026-03-25 18:37:38 +02:00
Peter Dimov 93f9ce4fb9 Rename mp_map_erase_impl_f<>::_f to fn, use _q form 2026-03-25 18:35:20 +02:00
Jonathan Poelen a224ca39f7 optimize mp_map_erase (extract f from the struct to benefit from memoization)
compiler |       gcc-12       |      clang-15
before   | 0:00.52s - 197128K | 0:00.44s - 140780K
after    | 0:00.47s - 183968K | 0:00.43s - 139336K

```cpp
using namespace boost::mp11;

template<class L, class M = mp_transform<mp_list, L>>
struct f { template<class I> using g = mp_map_erase<M, I>; };

template<class I, class L = mp_iota<I>> using test
  = mp_transform<f<L>::template g, L>;

using r1 = mp_transform<test, mp_iota_c<30>>;
```
2026-03-25 18:32:37 +02:00
Jonathan Poelen 9613c80646 disable mp_map_find_impl gcc workaround with >=14.4 and >=15.2 2026-03-25 06:27:43 +02:00
Jonathan Poelen a6b6f8f85e optimize mp_map_find_impl gcc workaround
compiler | gcc-15
before   | 0:01.65s - 381364K
after    | 0:00.99s - 213064K

```cpp
template<class L, class M = mp_transform<mp_list, L>>
struct f { template<class I> using g = mp_map_find<M, I>; };

template<class I, class L = mp_iota<I>> using test
  = mp_transform<f<L>::template g, L>;

using r1 = mp_transform<test, mp_iota_c<50>>;
```
2026-03-25 02:40:18 +02:00
Jonathan Poelen aade5f1488 optimize mp_map_find (extract f from the struct to benefit from memoization)
compiler |       gcc-12       |      clang-15
before   | 0:00.29s - 128600K | 0:00.25s - 120604K
after    | 0:00.22s - 99908K  | 0:00.23s - 116084K

```cpp
using namespace boost::mp11;

template<class L, class M = mp_transform<mp_list, L>>
struct f { template<class I> using g = mp_map_find<M, I>; };

template<class I, class L = mp_iota<I>> using test
  = mp_transform<f<L>::template g, L>;

using r1 = mp_transform<test, mp_iota_c<50>>;
```
2026-03-25 02:25:07 +02:00
Peter Dimov 7db0511176 Rename detail::mp_transform_push_back to mp_transform_impl_f 2026-03-24 21:00:50 +02:00
Jonathan Poelen c53e110713 optimize mp_transform with 5 lists or more
compiler |      gcc-15       |     clang-20
before   | 0:00.21s - 80328K | 0:00.29s - 117756K
after    | 0:00.20s - 77408K | 0:00.29s - 117468K

```cpp
template<class I, class L = mp_iota<I>> using test
  = mp_transform<mp_list, L, L, L, L, L, L, L, L>;

using r1 = mp_transform<test, mp_iota_c<50>>;
```
2026-03-24 20:56:35 +02:00
Peter Dimov 0c2bd813d6 Rename detail::mp_fill_first_item to mp_fill_impl_f 2026-03-24 19:02:00 +02:00
Jonathan Poelen b4bfe74487 optimize mp_fill
compiler |      gcc-15       |     clang-20
before   | 0:00.15s - 60740K | 0:00.14s - 94144K
after    | 0:00.10s - 43504K | 0:00.14s - 94188K

```cpp
template<class I, class L = mp_iota<I>> using test
  = mp_fill<L, int>;

using r1 = mp_transform<test, mp_iota_c<100>>;
```
2026-03-24 18:56:19 +02:00
Jonathan Poelen d2c0c220b1 optimize mp_sliding_fold
compiler |      gcc-15       |     clang-20
before   | 0:00.23s - 79084K | 0:00.48s - 135100K
after    | 0:00.22s - 77748K | 0:00.46s - 132436K

```cpp
template<class I, class L = mp_iota<I>> using test
  = mp_list<
      mp_sliding_fold<L, mp_int<2>, mp_plus>,
      mp_sliding_fold<L, mp_int<2>, mp_max>
    >;

using r1 = mp_transform<test, mp_iota_c<50>>;
```
2026-03-24 17:36:18 +02:00
Jonathan Poelen 79fb6dc191 optimize mp_map_replace
compiler |      gcc-15        |     clang-20
before   | 0:00.39s - 114524K | 0:00.66s - 155888K
after    | 0:00.38s - 114140K | 0:00.64s - 155184K

```cpp
template<class I, class L = mp_transform<mp_list, mp_iota<I>>> using test
  = mp_map_replace<L, mp_list<I,I>>;

using r1 = mp_transform<test, mp_iota_c<120>>;
```
2026-03-24 14:40:40 +02:00
Jonathan Poelen 997206a1ae optimize mp_map_replace
compiler |       gcc-12       |      clang-15
before   | 0:00.46s - 187160K | 0:00.38s - 129104K
after    | 0:00.21s - 80236K  | 0:00.33s - 123644K

```cpp
using namespace boost::mp11;

template<class L, class M = mp_transform<mp_list, L>>
struct f { template<class I> using g = mp_map_replace<M, mp_list<I, I>>; };

template<class I, class L = mp_iota<I>> using test
  = mp_transform<f<L>::template g, L>;

using r1 = mp_transform<test, mp_iota_c<30>>;
```
2026-03-24 14:40:21 +02:00
Jonathan Poelen 31ced7d7e2 optimize mp_replace_if
compiler |      gcc-15       |     clang-20
before   | 0:00.23s - 76088K | 0:00.37s - 116984K
after    | 0:00.22s - 75348K | 0:00.35s - 114952K

```cpp
template<class> using pred = mp_false;
template<class I, class L = mp_iota<I>> using test
  = mp_replace_if<L, pred, I>;

using r1 = mp_transform<test, mp_iota_c<120>>;
```
2026-03-24 05:21:51 +02:00
Jonathan Poelen 24e9ec6593 optimize mp_replace
compiler |      gcc-15       |     clang-20
before   | 0:00.30s - 90020K | 0:00.48s - 129272K
after    | 0:00.29s - 89428K | 0:00.46s - 126580K

```cpp
template<class I, class L = mp_iota<I>> using test
  = mp_replace<L, I, I>;

using r1 = mp_transform<test, mp_iota_c<120>>;
```
2026-03-24 03:50:40 +02:00
Jonathan Poelen 0d61d09d3a optimize mp_remove
compiler |      gcc-15       |     clang-20
before   | 0:00.32s - 91276K | 0:00.69s - 156512K
after    | 0:00.31s - 90684K | 0:00.67s - 157560K

```cpp
template<class> using pred = mp_true;
template<class I, class L = mp_iota<I>> using test
  = mp_remove<L, I>;

using r1 = mp_transform<test, mp_iota_c<120>>;
```
2026-03-24 02:27:42 +02:00
Jonathan Poelen e06ba9abd3 optimize mp_copy_if
compiler |      gcc-15       |     clang-20
before   | 0:00.21s - 65820K | 0:00.51s - 138048K
after    | 0:00.21s - 65428K | 0:00.49s - 138540K

```cpp
template<class> using pred = mp_false;
template<class I, class L = mp_iota<I>> using test
  = mp_copy_if<L, pred>;

using r1 = mp_transform<test, mp_iota_c<120>>;
```
2026-03-23 22:49:31 +02:00
Jonathan Poelen 04dd0e118c optimize mp_remove_if
compiler |      gcc-15       |     clang-20
before   | 0:00.21s - 67308K | 0:00.51s - 137744K
after    | 0:00.21s - 66956K | 0:00.49s - 138492K

```cpp
template<class> using pred = mp_true;
template<class I, class L = mp_iota<I>> using test
  = mp_remove_if<L, pred>;

using r1 = mp_transform<test, mp_iota_c<120>>;
```
2026-03-23 21:25:37 +02:00
Jonathan Poelen 2d3a0e9877 optimize integer_sequence with gcc
Use the `__integer_pack` builtin

compiler |      gcc-15
before   | 0:00.14s - 47284K
after    | 0:00.07s - 37572K

```cpp
template<class I> using test
  = make_integer_sequence<int, I::value>;

using r1 = mp_transform<test, mp_iota_c<200>>;
```
2026-03-23 17:49:05 +02:00
Peter Dimov fc8003d32c Update version 2025-12-15 15:49:34 +02:00
Peter Dimov 811aa7a0f1 Update mp_reverse_fold to work on fixed size lists. Fixes #108. 2025-10-21 18:51:31 +03:00
Peter Dimov 50e2a0a1b8 Update version 2025-10-09 18:32:10 +03:00
Peter Dimov 2fb81c2453 Update version 2025-06-28 08:20:51 +03:00
Peter Dimov 1a99027e8c Add an alternative implementation of mp_map_find for GCC 14+. Fixes #106. 2025-05-08 15:50:59 +03:00
Peter Dimov 9910ada772 Clang considers the specialization ambiguous in C++17 and above, rewrite. Fixes #103. 2025-01-07 22:52:07 +02:00
Peter Dimov 7ca1e0a92b Add a specialization of mp_from_sequence_impl to handle the defaulted offset case. Fixes #103. 2025-01-07 21:10:14 +02:00
Peter Dimov 82533c431e Do not use fold expressions for mp_find and mp_find_if 2024-12-21 21:48:37 +02:00
Peter Dimov b108e01927 Update version 2024-12-13 22:43:40 +02:00
joaquintides 28929d9794 kept old impl for msvc 12.0 2024-11-08 22:07:10 +01:00
joaquintides c2bc9788ca made mp_is_set<S> robust when S is not a list 2024-11-08 19:50:48 +01:00
joaquintides 13a81c86ee added missing #include 2024-11-08 19:21:27 +01:00
joaquintides fb79d23aac improved performance of mp_is_set 2024-11-08 19:08:50 +01:00
Peter Dimov 1caff7ffa9 Change second occurrence of the same code in mp_count.hpp to match 2024-10-22 19:50:32 +03:00
Chris Ward 44a731d868 Candidate fix
code without "if constexpr"
2024-10-22 08:59:32 +01:00
Peter Dimov 8ceb48b4c9 Stylistic changes to mp_lambda 2024-10-14 19:37:36 +03:00
joaquintides ead27ca191 Feature/lambda (#96)
* added mp_lambda

* launched GHA

* skipped ICE-generating test in GCC < 4.9

* fixed GCC detection in workaround

* test-skipped and documented GCC 4.8 bug

* added missing s/const/CONST

* tempirarily expanded macro to isolate problem with VS2017

* tried workaround for C3546

* tried another workaround

* wrapped workaround up

* dropped unnecessary devoiding in variadic (member) functions

* temporary code to check VS compliance wrt function qualifiers

* removed version printer

* checked compliance with qualified (member) function partial specialization

* checked each partial specialization individually

* wrapped up VS2013 investigation

* left variadics out of VS2013

* skipped noexcept-involving tests for VS2013 (keyword not supported)

* given up on VS2013 support for mp_lambda

* dropped lambda_devoid_args
2024-10-14 18:15:14 +03:00
Peter Dimov a064da5757 Update version 2024-08-17 04:25:45 +03:00
Peter Dimov 859a30e46f Update version 2024-04-18 12:06:16 +03:00
Peter Dimov 20fff14a90 Use push_macro/pop_macro to guard against the macro I from <complex.h>. Fixes #88. 2023-12-21 21:55:24 +02:00
Peter Dimov 679834bfdc Update version 2023-12-19 13:20:05 +02:00
Peter Dimov 4db3374eed Add value list support to mp_transform (for up to three lists). Closes #86. 2023-12-18 05:53:20 +02:00
Peter Dimov ee5f1d620f Add value list support to mp_min_element, mp_max_element. Fixes #87. 2023-12-17 20:37:56 +02:00