#pragma once #include namespace skc { template using clean_type = typename std::remove_const_t>; template class skCrypter { public: __forceinline constexpr skCrypter(T* data) { crypt(data); } __forceinline T* get() { return _storage; } __forceinline int size() // (w)char count { return _size; } __forceinline char key() { return _key1; } __forceinline T* encrypt() { if (!isEncrypted()) crypt(_storage); return _storage; } __forceinline T* decrypt() { if (isEncrypted()) crypt(_storage); return _storage; } __forceinline bool isEncrypted() { return _storage[_size - 1] != 0; } __forceinline void clear() // set full storage to 0 { for (int i = 0; i < _size; i++) { _storage[i] = 0; } } __forceinline operator T* () { decrypt(); return _storage; } private: __forceinline constexpr void crypt(T* data) { for (int i = 0; i < _size; i++) { _storage[i] = data[i] ^ (_key1 + i % (1 + _key2)); } } T _storage[_size]{}; }; } #define STR(str) STR_KEY(str, __TIME__[4], __TIME__[7]) #define STR_KEY(str, key1, key2) []() { \ constexpr static auto crypted = skc::skCrypter \ >((skc::clean_type*)str); \ return crypted; }()