repr 0.1
Reconstructable string representations and more
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages Concepts
python.h
Go to the documentation of this file.
#pragma once
#include <concepts>
#include <cstddef>
#include <stack>
#include <string>
#include <string_view>
#include <type_traits>
namespace librepr {
namespace detail {
for (auto at = text.find(needle, 0); at != text.npos; at = text.find(needle, at)) {
text.replace(at, needle.length(), replacement);
}
}
} // namespace detail
struct PythonVisitor {
[[nodiscard]] auto get_indent() const { return std::string(indent_amount * indent_level, ' '); }
auto needle = std::string_view{"::"};
for (auto at = namespaces_.find(needle, 0); at != namespaces_.npos; at = namespaces_.find(needle, at)) {
result << get_indent() << "class " << namespaces_.substr(0, at) << ":\n";
namespaces_.remove_prefix(at + 2);
}
result << get_indent() << "class " << namespaces_ << ":\n";
}
template <typename T>
void print_type() {
if constexpr (std::is_fundamental_v<T>) {
if constexpr (std::is_floating_point_v<T>) {
result << "float";
} else if constexpr (std::same_as<T, bool>) {
result << "bool";
} else if constexpr (std::same_as<T, char>) {
result << "str";
} else if constexpr (std::is_integral_v<T>) {
result << "int";
} else {
// todo handle all fundamentals
}
} else if constexpr (std::same_as<T, const char*>) {
result << "str";
} else if constexpr (requires { typename Reflect<T>::element_type; }) {
if constexpr (requires { typename T::mapped_type; }) {
result << "dict[";
result << ", ";
result << "]";
} else {
result << "list[";
result << "]";
}
} else if constexpr (is_variant<T>) {
if constexpr (Index != 0) {
result << " | ";
}
});
} else {
}
}
template <typename T>
auto operator()(T info) {
auto full_name = info.type_name();
bool out_of_line = false;
if (!namespaces.empty()) {
if (name.starts_with(namespaces.top())) {
name.remove_prefix(namespaces.top().size() + 2);
} else {
// namespace mismatch -> defined out of line
out_of_line = true;
if (auto pos = name.rfind("::"); pos != std::string_view::npos) {
namespace_ = name.substr(0, pos);
name = name.substr(pos + 2);
}
}
}
result << get_indent() << "@dataclass\n";
result << get_indent() << "class " << name << ":\n";
if constexpr (T::members::size == 0) {
result << get_indent() << "...\n";
} else {
info.visit(*this);
}
namespaces.pop();
if (out_of_line) {
indent_level = last_indent; // roll back indent level
result.set_cursor(); // roll back cursor
}
if constexpr (category::has_name<T>) {
result << info.name() << ": ";
if (!namespace_.empty()) {
}
result << name << '\n';
}
}
template <typename T>
auto operator()(T info) {
result << get_indent() << info.name() << ": ";
result << '\n';
}
};
} // namespace librepr