`
febird
  • 浏览: 256546 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个很强大的Comparator生成器

    博客分类:
  • C++
阅读更多

项目地址:http://code.google.com/p/febird

 

 

 

/**
  @brief 生成一个比较器(Comparator),兼键提取(KeyExtractor)类

  使用这个宏生成的比较器可以作用在不同的对象上,只要这些对象有相同名称的成员,
  并且可以作用在类型为成员类型的对象上。

  - 假设:

    - 有 n 个类 class[1], class[2], ... class[n],都有类型为 MemberType ,名称为 MemberName 的数据成员
    - 那么以下类型的对象可以使用该类相互比较,并且可以从这些对象中提取出 MemberType 类型的键:
        class[1] ... class[n], MemberType, 以及所有这些类型的任意级别的指针

  @param ComparatorName 比较器类的名字
  @param MemberType     要比较的对象的成员类型
  @param MemberName     要比较的对象的成员名字,也可以是一个成员函数调用,
                        前面必须加 '.' 或者 '->', 加 '->' 只是为用于 smart_ptr/iterator/proxy 等重载 '->' 的对象
                        当用于裸指针时,仍使用 '.',这意味着裸指针和 smart_ptr/iterator/proxy
                        不能使用同一个生成的 Comparator,虽然裸指针的语法和它们都相同
  @param ComparePred    比较准则,这个比较准则将被应用到 XXXX MemberName

  @note
    - 这个类不是从 ComparePred 继承,为的是可以允许 ComparePred 是个函数,
      但这样(不继承)阻止了编译器进行空类优化
    - 不在内部使用 const MemberType&, 而是直接使用 MemberType, 
      是为了允许 MemberName 是一个函数时,返回一个即时计算出来的 Key;
      - 当为了效率需要使用引用时,将 const MemberType& 作为 MemberType 传进来
    - 当 MemberType 是个指针时,将 Type* 作为 MemberType ,而非 const Type*,即使 MemberType 真的是 const Type*
    - 注意 C++ 参数推导机制:
    @code
      template<T> void f(const T& x) { } // f1
      template<T> void f(const T* x) { } // f2
      template<T> void g(const T& x) { } // g1
      template<T> void g(const T* x) { } // g2
      template<T> void g(      T& x) { } // g3
      template<T> void g(      T* x) { } // g4
      void foo()
      {
         int a;
         const int b;
         f(&a); // call f1, T was deduced as int*, and then convert to 'const int*&', so match f1, not f2
         f(&b); // call f2, T was deduced as int
         g(&a); // call g4, T was deduced as int
         g(&b); // call g2, T was deduced as int
      }
    @endcode
      在上述代码已经表现得比较明白了,这就是要生成四个不同 deref 版本的原因
    - 为了配合上述机制,传入的 MemberType 不要有任何 const 修饰符
 */
#define SAME_NAME_MEMBER_COMPARATOR_EX(ComparatorName, MemberType, MemberName, ComparePred) \
class ComparatorName                                        \
{                                                           \
    ComparePred m_comp;                                     \
public:                                                     \
    typedef bool        result_type;                        \
    typedef MemberType  key_type;                           \
    typedef boost::integral_constant<bool,                  \
        febird::HasTriCompare<ComparePred>::value           \
    > has_tri_compare;                                      \
                                                            \
    ComparatorName()  {}                                    \
    ComparatorName(const ComparePred& rhs)                  \
        : m_comp(rhs) {}                                    \
                                                            \
    template<class T>const T&deref(T*x)const{return*x;}     \
    template<class T>const T&deref(T&x)const{return x;}     \
    template<class T>const T&deref(const T*x)const{return*x;}\
    template<class T>const T&deref(const T&x)const{return x;}\
                                                            \
    const MemberType operator()(const MemberType x)const{return x;} \
    template<class T>const MemberType operator()(const T&x)const{return deref(x)MemberName;}\
                                                            \
    template<class Tx, class Ty>                            \
    bool operator()(const Tx&x, const Ty&y) const           \
    {                                                       \
        return m_comp((*this)(x),(*this)(y));               \
    }                                                       \
    template<class Tx, class Ty>                            \
    int compare(const Tx&x, const Ty&y) const               \
    {                                                       \
        return m_comp.compare((*this)(x),(*this)(y));       \
    }                                                       \
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#endif

// #define SAME_NAME_MEMBER_COMPARATOR_EX(ComparatorName, MemberType, MemberName, ComparePred)  \
// SAME_NAME_MEMBER_COMPARATOR_EX_NO_TRAITS(ComparatorName, MemberType, MemberName, ComparePred)\
// BOOST_TT_AUX_BOOL_TRAIT_SPEC1(HasTriCompare, ComparatorName, HasTriCompare<ComparePred>::value)

//! note@ if MemberType must not be a reference, neither const nor non-const
#define SAME_NAME_MEMBER_COMPARATOR(ComparatorName, MemberType, MemberName) \
    SAME_NAME_MEMBER_COMPARATOR_EX(ComparatorName, MemberType, MemberName, std::less<MemberType>)

项目地址:http://code.google.com/p/febird

 



  


  
分享到:
评论

相关推荐

    VHDL.rar_phase comparator

    VHDL,全称是VHSIC(Very High Speed Integrated Circuit)硬件描述语言,是一种用于电子设计自动化领域的编程语言,广泛应用于数字...对于学习数字电路、嵌入式系统或者硬件设计的人来说,这是一个很好的实践案例。

    AAC2M1P1_TheTest_comparator_源码

    【标题】"AAC2M1P1_TheTest_comparator_源码" 指的是一个与比较器(Comparator)相关的源代码项目,这个项目的测试部分可能被命名为"TheTest"。在数字电路设计中,比较器是一种基本的逻辑组件,用于比较两个数字输入...

    基于Java的验证码生成库 JCaptcha.zip

    Java验证码生成库JCaptcha是一个强大的安全工具,用于创建和验证在Web应用中广泛使用的图形验证码。验证码的主要目的是防止自动化的机器人或恶意脚本执行非法操作,例如注册虚假账户、发送垃圾邮件或者进行其他非...

    TMS320x2802x, 2803x Piccolo Analog-to-Digital Converter (ADC) and Comparator.pdf

    文档还解释了ADC的采样过程和采样原理(SOC Principle of Operation),这对于理解ADC如何开始一个转换周期是至关重要的。另外,还提及了ADC转换优先级设置,这关系到系统如何决定哪个信号应该先被转换。对于需要...

    Java 生成随机字符串数组的实例详解

    Random是Java中的一种随机数生成器,用于生成随机数。Random类提供了许多有用的方法,例如nextInt()、nextDouble()等。 生成随机字符串数组的步骤 1. 创建一个String类型的字符串,用于存储所有的字母和数字。 2. ...

    Comparator Reflector-开源

    Comparator接口是Java集合框架的一部分,它定义了一个比较两个对象的方法——compare(),用于自定义对象的排序规则。通过实现Comparator接口,我们可以根据特定逻辑来比较对象,使得排序更灵活,适用于各种复杂的...

    FPGA中Verilog语言实现生成三角波

    在“FPGA中Verilog语言实现生成三角波”的项目中,我们需要设计一个能够产生连续三角波的时序逻辑电路。三角波的生成通常基于计数器和比较器的原理。首先,一个计数器(如二进制或模N计数器)会随着时间递增或递减其...

    pwm.rar_pwm_pwm vhdl_pwm vhdl

    ”说明了这个压缩包提供的VHDL代码是一个简单的PWM波形生成器的设计,适合初学者参考学习。这可能包含一个基本的脉冲宽度调制器的结构,以及如何在VHDL中定义和控制脉冲的宽度。 在标签“pwm pwm__vhdl pwm_vhdl”...

    ListView的字母排序和过滤搜索功能第三种效果

    为了实现字母排序的侧边栏,开发者可能创建了一个SlidingDrawer或者使用了SwipeRefreshLayout,或者直接在布局文件中添加了一个固定在侧边的LinearLayout,包含所有字母按钮。每个按钮都有一个点击监听器,当用户...

    PWM.rar_made_pwm vhdl

    这个"PWM.rar_made_pwm vhdl"压缩包包含的正是一个使用 VHDL 实现的 PWM 生成器的设计实例。 首先,我们来看 `test_pwm.vhd` 文件。这通常是一个测试平台或者激励文件,用于验证 PWM 生成模块的功能。它会创建必要...

    C++写的8位比较器 用门级建模

    对于8位比较器,我们需要比较两个数的每一位,并根据这些比较结果生成一个最终的比较标志。这个标志可能包括"大于"、"小于"或"等于"的信号。 为了实现这个功能,我们可以创建一个主类"Comparator",它包含8个独立的...

    qa-screenshot-comparator:生成,保存和比较任何分辨率的任何网站的屏幕截图

    这个方便的工具使我们可以生成和比较网站屏幕截图,以获得任何可能的分辨率。 要求 您需要节点版本高于8且低于10 安装 如果要将项目安装为独立应用程序,请克隆项目并运行npm install 如果要将项目安装为应用程序的...

    fpga通过vivado实现比较器

    在本文中,我们将深入探讨如何使用Xilinx的Vivado工具在FPGA(Field Programmable Gate Array)上实现一个比较器。FPGA是一种可编程逻辑器件,它允许开发者根据需求自定义硬件逻辑,广泛应用于数字信号处理、图像...

    MPWM_GEN.rar_pwm_pwm matlab_自制pwm发生器

    更复杂的设计通常会在Simulink环境中进行,通过组合各种单元,如`Sine Wave`、`Comparator`和`Sample Time Controller`等,来构建一个完整的PWM生成系统。 3. **PWM应用**:PWM技术广泛应用于逆变器、开关电源、...

    matlab开发-生成pwmusingsaw牙波

    本教程将详细解释如何利用MATLAB开发一个生成PWM锯齿波的系统。 首先,理解PWM的基本概念至关重要。PWM是一种模拟信号通过开关频率在数字信号之间转换的技术,其基本原理是通过改变占空比来调节输出电压的平均值。...

    java编程练习题

    6,写一个类Zoo,要求分别生成若干个Animal,Fish和Bird。并调用他们的属性和方法。 7,写Shape类,要求如下: 1.int类型属性x和y,分别表示图形的中心点坐标 2.无参构造器 3.构造器,对x和y进行初始化 4.draw()...

    DotD_v1033_unity3d_TheTest_asriz_

    "test bench waveform2d34"则暗示存在一个测试平台,用于生成和分析Comparator的2D和3D波形,以确保其功能正确无误。 在标签中,"unity3d"进一步确认了这个项目是使用Unity开发的,"TheTest"可能是一个测试关卡或者...

    MultipleComparatorSorting:使用多个比较器进行动态排序

    例如,如果我们要对一个包含`Person`对象的列表按年龄和名字进行排序,我们可以创建两个不同的`Comparator`:一个用于比较年龄,另一个用于比较名字。 接下来,我们来看看如何使用多个比较器。在某些情况下,单个...

    pwm.rar_PWM single phase_inverter_pwm_single phase PWM_single-ph

    总之,PWM单相逆变器在电力电子中扮演着重要角色,而MATLAB/SIMULINK提供了一个直观且强大的平台,使得理论研究和实际应用的结合变得更为便捷。通过深入研究和仿真“pwm.mdl”,我们可以对逆变器的设计和控制有更...

    STM32L4比较器(COMP)介绍.pdf

    ### STM32L4 比较器 (COMP) 详细介绍 #### 一、概述 在微控制器领域,STM32L4系列以其卓越的性能和低功耗特性备受推崇。...对于需要精确模拟信号处理的应用而言,STM32L4 的比较器无疑是一个强大的工具。

Global site tag (gtag.js) - Google Analytics