#include "pocketpy/pocketpy.h"

#include "pocketpy/common/utils.h"
#include "pocketpy/objects/object.h"
#include "pocketpy/interpreter/vm.h"

int64_t py_toint(const py_Ref self){
    return self->_i64;
}

double py_tofloat(const py_Ref self){
    return self->_f64;
}

bool py_castfloat(const py_Ref self, double* out){
    switch(self->type){
        case tp_int:
            *out = (double)self->_i64;
            return true;
        case tp_float:
            *out = self->_f64;
            return true;
        case tp_bool:
            *out = self->extra;
            return true;
        default:
            return false;
    }
}

bool py_tobool(const py_Ref self){
    return self->extra;
}

const char* py_tostr(const py_Ref self){
    py_Str* ud = PyObject__value(self->_obj);
    return py_Str__data(ud);
}

const char* py_tostrn(const py_Ref self, int* out){
    py_Str* ud = PyObject__value(self->_obj);
    *out = ud->size;
    return py_Str__data(ud);
}

void* py_touserdata(const py_Ref self){
    assert(self && self->is_ptr);
    return PyObject__value(self->_obj);
}

bool py_istype(const py_Ref self, py_Type type){
    return self->type == type;
}
