MODE: INLINE void register_error_constants(); // regerror.cc, because fucking xsubpp removes preprocessor directives MODULE = XS::Framework PACKAGE = XS::STL::ErrorCode PROTOTYPES: DISABLE BOOT { register_error_constants(); } std::error_code new (SV*, int ec, const std::error_category* category) { if (!category) throw "category required"; RETVAL = std::error_code(ec, *category); } int value (std::error_code ec) { RETVAL = ec.value(); } const std::error_category* category (std::error_code ec) { RETVAL = &ec.category(); } std::string message (std::error_code ec) { RETVAL = ec.message(); } std::string _op_string (std::error_code ec, ...) { RETVAL = ec.message(); RETVAL += " ("; RETVAL += std::to_string(ec.value()); RETVAL += ":"; RETVAL += ec.category().name(); RETVAL += ")"; } bool _op_bool (std::error_code ec, ...) { RETVAL = ec.value(); } bool _op_eq (std::error_code ec1, Sv sv_ec2, ...) { if (sv_ec2.is_object_ref()) { Object ec2 = sv_ec2; auto class_name = ec2.stash().name(); if (class_name == "XS::ErrorCode") { RETVAL = ec1 & xs::in(sv_ec2); } else if (class_name == "XS::STL::ErrorCode") { RETVAL = ec1 == xs::in(sv_ec2); } else { RETVAL = false; } } else if (SvIOK(sv_ec2)) { int code = Simple(sv_ec2); RETVAL = ec1.value() == code; } else { RETVAL = false; } } MODULE = XS::Framework PACKAGE = XS::STL::ErrorCategory PROTOTYPES: DISABLE const char* std::error_category::name () : const std::string std::error_category::message (int ec) : const std::string std::error_category::_op_string (...) : const { RETVAL = THIS->name(); } bool std::error_category::_op_eq (const std::error_category* oth, ...) : const { RETVAL = *THIS == *oth; } MODULE = XS::Framework PACKAGE = XS::ErrorCode PROTOTYPES: DISABLE ErrorCode new (SV*, std::error_code c, ErrorCode next = ErrorCode()) { if (next) RETVAL = ErrorCode(c, next); else RETVAL = ErrorCode(c); } int value (ErrorCode ec) { RETVAL = ec.value(); } const std::error_category* category (ErrorCode ec) { RETVAL = &ec.category(); } std::string message (ErrorCode ec) { RETVAL = ec.message(); } std::error_code code (ErrorCode ec) { RETVAL = ec.code(); } ErrorCode next (ErrorCode ec) { RETVAL = ec.next(); } std::string _op_string (ErrorCode ec, ...) { if (!ec) XSRETURN_UNDEF; RETVAL = ec.what(); } bool _op_bool (ErrorCode ec, ...) { RETVAL = ec.value(); } bool _op_eq (ErrorCode ec1, Sv sv_ec2, ...) { if (sv_ec2.is_object_ref()) { Object ec2 = sv_ec2; auto class_name = ec2.stash().name(); if (class_name == "XS::ErrorCode") { RETVAL = ec1 == xs::in(sv_ec2); } else if (class_name == "XS::STL::ErrorCode") { RETVAL = ec1 & xs::in(sv_ec2); } else { RETVAL = false; } } else if (SvIOK(sv_ec2)) { int code = Simple(sv_ec2); RETVAL = ec1.value() == code; } else { RETVAL = false; } } bool contains(ErrorCode ec, std::error_code c) { RETVAL = ec.contains(c); }