mirror of
https://github.com/0TheSpy/Seaside.git
synced 2025-01-05 17:13:40 +08:00
109 lines
2.8 KiB
C++
109 lines
2.8 KiB
C++
#pragma once
|
|
#include <string>
|
|
#include <array>
|
|
#include <cstdarg>
|
|
|
|
#define BEGIN_NAMESPACE( x ) namespace x {
|
|
#define END_NAMESPACE }
|
|
|
|
BEGIN_NAMESPACE(XorCompileTime)
|
|
|
|
constexpr auto time = __TIME__;
|
|
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;
|
|
|
|
template < int N >
|
|
struct RandomGenerator {
|
|
private:
|
|
static constexpr unsigned a = 16807;
|
|
static constexpr unsigned m = 2147483647;
|
|
|
|
static constexpr unsigned s = RandomGenerator< N - 1 >::value;
|
|
static constexpr unsigned lo = a * (s & 0xFFFF);
|
|
static constexpr unsigned hi = a * (s >> 16);
|
|
static constexpr unsigned lo2 = lo + ((hi & 0x7FFF) << 16);
|
|
static constexpr unsigned hi2 = hi >> 15;
|
|
static constexpr unsigned lo3 = lo2 + hi;
|
|
|
|
public:
|
|
static constexpr unsigned max = m;
|
|
static constexpr unsigned value = lo3 > m ? lo3 - m : lo3;
|
|
};
|
|
|
|
template <>
|
|
struct RandomGenerator< 0 > {
|
|
static constexpr unsigned value = seed;
|
|
};
|
|
|
|
template < int N, int M >
|
|
struct RandomInt {
|
|
static constexpr auto value = RandomGenerator< N + 1 >::value % M;
|
|
};
|
|
|
|
template < int N >
|
|
struct RandomChar {
|
|
static const char value = static_cast<char>(1 + RandomInt< N, 0x7F - 1 >::value);
|
|
};
|
|
|
|
template < size_t N, int K >
|
|
struct XorString {
|
|
private:
|
|
const char _key;
|
|
std::array< char, N + 1 > _encrypted;
|
|
|
|
constexpr char enc(char c) const {
|
|
return c ^ _key;
|
|
}
|
|
|
|
char dec(char c) const {
|
|
return c ^ _key;
|
|
}
|
|
|
|
public:
|
|
template < size_t... Is >
|
|
constexpr __forceinline XorString(const char* str, std::index_sequence< Is... >) : _key(RandomChar< K >::value), _encrypted{ enc(str[Is])... } {
|
|
}
|
|
|
|
__forceinline decltype(auto) decrypt(void) {
|
|
for (size_t i = 0; i < N; ++i) {
|
|
_encrypted[i] = dec(_encrypted[i]);
|
|
}
|
|
_encrypted[N] = '\0';
|
|
return _encrypted.data();
|
|
}
|
|
};
|
|
|
|
static auto w_printf = [](const char* fmt, ...) {
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
vprintf_s(fmt, args);
|
|
va_end(args);
|
|
};
|
|
|
|
static auto w_printf_s = [](const char* fmt, ...) {
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
vprintf_s(fmt, args);
|
|
va_end(args);
|
|
};
|
|
|
|
static auto w_sprintf = [](char* buf, const char* fmt, ...) {
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
vsprintf(buf, fmt, args);
|
|
va_end(args);
|
|
};
|
|
|
|
static auto w_sprintf_s = [](char* buf, size_t buf_size, const char* fmt, ...) {
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
vsprintf_s(buf, buf_size, fmt, args);
|
|
va_end(args);
|
|
};
|
|
|
|
#ifdef NDEBUG
|
|
#define XorStr( s ) ( XorCompileTime::XorString< sizeof( s ) - 1, __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() )
|
|
#else
|
|
#define XorStr( s ) ( s )
|
|
#endif
|
|
|
|
END_NAMESPACE |