#include "CrossLang.hpp" #include "TessesFramework/Serialization/BitConverter.hpp" #include "TessesFramework/Streams/ByteReader.hpp" #include "TessesFramework/Uuid.hpp" #include #include #include #include #include #include #include namespace Tesses::CrossLang { bool Equals(std::shared_ptr gc, TObject left, TObject right) { GCList ls(gc); if (std::holds_alternative(left) && std::holds_alternative(right)) { return true; } else if (std::holds_alternative(left) && std::holds_alternative(right)) { return true; } else if (std::holds_alternative(left) && std::holds_alternative(right)) { return std::get(left) == std::get(right); } else if (std::holds_alternative(left) && std::holds_alternative(right)) { return std::get(left) == std::get(right); } else if (std::holds_alternative(left) && std::holds_alternative(right)) { return std::get(left) == std::get(right); } else if (std::holds_alternative(left) && std::holds_alternative(right)) { return std::get(left) == std::get(right); } else if (std::holds_alternative(left) && std::holds_alternative(right)) { return std::get(left) == std::get(right); } else if (std::holds_alternative(left) && std::holds_alternative(right)) { return std::get(left) == std::get(right); } else if (std::holds_alternative(left) && std::holds_alternative(right)) { return std::get(left) == std::get(right); } else if (std::holds_alternative(left) && std::holds_alternative(right)) { return std::get(left) == std::get(right); } else if (std::holds_alternative(left) && std::holds_alternative(right)) { return std::get(left) == std::get(right); } else if (std::holds_alternative< std::shared_ptr>(left) && std::holds_alternative< std::shared_ptr>(right)) { return std::get>( left) ->ToEpoch() == std::get>( right) ->ToEpoch(); } else if (std::holds_alternative< std::shared_ptr>(left) && std::holds_alternative< std::shared_ptr>(right)) { return std::get>( left) ->TotalSeconds() == std::get>( right) ->TotalSeconds(); } else if (std::holds_alternative(left) && std::holds_alternative(right)) { auto lver = std::get(left); auto rver = std::get(right); auto r = lver.CompareTo(rver); return r == 0; } else if (std::holds_alternative(left) && std::holds_alternative(right)) { auto l = std::get(left); auto r = std::get(right); return l == r; } else if (std::holds_alternative(left)) { auto obj = std::get(left).obj; auto dict = dynamic_cast(obj); auto dynDict = dynamic_cast(obj); auto native = dynamic_cast(obj); auto natObj = dynamic_cast(obj); auto cls = dynamic_cast(obj); if (cls != nullptr) { gc->BarrierBegin(); auto obj = cls->GetValue("", "operator=="); gc->BarrierEnd(); TCallable *callable; if (GetObjectHeap(obj, callable)) { return ToBool(callable->Call(ls, {right})); } else if (std::holds_alternative(right)) { return false; } else if (std::holds_alternative(right)) { return false; } else if (std::holds_alternative(right)) { return cls == std::get(right).obj; } } else if (natObj != nullptr) { return natObj->Equals(gc, right); } if (dict != nullptr) { gc->BarrierBegin(); TObject fn = dict->GetValue("operator=="); gc->BarrierEnd(); if (!std::holds_alternative(fn)) { if (std::holds_alternative(fn)) { auto obj = dynamic_cast( std::get(fn).obj); if (obj != nullptr) { auto closure = dynamic_cast(obj); if (closure != nullptr) { if (!closure->closure->args.empty() && closure->closure->args[0] == "this") { return ToBool(obj->Call(ls, {left, right})); } else { return ToBool(obj->Call(ls, {right})); } } else { return ToBool(obj->Call(ls, {right})); } } else { return dict == std::get(right).obj; } } else { return dict == std::get(right).obj; } } else { return dict == std::get(right).obj; } return false; } else if (dynDict != nullptr) { auto res = dynDict->CallMethod(ls, "operator==", {right}); if (!std::holds_alternative(res) && std::holds_alternative(res)) { return ToBool(res); } } else if (native != nullptr && std::holds_alternative(right)) { return native->GetDestroyed(); } if (std::holds_alternative(right)) { return obj == std::get(right).obj; } else if (std::holds_alternative(right)) { return false; } else if (std::holds_alternative(right)) { return false; } else { return false; } } else if (std::holds_alternative(right)) { return false; } else if (std::holds_alternative(right)) { return false; } else { return false; } return false; } } // namespace Tesses::CrossLang