StringJoin.cppm 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. export module Core.StringJoin;
  2. import Core.Meta;
  3. namespace Core {
  4. template<int N>
  5. struct MergedString {
  6. char s[N];
  7. operator const char*() const noexcept {
  8. return s;
  9. }
  10. };
  11. template<int N1, int N2>
  12. consteval auto mergeStringsBase(const char (&a)[N1], const char (&b)[N2]) {
  13. static_assert(N1 > 0);
  14. MergedString<N1 + N2 - 1> s;
  15. for(int i = 0; i < N1; i++) {
  16. s.s[i] = a[i];
  17. }
  18. for(int i = 0; i < N2; i++) {
  19. s.s[i + N1 - 1] = b[i];
  20. }
  21. return s;
  22. }
  23. template<int N1, int N2>
  24. consteval auto mergeStringsBase(
  25. const MergedString<N1>& a, const char (&b)[N2]) {
  26. return mergeStringsBase<N1, N2>(a.s, b);
  27. }
  28. template<int N1, int N2>
  29. consteval auto mergeStringsBase(
  30. const char (&a)[N1], const MergedString<N2>& b) {
  31. return mergeStringsBase<N1, N2>(a, b.s);
  32. }
  33. export template<typename A, typename B>
  34. consteval auto mergeStrings(const A& a, const B& b) {
  35. return mergeStringsBase(a, b);
  36. }
  37. export template<typename A, typename B, typename... Args>
  38. consteval auto mergeStrings(const A& a, const B& b, Args&&... args) {
  39. auto c = mergeStringsBase(a, b);
  40. return mergeStrings<decltype(c), Args...>(
  41. c, Core::forward<Args>(args)...);
  42. }
  43. }