#pragma once #ifndef _NB_CORE_TYPES #define _NB_CORE_TYPES #include #include #include #include "TypeTraits.hpp" namespace nb { #ifdef _NB_TARGET_WINDOWS const std::string NEWLINE = "\n"; const std::wstring WNEWLINE = L"\n"; #endif // _NB_TARGET_WINDOWS #ifdef _NB_TARGET_LINUX const std::string NEWLINE = "\n"; const std::wstring WNEWLINE = L"\n"; #endif // _NB_TARGET_LINUX template using StringConvertible = ValidConversion; template using WStringConvertible = ValidConversion; template constexpr bool StringConvertible_v = StringConvertible::value; template constexpr bool WStringConvertible_v = WStringConvertible::value; template using StringConvertible_to = typename StringConvertible::to; template using WStringConvertible_to = typename WStringConvertible::to; template using StringConvertible_from = typename StringConvertible::from; template using WStringConvertible_from = typename WStringConvertible::from; template std::enable_if_t, std::wstring> str_to_wstr(T in) { std::string str(in); std::wstring ret(str.begin(), str.end()); return ret; } template std::enable_if_t, std::string> wstr_to_str(T in) { std::wstring wstr(in); std::size_t wstrlen = wstr.length(); char* c_str= new char[wstrlen]; std::wcstombs(c_str, wstr.c_str(), wstrlen); std::string ret(c_str, wstrlen); delete[] c_str; return ret; } template void stream(Stream& s, Args&&... args); template void stream(Stream& s, Args&&... args) { (s << ... << args); } template void term(Args&&... args) { stream(std::cout, args..., nb::NEWLINE); } template void wterm(Args&&... args) { stream(std::wcout, args..., nb::WNEWLINE); } template ValidConversion_to find_and_replace( A original, B find, C replace ) { const T& find_t = T(find); const T& replace_t = T(replace); T ret(original); std::size_t find_len = find_t.length(); std::size_t replace_len = replace_t.length(); std::size_t currpos = 0; while(true) { currpos = ret.find(find_t, currpos); if (currpos == T::npos) { break; } ret = ret.erase(currpos, find_len); ret = ret.insert(currpos, replace_t); currpos += replace_len; } return ret; } template StringConvertible_to indent_strblock( A block, B prepend, C topIndent ) { return std::string(topIndent) + find_and_replace( std::string(block), nb::NEWLINE, nb::NEWLINE + std::string(prepend) ); } template StringConvertible_to indent_strblock( A block, B prepend ) { return indent_strblock(block, prepend, prepend); } /* template T swap_endian(const T& val) { T ret; const int size = sizeof(T); auto retLoc = static_cast(&ret); auto valLoc = static_cast(&val); for (int i = 0; i < size; ++i) { memcpy(retLoc+i, valLoc+(size-i-1), 1); } return ret; } */ // using ByteVector = std::vector; } // namespace nb #endif // _NB_CORE_TYPES