#ifndef STRING_OBFS #define STRING_OBFS #include "random.hpp" #include "sequence.hpp" #include 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::get; // constexpr Encoder encoder = pair::get<0>::value; // constexpr Decoder decoder = pair::get<1>::value; constexpr Encoder encoder = pair::type::value; constexpr Decoder decoder = pair::next::type::value; return make_string(str); } } #endif