Skip to content

Commit

Permalink
Improve the build performance of mp_find.
Browse files Browse the repository at this point in the history
  • Loading branch information
TJ Yin authored and TJ Yin committed Oct 25, 2024
1 parent 1caff7f commit bd494b5
Show file tree
Hide file tree
Showing 4 changed files with 215 additions and 0 deletions.
145 changes: 145 additions & 0 deletions include/boost/mp11/algorithm.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,151 @@ namespace detail

template<class L, class V> struct mp_find_impl;

#if defined(BOOST_MP11_HAS_VARIABLE_TEMPLATE) && defined(BOOST_MP11_HAS_IN_CLASS_EXPLICIT_SPECIALIZATIONS)
template<template<class...> class L,
class T0, class T1, class T2, class T3, class T4,
class T5, class T6, class T7, class T8, class T9,
class T10, class T11, class T12, class T13, class T14,
class T15, class T16, class T17, class T18, class T19,
class T20, class T21, class T22, class T23, class T24,
class T25, class T26, class T27, class T28, class T29,
class T30, class T31, class T32, class T33, class T34,
class T35, class T36, class T37, class T38, class T39,
class T40, class T41, class T42, class T43, class T44,
class T45, class T46, class T47, class T48, class T49,
class T50, class T51, class T52, class T53, class T54,
class T55, class T56, class T57, class T58, class T59,
class T60, class T61, class T62, class T63, class T64,
class T65, class T66, class T67, class T68, class T69,
class T70, class T71, class T72, class T73, class T74,
class T75, class T76, class T77, class T78, class T79,
class T80, class T81, class T82, class T83, class T84,
class T85, class T86, class T87, class T88, class T89,
class T90, class T91, class T92, class T93, class T94,
class T95, class T96, class T97, class T98, class T99,
class ...T, class V>
struct mp_find_impl<L<
T0, T1, T2, T3, T4, T5, T6, T7, T8, T9,
T10, T11, T12, T13, T14, T15, T16, T17, T18, T19,
T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
T40, T41, T42, T43, T44, T45, T46, T47, T48, T49,
T50, T51, T52, T53, T54, T55, T56, T57, T58, T59,
T60, T61, T62, T63, T64, T65, T66, T67, T68, T69,
T70, T71, T72, T73, T74, T75, T76, T77, T78, T79,
T80, T81, T82, T83, T84, T85, T86, T87, T88, T89,
T90, T91, T92, T93, T94, T95, T96, T97, T98, T99,
T...>, V> {
private:
template<class>
static const int value = mp_find_impl<L<T...>, V>::type::value + 100;

template<> static const int value<T0> = 0;
template<> static const int value<T1> = 1;
template<> static const int value<T2> = 2;
template<> static const int value<T3> = 3;
template<> static const int value<T4> = 4;
template<> static const int value<T5> = 5;
template<> static const int value<T6> = 6;
template<> static const int value<T7> = 7;
template<> static const int value<T8> = 8;
template<> static const int value<T9> = 9;
template<> static const int value<T10> = 10;
template<> static const int value<T11> = 11;
template<> static const int value<T12> = 12;
template<> static const int value<T13> = 13;
template<> static const int value<T14> = 14;
template<> static const int value<T15> = 15;
template<> static const int value<T16> = 16;
template<> static const int value<T17> = 17;
template<> static const int value<T18> = 18;
template<> static const int value<T19> = 19;
template<> static const int value<T20> = 20;
template<> static const int value<T21> = 21;
template<> static const int value<T22> = 22;
template<> static const int value<T23> = 23;
template<> static const int value<T24> = 24;
template<> static const int value<T25> = 25;
template<> static const int value<T26> = 26;
template<> static const int value<T27> = 27;
template<> static const int value<T28> = 28;
template<> static const int value<T29> = 29;
template<> static const int value<T30> = 30;
template<> static const int value<T31> = 31;
template<> static const int value<T32> = 32;
template<> static const int value<T33> = 33;
template<> static const int value<T34> = 34;
template<> static const int value<T35> = 35;
template<> static const int value<T36> = 36;
template<> static const int value<T37> = 37;
template<> static const int value<T38> = 38;
template<> static const int value<T39> = 39;
template<> static const int value<T40> = 40;
template<> static const int value<T41> = 41;
template<> static const int value<T42> = 42;
template<> static const int value<T43> = 43;
template<> static const int value<T44> = 44;
template<> static const int value<T45> = 45;
template<> static const int value<T46> = 46;
template<> static const int value<T47> = 47;
template<> static const int value<T48> = 48;
template<> static const int value<T49> = 49;
template<> static const int value<T50> = 50;
template<> static const int value<T51> = 51;
template<> static const int value<T52> = 52;
template<> static const int value<T53> = 53;
template<> static const int value<T54> = 54;
template<> static const int value<T55> = 55;
template<> static const int value<T56> = 56;
template<> static const int value<T57> = 57;
template<> static const int value<T58> = 58;
template<> static const int value<T59> = 59;
template<> static const int value<T60> = 60;
template<> static const int value<T61> = 61;
template<> static const int value<T62> = 62;
template<> static const int value<T63> = 63;
template<> static const int value<T64> = 64;
template<> static const int value<T65> = 65;
template<> static const int value<T66> = 66;
template<> static const int value<T67> = 67;
template<> static const int value<T68> = 68;
template<> static const int value<T69> = 69;
template<> static const int value<T70> = 70;
template<> static const int value<T71> = 71;
template<> static const int value<T72> = 72;
template<> static const int value<T73> = 73;
template<> static const int value<T74> = 74;
template<> static const int value<T75> = 75;
template<> static const int value<T76> = 76;
template<> static const int value<T77> = 77;
template<> static const int value<T78> = 78;
template<> static const int value<T79> = 79;
template<> static const int value<T80> = 80;
template<> static const int value<T81> = 81;
template<> static const int value<T82> = 82;
template<> static const int value<T83> = 83;
template<> static const int value<T84> = 84;
template<> static const int value<T85> = 85;
template<> static const int value<T86> = 86;
template<> static const int value<T87> = 87;
template<> static const int value<T88> = 88;
template<> static const int value<T89> = 89;
template<> static const int value<T90> = 90;
template<> static const int value<T91> = 91;
template<> static const int value<T92> = 92;
template<> static const int value<T93> = 93;
template<> static const int value<T94> = 94;
template<> static const int value<T95> = 95;
template<> static const int value<T96> = 96;
template<> static const int value<T97> = 97;
template<> static const int value<T98> = 98;
template<> static const int value<T99> = 99;

public:
using type = mp_size_t<value<V>>;
};
#endif

#if BOOST_MP11_CLANG && defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS )

struct mp_index_holder
Expand Down
13 changes: 13 additions & 0 deletions include/boost/mp11/detail/config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,4 +146,17 @@
# define BOOST_MP11_DEPRECATED(msg)
#endif

// BOOST_MP11_HAS_VARIABLE_TEMPLATE

#if defined(__cpp_variable_templates)
#define BOOST_MP11_HAS_VARIABLE_TEMPLATE
#endif

// BOOST_MP11_HAS_IN_CLASS_EXPLICIT_SPECIALIZATIONS

#if __cplusplus >= 201703L && BOOST_MP11_GCC == 0
// GCC does not support cwg727 due to bug 85282
#define BOOST_MP11_HAS_IN_CLASS_EXPLICIT_SPECIALIZATIONS
#endif

#endif // #ifndef BOOST_MP11_DETAIL_CONFIG_HPP_INCLUDED
1 change: 1 addition & 0 deletions test/Jamfile
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ run mp_partition_q.cpp ;
run mp_sort.cpp ;
run mp_sort_q.cpp ;
run mp_find.cpp ;
run mp_find_2.cpp ;
run mp_find_if.cpp ;
run mp_find_if_q.cpp ;
run mp_reverse.cpp ;
Expand Down
56 changes: 56 additions & 0 deletions test/mp_find_2.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// Copyright 2015 Peter Dimov.
//
// Distributed under the Boost Software License, Version 1.0.
//
// See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt

#include <boost/core/lightweight_test_trait.hpp>
#include <boost/mp11/algorithm.hpp>
#include <boost/mp11/integral.hpp>
#include <boost/mp11/list.hpp>

template <int> struct X {};

int main() {
using boost::mp11::mp_find;
using boost::mp11::mp_list;
using boost::mp11::mp_size_t;

using L = mp_list<
X<0>, X<1>, X<2>, X<3>, X<4>, X<5>, X<6>, X<7>, X<8>, X<9>, X<10>, X<11>,
X<12>, X<13>, X<14>, X<15>, X<16>, X<17>, X<18>, X<19>, X<20>, X<21>,
X<22>, X<23>, X<24>, X<25>, X<26>, X<27>, X<28>, X<29>, X<30>, X<31>,
X<32>, X<33>, X<34>, X<35>, X<36>, X<37>, X<38>, X<39>, X<40>, X<41>,
X<42>, X<43>, X<44>, X<45>, X<46>, X<47>, X<48>, X<49>, X<50>, X<51>,
X<52>, X<53>, X<54>, X<55>, X<56>, X<57>, X<58>, X<59>, X<60>, X<61>,
X<62>, X<63>, X<64>, X<65>, X<66>, X<67>, X<68>, X<69>, X<70>, X<71>,
X<72>, X<73>, X<74>, X<75>, X<76>, X<77>, X<78>, X<79>, X<80>, X<81>,
X<82>, X<83>, X<84>, X<85>, X<86>, X<87>, X<88>, X<89>, X<90>, X<91>,
X<92>, X<93>, X<94>, X<95>, X<96>, X<97>, X<98>, X<99>, X<100>, X<101>,
X<102>, X<103>, X<104>, X<105>, X<106>, X<107>, X<108>, X<109>, X<110>,
X<111>, X<112>, X<113>, X<114>, X<115>, X<116>, X<117>, X<118>, X<119>,
X<120>, X<121>, X<122>, X<123>, X<124>, X<125>, X<126>, X<127>, X<128>,
X<129>, X<130>, X<131>, X<132>, X<133>, X<134>, X<135>, X<136>, X<137>,
X<138>, X<139>, X<140>, X<141>, X<142>, X<143>, X<144>, X<145>, X<146>,
X<147>, X<148>, X<149>, X<150>, X<151>, X<152>, X<153>, X<154>, X<155>,
X<156>, X<157>, X<158>, X<159>, X<160>, X<161>, X<162>, X<163>, X<164>,
X<165>, X<166>, X<167>, X<168>, X<169>, X<170>, X<171>, X<172>, X<173>,
X<174>, X<175>, X<176>, X<177>, X<178>, X<179>, X<180>, X<181>, X<182>,
X<183>, X<184>, X<185>, X<186>, X<187>, X<188>, X<189>, X<190>, X<191>,
X<192>, X<193>, X<194>, X<195>, X<196>, X<197>, X<198>, X<199>, X<200>,
X<201>, X<202>, X<203>, X<204>, X<205>, X<206>, X<207>, X<208>, X<209>,
X<210>, X<211>, X<212>, X<213>, X<214>, X<215>, X<216>, X<217>, X<218>,
X<219>, X<220>, X<221>, X<222>, X<223>, X<224>, X<225>, X<226>, X<227>,
X<228>, X<229>, X<230>, X<231>, X<232>, X<233>, X<234>, X<235>, X<236>,
X<237>, X<238>, X<239>, X<240>, X<241>, X<242>, X<243>, X<244>, X<245>,
X<246>, X<247>, X<248>, X<249>, X<250>, X<251>, X<252>, X<253>, X<254>,
X<255>>;

BOOST_TEST_TRAIT_TRUE((std::is_same<mp_find<L, X<0>>, mp_size_t<0>>));
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_find<L, X<1>>, mp_size_t<1>>));
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_find<L, X<100>>, mp_size_t<100>>));
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_find<L, X<254>>, mp_size_t<254>>));
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_find<L, X<255>>, mp_size_t<255>>));
return boost::report_errors();
}

0 comments on commit bd494b5

Please sign in to comment.