#ifndef OBFUSCATOR_HPP #define OBFUSCATOR_HPP #include #include #define COMPILE_TIME_RANDOM #define OBFS_RAND_VAL(MOD) RAND_VAL<__LINE__, MOD> #define COMPILE_TIME_SEQUENCE #define OBFS_STRING namespace obfs { constexpr char TIME[] = __TIME__; constexpr int digit(char c) { return c - '0'; } constexpr int SEED = digit(TIME[7]) + digit(TIME[6]) * 10 + digit(TIME[4]) * 60 + digit(TIME[3]) * 600 + digit(TIME[1]) * 3600 + digit(TIME[0]) * 36000; using size_t = decltype(sizeof(void*)); template struct Xorshiftplus { using prev = Xorshiftplus; constexpr static size_t update() { constexpr size_t x = prev::state0 ^ (prev::state0 << 23); constexpr size_t y = prev::state1; return x ^ y ^ (x >> 17) ^ (y >> 26); } constexpr static size_t state0 = prev::state1; constexpr static size_t state1 = update(); constexpr static size_t value = state0 + state1; }; template <> struct Xorshiftplus<0> { constexpr static size_t state0 = static_cast(SEED); constexpr static size_t state1 = static_cast(SEED << 1); constexpr static size_t value = state0 + state1; }; template constexpr size_t RAND_VAL = Xorshiftplus::value % Mod; } namespace obfs { template struct TypeVal { using value_type = T; constexpr static T value = Val; }; struct Nothing {}; template struct Sequence { using value = TypeVal; using next = Sequence; template using index = std::conditional_t>; }; template struct Sequence { using value = TypeVal; template using index = std::conditional_t; }; template struct TypeSeq { using type = T; using next = TypeSeq; template using index = std::conditional_t>; }; template struct TypeSeq { using type = T; template using index = std::conditional_t; }; template struct SeqPack { constexpr static std::size_t size = sizeof...(T); template using getter = typename U::template index; template using index = TypeSeq...>; }; } namespace obfs { using Encoder = char(*)(char); using Decoder = char(*)(char); template class String { public: template constexpr String(char const* str, std::index_sequence): str{ encoder(str[Idx])... } { // Do Nothing } constexpr std::size_t len() const { return size; } inline char const* decode() const { for (char& chr : str) { chr = decoder(chr); } return str; } private: mutable char str[size]; }; template constexpr auto make_string(char const (&str)[size]) { return String(str, std::make_index_sequence()); } template using encoder_seq = Sequence; template using decoder_seq = Sequence; template using make_table = SeqPack; template constexpr auto make_string(char const (&str)[size]) { using pair = Table::index; constexpr Encoder encoder = pair::index<0>::value; constexpr Decoder decoder = pair::index<1>::value; return make_string(str); } } #endif