fix overload resolution for CCObject*

This commit is contained in:
matcool 2022-10-09 09:18:17 -03:00
parent c5538da709
commit 23593f50dc
No known key found for this signature in database
GPG key ID: BF58756086D7AB1C
2 changed files with 27 additions and 28 deletions
loader
include/Geode/loader
src/load

View file

@ -31,10 +31,21 @@ namespace geode {
std::string generateLogName();
struct GEODE_DLL ComponentTrait {
virtual ~ComponentTrait() {}
virtual std::string _toString() = 0;
};
std::string parse(cocos2d::CCNode*);
template <class T>
requires std::convertible_to<T*, cocos2d::CCNode*>
std::string parse(T* node) {
return parse(static_cast<cocos2d::CCNode*>(node));
}
std::string parse(cocos2d::CCPoint const&);
std::string parse(cocos2d::CCSize const&);
std::string parse(cocos2d::CCRect const&);
std::string parse(cocos2d::CCArray*);
std::string parse(cocos2d::ccColor3B const&);
std::string parse(cocos2d::ccColor4B const&);
std::string parse(cocos2d::ccColor4F const&);
std::string parse(cocos2d::CCObject*);
std::string parse(Mod*);
template <typename T>
requires requires(T b) { std::stringstream() << b; }
@ -44,6 +55,11 @@ namespace geode {
return buf.str();
}
struct GEODE_DLL ComponentTrait {
virtual ~ComponentTrait() {}
virtual std::string _toString() = 0;
};
template <typename T>
struct ComponentBase : public ComponentTrait {
T m_item;
@ -96,7 +112,7 @@ namespace geode {
friend void GEODE_DLL releaseSchedules(Mod* m);
};
void GEODE_DLL vlogImplSecretDontUse(Severity, Mod*, std::string_view, std::function<void(Log&)>*, size_t);
void GEODE_DLL vlogImpl(Severity, Mod*, std::string_view, std::function<void(Log&)>*, size_t);
template <typename... Args>
requires requires(Args... b) { (parse(b), ...); }
@ -108,7 +124,7 @@ namespace geode {
std::array<std::function<void(Log&)>, sizeof...(Args)> comps = { [&](Log& log) { pushSomething(log, args); }... };
// tfw no std::span
vlogImplSecretDontUse(severity, mod, formatStr, comps.data(), comps.size());
vlogImpl(severity, mod, formatStr, comps.data(), comps.size());
}
void GEODE_DLL releaseSchedules(Mod* m);
@ -146,22 +162,5 @@ namespace geode {
template <typename ...Args>
void emergency(Args... args) { schedule(Severity::Emergency, args...); }
// parse overload
#define FF(x) \
std::string parse(x const& thing);
FF(cocos2d::CCObject*)
FF(cocos2d::CCNode*)
FF(cocos2d::CCPoint)
FF(cocos2d::CCSize)
FF(cocos2d::CCRect)
FF(cocos2d::CCArray*)
FF(cocos2d::ccColor3B)
FF(cocos2d::ccColor4B)
FF(cocos2d::ccColor4F)
FF(Mod*)
#undef FF
}
}

View file

@ -25,7 +25,7 @@ void log::releaseSchedules(Mod* m) {
Log::scheduled().clear();
}
std::string log::parse(Mod* const& mod) {
std::string log::parse(Mod* mod) {
if (mod) {
return fmt::format("{{ Mod, {} }}", mod->getName());;
} else {
@ -33,7 +33,7 @@ std::string log::parse(Mod* const& mod) {
}
}
std::string log::parse(CCObject* const& obj) {
std::string log::parse(CCObject* obj) {
if (obj) {
return fmt::format("{{ {}, {} }}", typeid(*obj).name(), utils::intToHex(obj));
} else {
@ -41,7 +41,7 @@ std::string log::parse(CCObject* const& obj) {
}
}
std::string log::parse(CCNode* const& obj) {
std::string log::parse(CCNode* obj) {
if (obj) {
auto bb = obj->boundingBox();
return fmt::format("{{ {}, {}, ({}, {} | {} : {}) }}",
@ -53,7 +53,7 @@ std::string log::parse(CCNode* const& obj) {
}
}
std::string log::parse(CCArray* const& arr) {
std::string log::parse(CCArray* arr) {
std::string out = "[";
if (arr && arr->count()) {
@ -116,7 +116,7 @@ std::string geode::log::generateLogName() {
return fmt::format("Geode_{:%H.%M.%S}.log", log_clock::now());
}
void geode::log::vlogImplSecretDontUse(Severity severity, Mod* mod, std::string_view formatStr, std::function<void(Log&)>* components, size_t componentsSize) {
void geode::log::vlogImpl(Severity severity, Mod* mod, std::string_view formatStr, std::function<void(Log&)>* components, size_t componentsSize) {
Log log(mod, severity);
const auto pushSomething = [](Log& log, auto something) {