zoukankan      html  css  js  c++  java
  • ACE中的参数截断工具-truncate

    变量截断工具是将类型A变量赋予类型B变量时使用,可自行判断变量是否需要截断,并且自动进行类型转换。

    其全部为c实现

    其入口为: ACE_Utils::truncate_cast<int> (val)

     1   /**
     2    * @class truncate_cast
     3    *
     4    * @brief Helper function to truncate an integral value to the
     5    *        maximum  value of the given type.
     6    *
     7    *        Very useful since ACE methods return @c int very often and
     8    *        the value's source is often a different-size integral
     9    *        type, such as @c size_t.  This function hides the
    10    *        truncation logic and resolves compiler diagnostics.
    11    *
    12    * @internal Internal use only.
    13    */
    14   template<typename TO, typename FROM>
    15   inline TO truncate_cast (FROM val)
    16   {
    17     // If the size of FROM is less than the size of TO, "val" will
    18     // never be greater than the maximum "TO" value, so there is no
    19     // need to attempt to truncate.
    20     typedef typename ACE::If_Then_Else<
    21       (sizeof (FROM) < sizeof (TO)),
    22       Noop_Truncator<FROM, TO>,
    23       Truncator<FROM, TO> >::result_type truncator;
    24 
    25     return truncator() (val);
    26   }

    其中判断函数实现为:

     1 namespace ACE
     2 {
     3 
     4   /**
     5    * @struct If_Then_Else
     6    *
     7    * @brief Compile-time selection of type based on a boolean value.
     8    *
     9    * This primary template selects the second or third argument based
    10    * on the value of the boolean first argument.
    11    *
    12    * Usage example:
    13    *
    14    * code
    15    *
    16    *   template <typename T>
    17    *   class Foo
    18    *   {
    19    *   public:
    20    *     // Set "TheType" to be the larger of "T" and  "int".
    21    *     typedef typename If_Then_Else<(sizeof (T) > sizeof (int)),
    22    *                                   T,
    23    *                                   int>::result_type TheType;
    24    *   };
    25    *
    26    * endcode
    27    *
    28    * @note This merely a forward declaration since we really only care
    29    *       about the partial specializations below.
    30    */
    31   template <bool C, typename Ta, typename Tb>
    32   struct If_Then_Else;
    33 
    34   /**
    35    * @struct If_Then_Else
    36    *
    37    * @brief Select of type @a Ta if boolean value is @c true.
    38    *
    39    * This partial specialization selects the type @a Ta if the boolean
    40    * first argument is @c true.
    41    */
    42   template <typename Ta, typename Tb>
    43   struct If_Then_Else<true, Ta, Tb>
    44   {
    45     typedef Ta result_type;
    46   };
    47 
    48   /**
    49    * @struct If_Then_Else
    50    *
    51    * @brief Select of type @a Tb if boolean value is @c false.
    52    *
    53    * This partial specialization selects the type @a Tb if the boolean
    54    * first argument is @c false.
    55    */
    56   template <typename Ta, typename Tb>
    57   struct If_Then_Else<false, Ta, Tb>
    58   {
    59     typedef Tb result_type;
    60   };
    61 
    62 }

    如果FROM类型小于等于TO类型,则直接进入Noop_Truncator,也就是直接静态类型转换。这里不会有编译警告,而会将FROM变量的值直接赋给TO变量

     1 // -----------------------------------------------------
     2   /**
     3    * @struct Noop_Truncator
     4    *
     5    * @brief No-op truncation.
     6    *
     7    * This structure/functor performs no truncation since it assumes
     8    * that @c sizeof(FROM) @c < @c sizeof(TO), meaning that
     9    * @c numeric_limits<FROM>::max() @c < @c numeric_limits<TO>::max().
    10    */
    11   template<typename FROM, typename TO>
    12   struct Noop_Truncator
    13   {
    14     TO operator() (FROM val)
    15     {
    16       return static_cast<TO> (val);
    17     }
    18   };
    19   // -----------------------------------------------------

    而FROM类型大小大于TO类型,则会进入Truncator

     1 /**
     2    * @struct Truncator
     3    *
     4    * @brief Truncate value of type @c FROM to value of type @c TO.
     5    *
     6    * Truncate a value of type @c FROM to value of type @c TO, if the
     7    * value is larger than the maximum of value of type @c TO.
     8    */
     9   template<typename FROM, typename TO>
    10   struct Truncator
    11   {
    12     static bool const
    13       // max FROM always greater than max TO
    14       MAX_FROM_GT_MAX_TO = (sizeof(FROM) > sizeof (TO)
    15                             || (sizeof(FROM) == sizeof (TO)
    16                                 && Sign_Check<FROM>::is_signed == 0));
    17 
    18     typedef typename ACE::If_Then_Else<
    19       MAX_FROM_GT_MAX_TO,
    20       FROM,
    21       TO>::result_type comp_to_type;
    22 
    23     // Take advantage of knowledge that we're casting a positive value
    24     // to a type large enough to hold it so that we can bypass
    25     // negative value checks at compile-time.  Otherwise fallback on
    26     // the safer comparison.
    27     typedef typename ACE::If_Then_Else<
    28       MAX_FROM_GT_MAX_TO,
    29       Fast_Comparator<FROM, comp_to_type>,
    30       typename Comparator<FROM, comp_to_type>::comp_type>::result_type comparator;
    31 
    32     /// Truncate a value of type @c FROM to value of type @c TO, if
    33     /// the value is larger than the maximum of value of type @c TO.
    34     TO operator() (FROM val)
    35     {
    36       return
    37         (comparator::greater_than (val, ACE_Numeric_Limits<TO>::max ())
    38          ? ACE_Numeric_Limits<TO>::max ()
    39          : static_cast<TO> (val));
    40     }
    41 
    42   };

    这里会直接对val进行判断,如果该值大于TO类型的最大值,则将TO变量设为最大值,否则仍旧静态转换后赋值

  • 相关阅读:
    OC
    OC
    核心动画
    核心动画
    核心动画
    数据存储1
    plsql语句基础
    Oracle3连接&子查询&联合查询&分析函数
    oracle2约束添加&表复制&拼接
    Oracle表空间创建及表创建
  • 原文地址:https://www.cnblogs.com/zl1991/p/9342586.html
Copyright © 2011-2022 走看看