strconv.h 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. //
  2. // stringizer.h
  3. // serializer
  4. //
  5. // Created by Sam Jaffe on 3/15/23.
  6. //
  7. #pragma once
  8. #include <string>
  9. #include <string_view>
  10. #include <type_traits>
  11. #include <magic_enum/magic_enum.hpp>
  12. #include <magic_enum/magic_enum_flags.hpp>
  13. #include <serializer/traits.h>
  14. namespace serializer {
  15. using ::std::to_string;
  16. inline std::string to_string(char const * str) { return str; }
  17. inline std::string to_string(std::string const & str) { return str; }
  18. inline std::string to_string(std::string_view str) { return std::string(str); }
  19. template <typename T> std::string to_string(T const & elem) {
  20. if constexpr (detail::is_dereferencable_v<T>) {
  21. using ::serializer::to_string;
  22. return elem ? to_string(*elem) : "nil";
  23. } else if constexpr (std::is_enum_v<T>) {
  24. if constexpr (magic_enum::detail::subtype_v<T> ==
  25. magic_enum::detail::enum_subtype::flags) {
  26. return std::string(magic_enum::enum_flags_name<T>(elem));
  27. } else {
  28. return std::string(magic_enum::enum_name<T>(elem));
  29. }
  30. } else {
  31. static_assert(detail::always_false<T>{});
  32. }
  33. }
  34. }