Advertisement
Guest User

Untitled

a guest
Apr 2nd, 2020
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.85 KB | None | 0 0
  1. #pragma once
  2. #include <string>
  3. #include <array>
  4. #include <cstdarg>
  5.  
  6. #define BEGIN_NAMESPACE( x ) namespace x {
  7. #define END_NAMESPACE }
  8.  
  9. BEGIN_NAMESPACE(XorCompileTime)
  10. constexpr auto time = __TIME__;
  11. constexpr auto seed = static_cast<int>(time[7]) + static_cast<int>(time[6]) * 10 + static_cast<int>(time[4]) * 60 + static_cast<int>(time[3]) * 600 + static_cast<int>(time[1]) * 3600 + static_cast<int>(time[0]) * 36000;
  12.  
  13. // 1988, Stephen Park and Keith Miller
  14. // "Random Number Generators: Good Ones Are Hard To Find", considered as "minimal standard"
  15. // Park-Miller 31 bit pseudo-random number generator, implemented with G. Carta's optimisation:
  16. // with 32-bit math and without division
  17.  
  18. template <int N>
  19. struct RandomGenerator
  20. {
  21. private:
  22. static constexpr unsigned a = 16807; // 7^5
  23. static constexpr unsigned m = 2147483647; // 2^31 - 1
  24.  
  25. static constexpr unsigned s = RandomGenerator<N - 1>::value;
  26. static constexpr unsigned lo = a * (s & 0xFFFF); // Multiply lower 16 bits by 16807
  27. static constexpr unsigned hi = a * (s >> 16); // Multiply higher 16 bits by 16807
  28. static constexpr unsigned lo2 = lo + ((hi & 0x7FFF) << 16); // Combine lower 15 bits of hi with lo's upper bits
  29. static constexpr unsigned hi2 = hi >> 15; // Discard lower 15 bits of hi
  30. static constexpr unsigned lo3 = lo2 + hi;
  31.  
  32. public:
  33. static constexpr unsigned max = m;
  34. static constexpr unsigned value = lo3 > m ? lo3 - m : lo3;
  35. };
  36.  
  37. template <>
  38. struct RandomGenerator<0>
  39. {
  40. static constexpr unsigned value = seed;
  41. };
  42.  
  43. template <int N, int M>
  44. struct RandomInt
  45. {
  46. static constexpr auto value = RandomGenerator<N + 1>::value % M;
  47. };
  48.  
  49. template <int N>
  50. struct RandomChar
  51. {
  52. static const char value = static_cast<char>(1 + RandomInt<N, 0x7F - 1>::value);
  53. };
  54.  
  55. template <size_t N, int K>
  56. struct XorString
  57. {
  58. private:
  59. const char _key;
  60. std::array<char, N + 1> _encrypted;
  61.  
  62. constexpr char enc(char c) const
  63. {
  64. return c ^ _key;
  65. }
  66.  
  67. char dec(char c) const
  68. {
  69. return c ^ _key;
  70. }
  71.  
  72. public:
  73. template <size_t... Is>
  74. constexpr __forceinline XorString(const char* str, std::index_sequence<Is...>) : _key(RandomChar<K>::value), _encrypted{ enc(str[Is])... }
  75. {
  76. }
  77.  
  78. __forceinline decltype(auto) decrypt(void)
  79. {
  80. for (size_t i = 0; i < N; ++i)
  81. {
  82. _encrypted[i] = dec(_encrypted[i]);
  83. }
  84. _encrypted[N] = '\0';
  85. return _encrypted.data();
  86. }
  87. };
  88.  
  89.  
  90. //-- Note: XorStr will __NOT__ work directly with functions like printf.
  91. // To work with them you need a wrapper function that takes a const char*
  92. // as parameter and passes it to printf and alike.
  93. //
  94. // The Microsoft Compiler/Linker is not working correctly with variadic
  95. // templates!
  96. //
  97. // Use the functions below or use std::cout (and similar)!
  98.  
  99.  
  100. static auto w_printf = [](const char* fmt, ...)
  101. {
  102. va_list args;
  103. va_start(args, fmt);
  104. vprintf_s(fmt, args);
  105. va_end(args);
  106. };
  107.  
  108. static auto w_printf_s = [](const char* fmt, ...)
  109. {
  110. va_list args;
  111. va_start(args, fmt);
  112. vprintf_s(fmt, args);
  113. va_end(args);
  114. };
  115.  
  116. static auto w_sprintf = [](char* buf, const char* fmt, ...)
  117. {
  118. va_list args;
  119. va_start(args, fmt);
  120. vsprintf(buf, fmt, args);
  121. va_end(args);
  122. };
  123.  
  124. static auto w_sprintf_s = [](char* buf, size_t buf_size, const char* fmt, ...)
  125. {
  126. va_list args;
  127. va_start(args, fmt);
  128. vsprintf_s(buf, buf_size, fmt, args);
  129. va_end(args);
  130. };
  131. static bool w_strcmp(const char* str1, const char* str2)
  132. {
  133. return strcmp(str1, str2);
  134. };
  135.  
  136. #ifdef NDEBUG
  137. #define _xor_( s ) ( XorCompileTime::XorString< sizeof( s ) - 1, __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() )
  138. #else
  139. #define _xor_( s ) ( s )
  140. #endif
  141.  
  142. /*#ifdef NDEBUG
  143. #define XorStr( s ) ( XorCompileTime::XorString< sizeof( s ) - 1, __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() )
  144. #endif
  145. #define XorStr( s ) ( s )
  146. #endif*/
  147.  
  148. END_NAMESPACE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement