Skip to content

Commit bd494b5

Browse files
TJ YinTJ Yin
authored andcommitted
Improve the build performance of mp_find.
1 parent 1caff7f commit bd494b5

File tree

4 files changed

+215
-0
lines changed

4 files changed

+215
-0
lines changed

include/boost/mp11/algorithm.hpp

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,151 @@ namespace detail
719719

720720
template<class L, class V> struct mp_find_impl;
721721

722+
#if defined(BOOST_MP11_HAS_VARIABLE_TEMPLATE) && defined(BOOST_MP11_HAS_IN_CLASS_EXPLICIT_SPECIALIZATIONS)
723+
template<template<class...> class L,
724+
class T0, class T1, class T2, class T3, class T4,
725+
class T5, class T6, class T7, class T8, class T9,
726+
class T10, class T11, class T12, class T13, class T14,
727+
class T15, class T16, class T17, class T18, class T19,
728+
class T20, class T21, class T22, class T23, class T24,
729+
class T25, class T26, class T27, class T28, class T29,
730+
class T30, class T31, class T32, class T33, class T34,
731+
class T35, class T36, class T37, class T38, class T39,
732+
class T40, class T41, class T42, class T43, class T44,
733+
class T45, class T46, class T47, class T48, class T49,
734+
class T50, class T51, class T52, class T53, class T54,
735+
class T55, class T56, class T57, class T58, class T59,
736+
class T60, class T61, class T62, class T63, class T64,
737+
class T65, class T66, class T67, class T68, class T69,
738+
class T70, class T71, class T72, class T73, class T74,
739+
class T75, class T76, class T77, class T78, class T79,
740+
class T80, class T81, class T82, class T83, class T84,
741+
class T85, class T86, class T87, class T88, class T89,
742+
class T90, class T91, class T92, class T93, class T94,
743+
class T95, class T96, class T97, class T98, class T99,
744+
class ...T, class V>
745+
struct mp_find_impl<L<
746+
T0, T1, T2, T3, T4, T5, T6, T7, T8, T9,
747+
T10, T11, T12, T13, T14, T15, T16, T17, T18, T19,
748+
T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
749+
T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
750+
T40, T41, T42, T43, T44, T45, T46, T47, T48, T49,
751+
T50, T51, T52, T53, T54, T55, T56, T57, T58, T59,
752+
T60, T61, T62, T63, T64, T65, T66, T67, T68, T69,
753+
T70, T71, T72, T73, T74, T75, T76, T77, T78, T79,
754+
T80, T81, T82, T83, T84, T85, T86, T87, T88, T89,
755+
T90, T91, T92, T93, T94, T95, T96, T97, T98, T99,
756+
T...>, V> {
757+
private:
758+
template<class>
759+
static const int value = mp_find_impl<L<T...>, V>::type::value + 100;
760+
761+
template<> static const int value<T0> = 0;
762+
template<> static const int value<T1> = 1;
763+
template<> static const int value<T2> = 2;
764+
template<> static const int value<T3> = 3;
765+
template<> static const int value<T4> = 4;
766+
template<> static const int value<T5> = 5;
767+
template<> static const int value<T6> = 6;
768+
template<> static const int value<T7> = 7;
769+
template<> static const int value<T8> = 8;
770+
template<> static const int value<T9> = 9;
771+
template<> static const int value<T10> = 10;
772+
template<> static const int value<T11> = 11;
773+
template<> static const int value<T12> = 12;
774+
template<> static const int value<T13> = 13;
775+
template<> static const int value<T14> = 14;
776+
template<> static const int value<T15> = 15;
777+
template<> static const int value<T16> = 16;
778+
template<> static const int value<T17> = 17;
779+
template<> static const int value<T18> = 18;
780+
template<> static const int value<T19> = 19;
781+
template<> static const int value<T20> = 20;
782+
template<> static const int value<T21> = 21;
783+
template<> static const int value<T22> = 22;
784+
template<> static const int value<T23> = 23;
785+
template<> static const int value<T24> = 24;
786+
template<> static const int value<T25> = 25;
787+
template<> static const int value<T26> = 26;
788+
template<> static const int value<T27> = 27;
789+
template<> static const int value<T28> = 28;
790+
template<> static const int value<T29> = 29;
791+
template<> static const int value<T30> = 30;
792+
template<> static const int value<T31> = 31;
793+
template<> static const int value<T32> = 32;
794+
template<> static const int value<T33> = 33;
795+
template<> static const int value<T34> = 34;
796+
template<> static const int value<T35> = 35;
797+
template<> static const int value<T36> = 36;
798+
template<> static const int value<T37> = 37;
799+
template<> static const int value<T38> = 38;
800+
template<> static const int value<T39> = 39;
801+
template<> static const int value<T40> = 40;
802+
template<> static const int value<T41> = 41;
803+
template<> static const int value<T42> = 42;
804+
template<> static const int value<T43> = 43;
805+
template<> static const int value<T44> = 44;
806+
template<> static const int value<T45> = 45;
807+
template<> static const int value<T46> = 46;
808+
template<> static const int value<T47> = 47;
809+
template<> static const int value<T48> = 48;
810+
template<> static const int value<T49> = 49;
811+
template<> static const int value<T50> = 50;
812+
template<> static const int value<T51> = 51;
813+
template<> static const int value<T52> = 52;
814+
template<> static const int value<T53> = 53;
815+
template<> static const int value<T54> = 54;
816+
template<> static const int value<T55> = 55;
817+
template<> static const int value<T56> = 56;
818+
template<> static const int value<T57> = 57;
819+
template<> static const int value<T58> = 58;
820+
template<> static const int value<T59> = 59;
821+
template<> static const int value<T60> = 60;
822+
template<> static const int value<T61> = 61;
823+
template<> static const int value<T62> = 62;
824+
template<> static const int value<T63> = 63;
825+
template<> static const int value<T64> = 64;
826+
template<> static const int value<T65> = 65;
827+
template<> static const int value<T66> = 66;
828+
template<> static const int value<T67> = 67;
829+
template<> static const int value<T68> = 68;
830+
template<> static const int value<T69> = 69;
831+
template<> static const int value<T70> = 70;
832+
template<> static const int value<T71> = 71;
833+
template<> static const int value<T72> = 72;
834+
template<> static const int value<T73> = 73;
835+
template<> static const int value<T74> = 74;
836+
template<> static const int value<T75> = 75;
837+
template<> static const int value<T76> = 76;
838+
template<> static const int value<T77> = 77;
839+
template<> static const int value<T78> = 78;
840+
template<> static const int value<T79> = 79;
841+
template<> static const int value<T80> = 80;
842+
template<> static const int value<T81> = 81;
843+
template<> static const int value<T82> = 82;
844+
template<> static const int value<T83> = 83;
845+
template<> static const int value<T84> = 84;
846+
template<> static const int value<T85> = 85;
847+
template<> static const int value<T86> = 86;
848+
template<> static const int value<T87> = 87;
849+
template<> static const int value<T88> = 88;
850+
template<> static const int value<T89> = 89;
851+
template<> static const int value<T90> = 90;
852+
template<> static const int value<T91> = 91;
853+
template<> static const int value<T92> = 92;
854+
template<> static const int value<T93> = 93;
855+
template<> static const int value<T94> = 94;
856+
template<> static const int value<T95> = 95;
857+
template<> static const int value<T96> = 96;
858+
template<> static const int value<T97> = 97;
859+
template<> static const int value<T98> = 98;
860+
template<> static const int value<T99> = 99;
861+
862+
public:
863+
using type = mp_size_t<value<V>>;
864+
};
865+
#endif
866+
722867
#if BOOST_MP11_CLANG && defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS )
723868

724869
struct mp_index_holder

include/boost/mp11/detail/config.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,4 +146,17 @@
146146
# define BOOST_MP11_DEPRECATED(msg)
147147
#endif
148148

149+
// BOOST_MP11_HAS_VARIABLE_TEMPLATE
150+
151+
#if defined(__cpp_variable_templates)
152+
#define BOOST_MP11_HAS_VARIABLE_TEMPLATE
153+
#endif
154+
155+
// BOOST_MP11_HAS_IN_CLASS_EXPLICIT_SPECIALIZATIONS
156+
157+
#if __cplusplus >= 201703L && BOOST_MP11_GCC == 0
158+
// GCC does not support cwg727 due to bug 85282
159+
#define BOOST_MP11_HAS_IN_CLASS_EXPLICIT_SPECIALIZATIONS
160+
#endif
161+
149162
#endif // #ifndef BOOST_MP11_DETAIL_CONFIG_HPP_INCLUDED

test/Jamfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ run mp_partition_q.cpp ;
123123
run mp_sort.cpp ;
124124
run mp_sort_q.cpp ;
125125
run mp_find.cpp ;
126+
run mp_find_2.cpp ;
126127
run mp_find_if.cpp ;
127128
run mp_find_if_q.cpp ;
128129
run mp_reverse.cpp ;

test/mp_find_2.cpp

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

0 commit comments

Comments
 (0)