203 lines
5.8 KiB
C++
203 lines
5.8 KiB
C++
#pragma once
|
|
|
|
#include "kdlib/variant.h"
|
|
|
|
namespace pykd {
|
|
|
|
class NumVariant : public kdlib::NumVariantGetter
|
|
{
|
|
|
|
public:
|
|
|
|
static kdlib::NumVariantGetter* getVariant( const python::object &obj )
|
|
{
|
|
NumVariant* var = new NumVariant();
|
|
|
|
if ( PyBool_Check( obj.ptr() ) )
|
|
{
|
|
if ( obj.ptr() == Py_True )
|
|
var->m_variant.setBool(true);
|
|
else
|
|
var->m_variant.setBool(false);
|
|
return var;
|
|
}
|
|
|
|
if ( PyInt_CheckExact( obj.ptr() ) )
|
|
{
|
|
var->m_variant.setLong( PyLong_AsLong( obj.ptr() ) );
|
|
return var;
|
|
}
|
|
|
|
if ( _PyLong_Sign( obj.ptr() ) >= 0 )
|
|
var->m_variant.setULongLong( PyLong_AsUnsignedLongLong( obj.ptr() ) );
|
|
else
|
|
var->m_variant.setLongLong( PyLong_AsLongLong( obj.ptr() ) );
|
|
|
|
return var;
|
|
}
|
|
|
|
static python::object convertToPython( kdlib::NumVariantGetter& v )
|
|
{
|
|
kdlib::NumVariant var = v;
|
|
|
|
if ( var.isChar() )
|
|
return python::object( var.asInt() );
|
|
|
|
if ( var.isUChar() )
|
|
return python::object( var.asInt() );
|
|
|
|
if ( var.isShort() )
|
|
return python::object( var.asInt() );
|
|
|
|
if ( var.isUShort() )
|
|
return python::object( var.asInt() );
|
|
|
|
if ( var.isLong() )
|
|
return python::object( var.asLong() );
|
|
|
|
if ( var.isULong() )
|
|
return python::object( var.asULong() );
|
|
|
|
if ( var.isLongLong() )
|
|
return python::object( var.asLongLong() );
|
|
|
|
if ( var.isULongLong() )
|
|
return python::object( var.asULongLong() );
|
|
|
|
if ( var.isInt() )
|
|
return python::object( var.asInt() );
|
|
|
|
if ( var.isUInt() )
|
|
return python::object( var.asUInt() );
|
|
|
|
if ( var.isFloat() )
|
|
return python::object( var.asFloat() );
|
|
|
|
if ( var.isDouble() )
|
|
return python::object( var.asDouble() );
|
|
|
|
return python::object( var.asInt() );
|
|
}
|
|
|
|
public:
|
|
|
|
static python::object eq( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) == obj;
|
|
}
|
|
|
|
static python::object ne( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) != obj;
|
|
}
|
|
|
|
static python::object lt( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) < obj;
|
|
}
|
|
|
|
static python::object gt( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) > obj;
|
|
}
|
|
|
|
static python::object le( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) <= obj;
|
|
}
|
|
|
|
static python::object ge( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) >= obj;
|
|
}
|
|
|
|
static python::object add( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) + obj;
|
|
}
|
|
|
|
static python::object sub( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) - obj;
|
|
}
|
|
|
|
static python::object rsub( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return obj - convertToPython(var);
|
|
}
|
|
|
|
static python::object mul( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) * obj;
|
|
}
|
|
|
|
static python::object div( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) / obj;
|
|
}
|
|
|
|
static python::object rdiv( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return obj / convertToPython(var);
|
|
}
|
|
|
|
static python::object mod( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) % obj;
|
|
}
|
|
|
|
static python::object rmod( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return obj % convertToPython(var);
|
|
}
|
|
|
|
static python::object rshift( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) >> obj;
|
|
}
|
|
|
|
static python::object rrshift( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return obj >> convertToPython(var);
|
|
}
|
|
|
|
static python::object lshift( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) << obj;
|
|
}
|
|
|
|
static python::object rlshift( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return obj << convertToPython(var);
|
|
}
|
|
|
|
static python::object and( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) & obj;
|
|
}
|
|
|
|
static python::object or( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) | obj;
|
|
}
|
|
|
|
static python::object xor( kdlib::NumVariantGetter& var, python::object& obj ) {
|
|
return convertToPython(var) ^ obj;
|
|
}
|
|
|
|
static python::object neg(kdlib::NumVariantGetter& var) {
|
|
return 0 - convertToPython(var);
|
|
}
|
|
|
|
static python::object pos(kdlib::NumVariantGetter& var) {
|
|
return 0 + convertToPython(var);
|
|
}
|
|
|
|
static python::object invert(kdlib::NumVariantGetter& var) {
|
|
return convertToPython(var) ^ convertToPython(var);
|
|
}
|
|
|
|
static python::object nonzero(kdlib::NumVariantGetter& var) {
|
|
return convertToPython(var) != 0;
|
|
}
|
|
|
|
static python::object long_(kdlib::NumVariantGetter& var ) {
|
|
return convertToPython(var);
|
|
}
|
|
|
|
static python::object int_(kdlib::NumVariantGetter& var) {
|
|
return convertToPython(var);
|
|
}
|
|
|
|
|
|
private:
|
|
|
|
virtual kdlib::NumVariant getValue() const{
|
|
return m_variant;
|
|
}
|
|
|
|
kdlib::NumVariant m_variant;
|
|
};
|
|
|
|
} // end pykf namespace
|