ACE学习笔记(一)

一、ACE_CDR::void mb_align (ACE_Message_Block *mb);

{

char * const start = ACE_ptr_align_binary (mb->base (),
                                             ACE_CDR::MAX_ALIGNMENT);
  mb->rd_ptr (start);
  mb->wr_ptr (start);

这个函数用于字节序对齐,相当于将mb->base移动 ACE_CDR::MAX_ALIGNMENT - mb->base () % ACE_CDR::MAX_ALIGNMENT距离。 


二、ACE_Utils::truncate_cast

在《C++网络编程,卷一》并没有用到这个函数,其代码在96页,Logging_Client::send中:

ACE::CDR::ULong length = payload.total_length();

而在ACE6.0中,对应代码变为:

ACE_CDR::ULong length =
      ACE_Utils::truncate_cast<ACE_CDR::ULong> (payload.total_length ());

truncate为截头去尾,这里是一个强转,将size_t转为ULong,顺便说一句size_t和ULong都是32位无符号整型,其实这里没有必要转换。

定义如下:

  template<typename TO, typename FROM>
  inline TO truncate_cast (FROM val)
  {
    typedef typename ACE::If_Then_Else<
      (sizeof (FROM) < sizeof (TO)),
      Noop_Truncator<FROM, TO>,
      Truncator<FROM, TO> >::result_type truncator;
    return truncator() (val);
  }

语意为如果FROM所占字节数小于TO,则不必truncate。

这里的ACE::If_Then_Else有两个特化

原型:

 template <bool C, typename Ta, typename Tb>
  struct If_Then_Else;

分别为:

template <typename Ta, typename Tb>
  struct If_Then_Else<true, Ta, Tb>
  {
    typedef Ta result_type;
  };

template <typename Ta, typename Tb>
  struct If_Then_Else<false, Ta, Tb>
  {
    typedef Tb result_type;
  };

result_type总取所占位数较多的那个result_type

Noop_Truncator<FROM, TO>好理解,表示不需要Truncator,这里看看Truncator<FROM, TO>

template<typename FROM, typename TO>
  struct Truncator
  {
    ACE_STATIC_CONSTANT (
      bool,
      MAX_FROM_GT_MAX_TO = (sizeof(FROM) > sizeof (TO)
                            || (sizeof(FROM) == sizeof (TO)
                                && Sign_Check<FROM>::is_signed == 0)));


    typedef typename ACE::If_Then_Else<
      MAX_FROM_GT_MAX_TO,
      FROM,
      TO>::result_type comp_to_type;

    typedef typename ACE::If_Then_Else<
      MAX_FROM_GT_MAX_TO,
      Fast_Comparator<FROM, comp_to_type>,
      typename Comparator<FROM, comp_to_type>::comp_type>::result_type comparator;

    TO operator() (FROM val)
    {
      return
        (comparator::greater_than (val, ACE_Numeric_Limits<TO>::max ())
         ? ACE_Numeric_Limits<TO>::max ()
          : static_cast<TO> (val));
    }
  };

这里面有个无符号数只能与无符号数比较、有符号数只能与有符号数比较的约定。

最后的大意是如果需要截头去尾,那么只能取TO类型所能表示的最大值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值