Botcraft 1.21.4
Loading...
Searching...
No Matches
StdAnyUtilities.cpp
Go to the documentation of this file.
4
7
8#include <sstream>
9#include <iomanip>
10
11namespace Botcraft::Utilities
12{
13 template<class T>
14 std::string SimpleToString(const std::any& v)
15 {
16 return std::to_string(std::any_cast<const T&>(v));
17 }
18
19 template<class T>
20 std::string SimpleStreamOperatorToString(const std::any& v)
21 {
22 std::stringstream s;
23 s << std::any_cast<const T&>(v);
24 return s.str();
25 }
26
27 std::string CraftInputs(const std::any& v)
28 {
29 const std::array<std::array<std::string, 3>, 3>& inputs = std::any_cast<const std::array<std::array<std::string, 3>, 3>&>(v);
30 std::stringstream s;
31 for (size_t row = 0; row < 3; ++row)
32 {
33 s << '[';
34 for (size_t col = 0; col < 3; ++col)
35 {
36 if (col > 0)
37 {
38 s << " | ";
39 }
40 s << inputs[row][col];
41 }
42 s << ']';
43 if (row < 2)
44 {
45 s << '\n';
46 }
47 }
48 return s.str();
49 }
50
51 std::unordered_map<std::type_index, std::function<std::string(const std::any&)>> AnyParser::registered_types =
52 {
53 { std::type_index(typeid(void)), [](const std::any&) { return "{}"; } },
54 { std::type_index(typeid(bool)), [](const std::any& v) { return std::any_cast<bool>(v) ? "true" : "false"; } },
55 { std::type_index(typeid(char)), [](const std::any& v) { std::stringstream s; const char val = std::any_cast<const char&>(v); s << (val < 0 ? "-0x" : "0x") << std::setfill('0') << std::setw(2) << std::hex << static_cast<int>(std::abs(val)); return s.str(); }},
56 { std::type_index(typeid(unsigned char)), [](const std::any& v) { std::stringstream s; s << "0x" << std::setfill('0') << std::setw(2) << std::hex << static_cast<int>(std::any_cast<const unsigned char&>(v)); return s.str(); }},
57 { std::type_index(typeid(short)), SimpleToString<short> },
58 { std::type_index(typeid(unsigned short)), SimpleToString<unsigned short> },
59 { std::type_index(typeid(int)), SimpleToString<int> },
60 { std::type_index(typeid(unsigned int)), SimpleToString<unsigned int> },
61 { std::type_index(typeid(long long int)), SimpleToString<long long int> },
62 { std::type_index(typeid(unsigned long long int)), SimpleToString<unsigned long long int> },
63 { std::type_index(typeid(float)), SimpleToString<float> },
64 { std::type_index(typeid(double)), SimpleToString<double> },
65 { std::type_index(typeid(std::string)), [](const std::any& v) { return std::any_cast<const std::string&>(v); } },
66 { std::type_index(typeid(const char*)), [](const std::any& v) { return std::any_cast<const char* const&>(v); } },
67 { std::type_index(typeid(Position)), SimpleStreamOperatorToString<Position> },
68 { std::type_index(typeid(Vector3<double>)), SimpleStreamOperatorToString<Vector3<double>> },
69 { std::type_index(typeid(PlayerDiggingFace)), SimpleStreamOperatorToString<PlayerDiggingFace> },
70 { std::type_index(typeid(Hand)), SimpleStreamOperatorToString<Hand> },
71 { std::type_index(typeid(LogLevel)), SimpleStreamOperatorToString<LogLevel> },
72 { std::type_index(typeid(std::array<std::array<std::string, 3>, 3>)), CraftInputs },
73 };
74
75 std::string AnyParser::ToString(const std::any& value)
76 {
77 const auto it = registered_types.find(std::type_index(value.type()));
78 if (it != registered_types.end())
79 {
80 return it->second(value);
81 }
82
83 return DefaultToString(value);
84 }
85
86 std::string AnyParser::DefaultToString(const std::any& value)
87 {
88 return Demangle(value.type().name(), false);
89 }
90
91 void AnyParser::RegisterType(const std::type_index& index, const std::function<std::string(const std::any&)>& f)
92 {
93 registered_types[index] = f;
94 }
95}
static std::unordered_map< std::type_index, std::function< std::string(const std::any &)> > registered_types
Maps std::type_index of a std::any to a function to convert it to std::string.
static std::string ToString(const std::any &value)
Give a string representation of a std::any value.
static std::string DefaultToString(const std::any &value)
Default function to convert all unregistered.
static void RegisterType(const std::type_index &index, const std::function< std::string(const std::any &)> &f)
std::string SimpleToString(const std::any &v)
std::string Demangle(const std::string &name, const bool simplify_output)
Demangle a class name.
std::string CraftInputs(const std::any &v)
std::string SimpleStreamOperatorToString(const std::any &v)
Vector3< int > Position
Definition Vector3.hpp:282
Direction PlayerDiggingFace
Definition Enums.hpp:211