Skip to content

Instantly share code, notes, and snippets.

@yshui
Last active December 17, 2016 03:17
Show Gist options
  • Save yshui/61ec77b3fa6ea2d5855ac8165cf2c055 to your computer and use it in GitHub Desktop.
Save yshui/61ec77b3fa6ea2d5855ac8165cf2c055 to your computer and use it in GitHub Desktop.
Symbol name goes BOOM!
template<typename First, typename ...Rest>
struct Int{
using Next = Int<Int<First, Rest...>, First, Rest...>;
using Prev = First;
};
struct Zero{
using Next = Int<Zero, Int<Zero>>;
};
template<typename A, typename B>
struct Plus{
using Result=typename Plus<A,typename B::Prev>::Result::Next;
};
template<typename A>
struct Plus<A, Zero>{
using Result=A;
};
template<typename A>
struct Double {
using Result=typename Plus<A,A>::Result;
};
template<typename L, typename R>
struct Bottom {
};
template<typename Level, typename L, typename R>
struct Boom {
using Inner = Boom<typename Level::Prev, typename Boom<typename Level::Prev,L,typename Level::Prev>::Inner, typename Boom<typename Level::Prev,R,typename Level::Prev>::Inner>;
};
template<typename L, typename R>
struct Boom<Zero,L,R> {
using Inner = Bottom<L,R>;
};
template<typename A>
struct PowerOf2 {
using Result = typename Double<typename PowerOf2<typename A::Prev>::Result>::Result;
};
template<>
struct PowerOf2<Zero> {
using Result = Zero::Next;
};
using One=Zero::Next;
using Two=Double<One>::Result;
using Four=Double<Two>::Result;
using Eight=Double<Four>::Result;
using Sixteen=Double<Eight>::Result;
using I256 = PowerOf2<Eight>::Result;
template<typename T>
int x() {return 0;}
int main(){
return x<typename Boom<I256,Zero,One>::Inner>();
}
// Below is results when using Boom<Eight, Zero, One>, for Boom<I256, Zero, One> you can try yourself
// g++ boom.cpp
// objdump -t a.out
// ...
// 00000000004004d1 w F .text 000000000000000b _Z1xI4BoomI3IntIS1_IS1_IS1_IS1_IS1_IS1_IS1_IS1_IS1_IS1_IS1_IS1_IS1_IS1_I4ZeroJS1_IS2_JEEEEJS2_S3_EEJS4_S2_S3_EEJS5_S4_S2_S3_EEJS6_S5_S4_S2_S3_EEJS7_S6_S5_S4_S2_S3_EEJS8_S7_S6_S5_S4_S2_S3_EEJS9_S8_S7_S6_S5_S4_S2_S3_EEJSA_S9_S8_S7_S6_S5_S4_S2_S3_EEJSB_SA_S9_S8_S7_S6_S5_S4_S2_S3_EEJSC_SB_SA_S9_S8_S7_S6_S5_S4_S2_S3_EEJSD_SC_SB_SA_S9_S8_S7_S6_S5_S4_S2_S3_EEJSE_SD_SC_SB_SA_S9_S8_S7_S6_S5_S4_S2_S3_EEJSF_SE_SD_SC_SB_SA_S9_S8_S7_S6_S5_S4_S2_S3_EEJSG_SF_SE_SD_SC_SB_SA_S9_S8_S7_S6_S5_S4_S2_S3_EES0_ISH_S0_ISG_S0_ISF_S0_ISE_S0_ISD_S0_ISC_S0_ISB_S0_ISA_S0_IS9_S0_IS8_S0_IS7_S0_IS6_S0_IS5_S0_IS4_S0_IS2_6BottomIS2_S2_ESJ_IS4_S2_EES0_IS2_SJ_IS5_S2_ESL_EES0_IS4_S0_IS2_SJ_IS6_S2_ESL_ESO_EES0_IS5_S0_IS4_S0_IS2_SJ_IS7_S2_ESL_ESO_ESS_EES0_IS6_S0_IS5_S0_IS4_S0_IS2_SJ_IS8_S2_ESL_ESO_ESS_ESX_EES0_IS7_S0_IS6_S0_IS5_S0_IS4_S0_IS2_SJ_IS9_S2_ESL_ESO_ESS_ESX_ES13_EES0_IS8_S0_IS7_S0_IS6_S0_IS5_S0_IS4_S0_IS2_SJ_ISA_S2_ESL_ESO_ESS_ESX_ES13_ES1A_EES0_IS9_S0_IS8_S0_IS7_S0_IS6_S0_IS5_S0_IS4_S0_IS2_SJ_ISB_S2_ESL_ESO_ESS_ESX_ES13_ES1A_ES1I_EES0_ISA_S0_IS9_S0_IS8_S0_IS7_S0_IS6_S0_IS5_S0_IS4_S0_IS2_SJ_ISC_S2_ESL_ESO_ESS_ESX_ES13_ES1A_ES1I_ES1R_EES0_ISB_S0_ISA_S0_IS9_S0_IS8_S0_IS7_S0_IS6_S0_IS5_S0_IS4_S0_IS2_SJ_ISD_S2_ESL_ESO_ESS_ESX_ES13_ES1A_ES1I_ES1R_ES21_EES0_ISC_S0_ISB_S0_ISA_S0_IS9_S0_IS8_S0_IS7_S0_IS6_S0_IS5_S0_IS4_S0_IS2_SJ_ISE_S2_ESL_ESO_ESS_ESX_ES13_ES1A_ES1I_ES1R_ES21_ES2C_EES0_ISD_S0_ISC_S0_ISB_S0_ISA_S0_IS9_S0_IS8_S0_IS7_S0_IS6_S0_IS5_S0_IS4_S0_IS2_SJ_ISF_S2_ESL_ESO_ESS_ESX_ES13_ES1A_ES1I_ES1R_ES21_ES2C_ES2O_EES0_ISE_S0_ISD_S0_ISC_S0_ISB_S0_ISA_S0_IS9_S0_IS8_S0_IS7_S0_IS6_S0_IS5_S0_IS4_S0_IS2_SJ_ISG_S2_ESL_ESO_ESS_ESX_ES13_ES1A_ES1I_ES1R_ES21_ES2C_ES2O_ES31_EES0_ISF_S0_ISE_S0_ISD_S0_ISC_S0_ISB_S0_ISA_S0_IS9_S0_IS8_S0_IS7_S0_IS6_S0_IS5_S0_IS4_S0_IS2_SJ_ISH_S2_ESL_ESO_ESS_ESX_ES13_ES1A_ES1I_ES1R_ES21_ES2C_ES2O_ES31_ES3F_EES0_ISG_S0_ISF_S0_ISE_S0_ISD_S0_ISC_S0_ISB_S0_ISA_S0_IS9_S0_IS8_S0_IS7_S0_IS6_S0_IS5_S0_IS4_S0_IS2_SJ_ISI_S2_ESL_ESO_ESS_ESX_ES13_ES1A_ES1I_ES1R_ES21_ES2C_ES2O_ES31_ES3F_ES3U_EES0_ISH_S0_ISG_S0_ISF_S0_ISE_S0_ISD_S0_ISC_S0_ISB_S0_ISA_S0_IS9_S0_IS8_S0_IS7_S0_IS6_S0_IS5_S0_IS4_S0_IS2_SL_SL_ESO_ESS_ESX_ES13_ES1A_ES1I_ES1R_ES21_ES2C_ES2O_ES31_ES3F_ES3U_ES4A_EEEiv
// ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment