StringJoin.cppm 1.4 KB

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