X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=trace_model.cpp;h=e8bb3e41ce761302678f4dea889a07289184b805;hb=288a9bca5c27be80f4e58e3a39ac7b1429f967aa;hp=a817b39ea91c55c48ef1e47e485b0ddd1124d09d;hpb=867b1b7934b127b3f0f8b195b1a97408ad6e9fce;p=apitrace diff --git a/trace_model.cpp b/trace_model.cpp index a817b39..e8bb3e4 100644 --- a/trace_model.cpp +++ b/trace_model.cpp @@ -63,54 +63,76 @@ Blob::~Blob() { // bool cast -Null ::operator bool(void) const { return false; } -Bool ::operator bool(void) const { return value; } -SInt ::operator bool(void) const { return value != 0; } -UInt ::operator bool(void) const { return value != 0; } -Float ::operator bool(void) const { return value != 0; } -String ::operator bool(void) const { return true; } -Enum ::operator bool(void) const { return static_cast(*sig->second); } -Struct ::operator bool(void) const { return true; } -Array ::operator bool(void) const { return true; } -Blob ::operator bool(void) const { return true; } -Pointer::operator bool(void) const { return value != 0; } +bool Null ::toBool(void) const { return false; } +bool Bool ::toBool(void) const { return value; } +bool SInt ::toBool(void) const { return value != 0; } +bool UInt ::toBool(void) const { return value != 0; } +bool Float ::toBool(void) const { return value != 0; } +bool String ::toBool(void) const { return true; } +bool Enum ::toBool(void) const { return sig->second->toBool(); } +bool Struct ::toBool(void) const { return true; } +bool Array ::toBool(void) const { return true; } +bool Blob ::toBool(void) const { return true; } +bool Pointer::toBool(void) const { return value != 0; } // signed integer cast -Value ::operator signed long long (void) const { assert(0); return 0; } -Null ::operator signed long long (void) const { return 0; } -Bool ::operator signed long long (void) const { return static_cast(value); } -SInt ::operator signed long long (void) const { return value; } -UInt ::operator signed long long (void) const { assert(static_cast(value) >= 0); return static_cast(value); } -Float ::operator signed long long (void) const { return static_cast(value); } -Enum ::operator signed long long (void) const { return static_cast(*sig->second); } +signed long long Value ::toSInt(void) const { assert(0); return 0; } +signed long long Null ::toSInt(void) const { return 0; } +signed long long Bool ::toSInt(void) const { return static_cast(value); } +signed long long SInt ::toSInt(void) const { return value; } +signed long long UInt ::toSInt(void) const { assert(static_cast(value) >= 0); return static_cast(value); } +signed long long Float ::toSInt(void) const { return static_cast(value); } +signed long long Enum ::toSInt(void) const { return sig->second->toSInt(); } // unsigned integer cast -Value ::operator unsigned long long (void) const { assert(0); return 0; } -Null ::operator unsigned long long (void) const { return 0; } -Bool ::operator unsigned long long (void) const { return static_cast(value); } -SInt ::operator unsigned long long (void) const { assert(value >= 0); return static_cast(value); } -UInt ::operator unsigned long long (void) const { return value; } -Float ::operator unsigned long long (void) const { return static_cast(value); } -Enum ::operator unsigned long long (void) const { return static_cast(*sig->second); } +unsigned long long Value ::toUInt(void) const { assert(0); return 0; } +unsigned long long Null ::toUInt(void) const { return 0; } +unsigned long long Bool ::toUInt(void) const { return static_cast(value); } +unsigned long long SInt ::toUInt(void) const { assert(value >= 0); return static_cast(value); } +unsigned long long UInt ::toUInt(void) const { return value; } +unsigned long long Float ::toUInt(void) const { return static_cast(value); } +unsigned long long Enum ::toUInt(void) const { return sig->second->toUInt(); } // floating point cast -Value ::operator double (void) const { assert(0); return 0; } -Null ::operator double (void) const { return 0; } -Bool ::operator double (void) const { return static_cast(value); } -SInt ::operator double (void) const { return static_cast(value); } -UInt ::operator double (void) const { return static_cast(value); } -Float ::operator double (void) const { return value; } -Enum ::operator double (void) const { return static_cast(*sig->second); } +float Value ::toFloat(void) const { assert(0); return 0; } +float Null ::toFloat(void) const { return 0; } +float Bool ::toFloat(void) const { return static_cast(value); } +float SInt ::toFloat(void) const { return static_cast(value); } +float UInt ::toFloat(void) const { return static_cast(value); } +float Float ::toFloat(void) const { return value; } +float Enum ::toFloat(void) const { return sig->second->toFloat(); } -// blob cast -void * Value ::blob(void) const { assert(0); return NULL; } -void * Null ::blob(void) const { return NULL; } -void * Blob ::blob(void) const { return buf; } -void * Pointer::blob(void) const { return (void *)value; } +// floating point cast +double Value ::toDouble(void) const { assert(0); return 0; } +double Null ::toDouble(void) const { return 0; } +double Bool ::toDouble(void) const { return static_cast(value); } +double SInt ::toDouble(void) const { return static_cast(value); } +double UInt ::toDouble(void) const { return static_cast(value); } +double Float ::toDouble(void) const { return value; } +double Enum ::toDouble(void) const { return sig->second->toDouble(); } + + +// pointer cast +void * Value ::toPointer(void) const { assert(0); return NULL; } +void * Null ::toPointer(void) const { return NULL; } +void * Blob ::toPointer(void) const { return buf; } +void * Pointer::toPointer(void) const { return (void *)value; } + + +// pointer cast +unsigned long long Value ::toUIntPtr(void) const { assert(0); return 0; } +unsigned long long Null ::toUIntPtr(void) const { return 0; } +unsigned long long Pointer::toUIntPtr(void) const { return value; } + + +// string cast +const char * Value ::toString(void) const { assert(0); return NULL; } +const char * Null ::toString(void) const { return NULL; } +const char * String::toString(void) const { return value.c_str(); } // virtual Value::visit() @@ -295,7 +317,11 @@ public: os << bold << call->sig->name << normal << "("; for (unsigned i = 0; i < call->args.size(); ++i) { os << sep << italic << call->sig->arg_names[i] << normal << " = "; - _visit(call->args[i]); + if (call->args[i]) { + _visit(call->args[i]); + } else { + os << "?"; + } sep = ", "; } os << ")"; @@ -337,17 +363,6 @@ const Value & Value::operator[](size_t index) const { return null; } -const char * Value::string(void) const { - const String *string = dynamic_cast(unwrap(this)); - if (string) - return string->value.c_str(); - const Null *null = dynamic_cast(unwrap(this)); - if (null) - return NULL; - assert(0); - return NULL; -} - std::ostream & operator <<(std::ostream &os, Call &call) { Dumper d(os); os << call.no << " ";