设为首页 收藏本站
查看: 729|回复: 0

[经验分享] MultiBoolean for C++/Python

[复制链接]

尚未签到

发表于 2017-4-27 11:02:36 | 显示全部楼层 |阅读模式
  MultiBoolean 是一个多值逻辑类,它兼容多种空值运算。最早在C#1.1上实现,包含在C#代码库March Library,并广泛应用于我以前开发的C#系统中,现在我编写了一个C++版,并为它封装了一个Python包。关于多值逻辑算法的讨论,见我在CSDN上发表的文章《March Library中的Multiboolean——多值逻辑实现》。这里,我主要希望可以通过这份源代码演示一个实用的boost::python应用。
以下为源代码文件的内容:



MultiBoolean.h

////////////////////////////////////////////////////////////////////////////////
//MultiBoolean C++ 实现
//基于C#源码库MarchLibrary中的MultiBoolean
//作者:刘鑫
//本代码库旨在演示Boost::Python的运算符重载技术,并提供一个实用的C++/Python
//类。
////////////////////////////////////////////////////////////////////////////////

#ifndef __MULTIBOOLEAN__
#define __MULTIBOOLEAN__

#include <string>
#include <complex>
#include <algorithm>
#include <stdexcept>

using namespace std;

namespace MarchLibrary{

class MultiBoolean
{
//友元定义
friend MultiBoolean operator ! (const MultiBoolean & x);
friend MultiBoolean operator == (const MultiBoolean & x, const MultiBoolean & y);
friend MultiBoolean operator == (const MultiBoolean & x, const bool & y);
friend MultiBoolean operator == (const bool & x, const MultiBoolean & y);
friend MultiBoolean operator != (const MultiBoolean & x, const MultiBoolean & y);
friend MultiBoolean operator != (const MultiBoolean & x, const bool & y);
friend MultiBoolean operator != (const bool & x, const MultiBoolean & y);
friend MultiBoolean operator && (const MultiBoolean & x, const MultiBoolean & y);
friend MultiBoolean operator && (const MultiBoolean & x, const bool & y);
friend MultiBoolean operator && (const bool & x, const MultiBoolean & y);
friend MultiBoolean operator || (const MultiBoolean & x, const MultiBoolean & y);
friend MultiBoolean operator || (const MultiBoolean & x, const bool & y);
friend MultiBoolean operator || (const bool & x, const MultiBoolean & y);

private:
//逻辑状态
complex<int> _value;
//禁用默认构造
        MultiBoolean(){};
//禁止直接调用传值构造
        MultiBoolean(complex<int> value)
        {
                _value = value;
        }

//可选的5个状态值
static const complex<int> TrueValue;
static const complex<int> FalseValue;
static const complex<int> UnknownValue;
static const complex<int> UndefineValue;
static const complex<int> NilValue;

public:

//重载逻辑运算符 &= 、 |= 和 ^=
        MultiBoolean& operator &= (const MultiBoolean& x)
        {
if(this->_value == MultiBoolean::NilValue)
return (*this);

else if(x._value == MultiBoolean::NilValue)
this->_value = NilValue;

else if(this->_value == MultiBoolean::UndefineValue)
this->_value = x._value;

else if(this->_value.real() > x._value.real())
this->_value = x._value;

return (*this);
        }

        MultiBoolean& operator &= (const bool& x)
        {
if(this->_value == MultiBoolean::NilValue)
return (*this);

else if(this->_value == MultiBoolean::UndefineValue)
this->_value = x ? TrueValue : FalseValue;

else if(!x)
this->_value = FalseValue;

return (*this);
        }

        MultiBoolean& operator |= (const MultiBoolean& x)
        {
if(this->_value == MultiBoolean::NilValue)
return (*this);

else if(x._value == MultiBoolean::NilValue)
this->_value = NilValue;

else if(this->_value == MultiBoolean::UndefineValue)
this->_value = x._value;

else if(this->_value.real() < x._value.real())
this->_value = x._value;

return (*this);
        }

        MultiBoolean& operator |= (const bool& x)
        {
if(this->_value == MultiBoolean::NilValue)
return (*this);

else if(this->_value == MultiBoolean::UndefineValue)
this->_value = x ? TrueValue : FalseValue;

else if(x)
this->_value = TrueValue;

return (*this);
        }

        MultiBoolean & operator ^= (const MultiBoolean & x)
        {
this->_value = ((!x&&this)||(x&&!this))._value;
return (*this);
        }

        MultiBoolean & operator ^= (const bool & x)
        {
this->_value = MultiBoolean((!x&&this)||(x&&!this))._value;
return (*this);
        }

//由二元逻辑构造多值逻辑
        MultiBoolean(bool value)
        {
                _value = value ? complex<int>(1, 0) : complex<int>(-1, 0);
        };

//状态判定函数
bool IsTrue()
        {
return _value == TrueValue;
        };

bool IsFalse()
        {
return _value == FalseValue;
        };

bool IsUnknown()
        {
return _value == UnknownValue;
        };

bool IsUndefine()
        {
return _value == UndefineValue;
        };

bool IsNil()
        {
return _value == NilValue;
        };

//字符串与多值逻辑的相互转换
const char* ToString()
        {
if(_value == TrueValue)
return "True";
if(_value == FalseValue)
return "False";
if(_value == UndefineValue)
return "Undefine";
if(_value == NilValue)
return "Nil";

return "Unknown";
        };

        string FullName()
        {
                string buf = string("MultiBoolean::");
                buf += this->ToString();
return buf;
        }

static MultiBoolean Parse(const char * input)
        {
if("True" == input)
return True;

if("False" == input)
return False;

if("Unknown" == input)
return Unknown;

if("Undefine" == input)
return Undefine;

if("Nil" == input)
return Nil;

throw logic_error(string("The string isn't a available Value.") + string(input));
        };

//可选的逻辑值,提供构造接口
static const MultiBoolean True;
static const MultiBoolean False;
static const MultiBoolean Unknown;
static const MultiBoolean Undefine;
static const MultiBoolean Nil;
};

//初始化状态值
const complex<int> MultiBoolean::TrueValue              =       complex<int>(1, 0);
const complex<int> MultiBoolean::FalseValue             =       complex<int>(-1, 0);
const complex<int> MultiBoolean::UnknownValue   =       complex<int>(0, 0);
const complex<int> MultiBoolean::UndefineValue  =       complex<int>(0, 1);
const complex<int> MultiBoolean::NilValue               =       complex<int>(0, -1);

//初始化逻辑值
const MultiBoolean MultiBoolean::True           =       MultiBoolean(TrueValue);
const MultiBoolean MultiBoolean::False  =       MultiBoolean(FalseValue);
const MultiBoolean MultiBoolean::Unknown        =       MultiBoolean(UnknownValue);
const MultiBoolean MultiBoolean::Undefine       =       MultiBoolean(UndefineValue);
const MultiBoolean MultiBoolean::Nil    =       MultiBoolean(NilValue);

//为C++版提供便捷的逻辑状态定义
const MultiBoolean True         =       MultiBoolean::True;
const MultiBoolean False        =       MultiBoolean::False;
const MultiBoolean Unknown      =       MultiBoolean::Unknown;
const MultiBoolean Undefine     =       MultiBoolean::Undefine;
const MultiBoolean Nil          =       MultiBoolean::Nil;


//非运算
MultiBoolean operator !(const MultiBoolean & x)
{
return MultiBoolean(-(x._value));
};


//相等比较

MultiBoolean operator == (const MultiBoolean & x, const MultiBoolean & y)
{
if(x._value.real() == 0 && y._value.real() == 0)
return MultiBoolean(complex<int>(0, min(x._value.imag(), y._value.imag())));

if(x._value.real() == 0 && y._value.real() != 0)
return MultiBoolean(x._value);

if(x._value.real() != 0 && y._value.real() == 0)
return MultiBoolean(y._value);

return MultiBoolean(x._value.real() == y._value.real() ? True : False);
};

MultiBoolean operator==(const MultiBoolean & x, const bool & y)
{
if(x._value.real() == 0)
return x;

return MultiBoolean((x._value.real() == 1) == y);
};

MultiBoolean operator==(const bool & x, const MultiBoolean & y)
{
if(y._value.real() == 0)
return y;

return MultiBoolean(x == (y._value.real() == 1));
};

//不等比较

MultiBoolean operator!=(const MultiBoolean & x, const MultiBoolean & y)
{
if(x._value.real() == 0 && y._value.real() == 0)
return MultiBoolean(complex<int>(0, min(x._value.imag(), y._value.imag())));

if(x._value.real() == 0 && y._value.real() != 0)
return MultiBoolean(x._value);

if(x._value.real() != 0 && y._value.real() == 0)
return MultiBoolean(y._value);

return MultiBoolean(x._value.real() == y._value.real() ? False : True);
};

MultiBoolean operator!=(const MultiBoolean & x, const bool & y)
{
if(x._value.real() == 0)
return x;

return MultiBoolean((x._value.real() == -1) == y);
};

MultiBoolean operator!=(const bool & x, const MultiBoolean & y)
{
if(y._value.real() == 0)
return y;

return MultiBoolean(x == (y._value.real() == -1));
};

//与运算

MultiBoolean operator && (const MultiBoolean & x, const MultiBoolean & y)
{
if((x._value == MultiBoolean::NilValue) || (y._value == MultiBoolean::NilValue))
return Nil;

if(x._value == MultiBoolean::UndefineValue)
return y;
if(y._value == MultiBoolean::UndefineValue)
return x;

return MultiBoolean(x._value.real() < y._value.real() ? x._value : y._value);
};

MultiBoolean operator && (const MultiBoolean & x, const bool & y)
{
return x && MultiBoolean(y);
}

MultiBoolean operator && (const bool & x, const MultiBoolean & y)
{
return MultiBoolean(x) && y;
};

//或运算

MultiBoolean operator || (const MultiBoolean & x, const MultiBoolean & y)
{
if(x._value == MultiBoolean::NilValue || y._value == MultiBoolean::NilValue)
return Nil;

if(x._value == MultiBoolean::UndefineValue)
return MultiBoolean(y._value);
if(y._value == MultiBoolean::UndefineValue)
return MultiBoolean(x._value);

return MultiBoolean(x._value.real() > y._value.real() ? x._value : y._value);
};

MultiBoolean operator || (const bool & x, const MultiBoolean & y)
{
return MultiBoolean(x) || y;
};

MultiBoolean operator || (const MultiBoolean & x, const bool & y)
{
return x || MultiBoolean(y);
};

//异或运算

MultiBoolean operator ^ (const MultiBoolean & x, const MultiBoolean & y)
{
return (!x&&y)||(x&&!y);
};

MultiBoolean operator ^ (const bool & x, const MultiBoolean & y)
{
return (!x&&y)||(x&&!y);
};

MultiBoolean operator ^ (const MultiBoolean & x, const bool & y)
{
return (!x&&y)||(x&&!y);
};

}

#endif
pyMultiBoolean.h


////////////////////////////////////////////////////////////
//与/或运算的Python接口封装
//作者:刘鑫
//Python中的与/或运算由&和|表达,为了不与C++中的按位与/或
//定义冲突,将这两个运算符定义放到单独的头文件中,仅供Python
//封装定义。
////////////////////////////////////////////////////////////

#ifndef __PYMULTIBOOLEAN__
#define __PYMULTIBOOLEAN__

#include "MultiBoolean.h"

namespace MarchLibrary{

//与运算

MultiBoolean operator & (MultiBoolean x, MultiBoolean y)
{
return x && y;
};

MultiBoolean operator & (MultiBoolean x, bool y)
{
return x && y;
}

MultiBoolean operator & (bool x, MultiBoolean y)
{
return x && y;
};

//或运算

MultiBoolean operator | (MultiBoolean x, MultiBoolean y)
{
return x || y;
};

MultiBoolean operator | (bool x, MultiBoolean y)
{
return x || y;
};

MultiBoolean operator | (MultiBoolean x, bool y)
{
return x || y;
};

}

#endif
wrapper.cpp

///////////////////////////////////////////////////////////
//MultiBoolean类的Python封装,使用boost::python技术
//作者:刘鑫
///////////////////////////////////////////////////////////

//引用boost库
#include <boost/python.hpp>
//引用多值逻辑定义
#include "MultiBoolean.h"
//引用与或运算的Python封装接口
#include "pyMultiBoolean.h"

//引用相关的命名空间

using namespace boost::python;

using namespace MarchLibrary;

//模块定义
BOOST_PYTHON_MODULE(MarchLibrary)
{
//类封装,这里用no_init表示没有可用的构造函数
        class_<MultiBoolean>("MultiBoolean", no_init)
//可选的逻辑值接口
                .def_readonly("True", &MultiBoolean::True)
                .def_readonly("False", &MultiBoolean::False)
                .def_readonly("Unknown", &MultiBoolean::Unknown)
                .def_readonly("Undefine", &MultiBoolean::Undefine)
                .def_readonly("Nil", &MultiBoolean::Nil)

//兼容C++版定义的字符串处理接口
                .def("ToString", &MultiBoolean::ToString)
                .def("FullName", &MultiBoolean::FullName)
                .def("Parse", &MultiBoolean::Parse)

//逻辑值判定
                .def("IsTrue", &MultiBoolean::IsTrue)
                .def("IsFalse", &MultiBoolean::IsFalse)
                .def("IsUnknown", &MultiBoolean::IsUnknown)
                .def("IsUndefine", &MultiBoolean::IsUndefine)
                .def("IsNil", &MultiBoolean::IsNil)

//运算符重载接口
                .def(!self)
                .def(self &= self)
                .def(self &= bool())
                .def(self |= self)
                .def(self |= bool())
                .def(self ^= self)
                .def(self ^= bool())
                .def(self == self)
                .def(self == bool())
                .def(bool() == self)
                .def(self != self)
                .def(self != bool())
                .def(bool() != self)
                .def(self & self)
                .def(self & bool())
                .def(bool() & self)
                .def(self | self)
                .def(self | bool())
                .def(bool() | self)
                .def(self ^ self)
                .def(self ^ bool())
                .def(bool() ^ self)

//提供给Python解释器的标准字符串输出接口
                .def("__str__", &MultiBoolean::ToString)
                .def("__repr__", &MultiBoolean::FullName)
        ;
}




  在已编译和配置好Boost1.33.0的前提下,将以上三个源代码文件编译为一个名为 "MarchLibrary"的动态链接库(扩展名视具体的操作系统而定),放到Python的DLLs目录下,就可以使用,该模块的名称为 “MarchLibrary”,多值逻辑类名为“MultiBoolean”。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-369909-1-1.html 上篇帖子: 读取、写入和 Python 下篇帖子: 【Python】Webpy 源码学习(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表