export module Core.StringJoin; import Core.Meta; import Core.Types; namespace Core { template struct MergedString { char s[N]; operator const char*() const noexcept { return s; } }; template consteval auto mergeStringsBase(const char (&a)[N1], const char (&b)[N2]) { static_assert(N1 > 0); MergedString s; for(size_t i = 0; i < N1; i++) { s.s[i] = a[i]; } for(size_t i = 0; i < N2; i++) { s.s[i + N1 - 1] = b[i]; } return s; } template consteval auto mergeStringsBase( const MergedString& a, const char (&b)[N2]) { return mergeStringsBase(a.s, b); } template consteval auto mergeStringsBase( const char (&a)[N1], const MergedString& b) { return mergeStringsBase(a, b.s); } export template consteval auto mergeStrings(const A& a, const B& b) { return mergeStringsBase(a, b); } export template consteval auto mergeStrings(const A& a, const B& b, Args&&... args) { auto c = mergeStringsBase(a, b); return mergeStrings( c, Core::forward(args)...); } }