一、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类型所能表示的最大值。