ncbi_limits.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_limits.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:07:36  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef NCBI_LIMITS__HPP
  10. #define NCBI_LIMITS__HPP
  11. /*  $Id: ncbi_limits.hpp,v 1000.1 2004/06/01 19:07:36 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Denis Vakatov
  37.  *
  38.  * File Description:
  39.  *
  40.  *   Temporary replacement for "numeric_limits<>".
  41.  *   Extremely incomplete implementation,
  42.  *
  43.  *    only min() and max() methods for:
  44.  *
  45.  *      numeric_limits<char>
  46.  *      numeric_limits<signed   char>
  47.  *      numeric_limits<unsigned char>
  48.  *
  49.  *      numeric_limits<signed   short>
  50.  *      numeric_limits<unsigned short>
  51.  *      numeric_limits<signed   int>
  52.  *      numeric_limits<unsigned int>
  53.  *      numeric_limits<signed   long>
  54.  *      numeric_limits<unsigned long>
  55.  *
  56.  *      numeric_limits<float>
  57.  *      numeric_limits<double>
  58.  *
  59.  *      (platform-specific)
  60.  *      numeric_limits<signed   long long>
  61.  *      numeric_limits<unsigned long long>
  62.  *      numeric_limits<signed   __int64>
  63.  *      numeric_limits<unsigned __int64>
  64.  *
  65.  */
  66. #include <corelib/ncbistd.hpp>
  67. #include <corelib/ncbi_limits.h>
  68. /** @addtogroup Portability
  69.  *
  70.  * @{
  71.  */
  72. #if defined(HAVE_LIMITS) && !defined(NCBI_COMPILER_WORKSHOP)
  73. // Ideally, we would use std::numeric_limits<> whenever available.
  74. // However, certain compilers leave out support for extensions such as
  75. // long long, so we still have to use our implementation with them.
  76. #  include <limits>
  77. #else
  78. BEGIN_NCBI_SCOPE
  79. ///
  80. ///  Pre-declaration of the "numeric_limits<>" template
  81. ///  Forcibly overrides (using preprocessor) the original "numeric_limits<>"!
  82. ///
  83. #  define numeric_limits ncbi_numeric_limits
  84. template <class T> class numeric_limits;
  85. ///
  86. ///  Auxiliary macro to implement (a limited edition of) the
  87. ///  "numeric_limits<>" template
  88. ///
  89. #  define NCBI_NUMERIC_LIMITS(type, alias) 
  90.   template <> 
  91.   class numeric_limits<type> 
  92.   { 
  93.   public: 
  94.       static inline type min() THROWS_NONE { return kMin_##alias; } 
  95.       static inline type max() THROWS_NONE { return kMax_##alias; } 
  96.   }
  97. #  define NCBI_NUMERIC_LIMITS_UNSIGNED(type, alias) 
  98.   template <> 
  99.   class numeric_limits<type> 
  100.   { 
  101.   public: 
  102.       static inline type min() THROWS_NONE { return 0; } 
  103.       static inline type max() THROWS_NONE { return kMax_##alias; } 
  104.   }
  105. //
  106. //  Implement (a limited edition of) the "numeric_limits<>" template
  107. //  for various built-in types
  108. //
  109. NCBI_NUMERIC_LIMITS          (         char,  Char);
  110. NCBI_NUMERIC_LIMITS          (signed   char, SChar);
  111. NCBI_NUMERIC_LIMITS_UNSIGNED (unsigned char, UChar);
  112. NCBI_NUMERIC_LIMITS          (signed   short,  Short);
  113. NCBI_NUMERIC_LIMITS_UNSIGNED (unsigned short, UShort);
  114. NCBI_NUMERIC_LIMITS          (signed   int,  Int);
  115. NCBI_NUMERIC_LIMITS_UNSIGNED (unsigned int, UInt);
  116. NCBI_NUMERIC_LIMITS          (signed   long,  Long);
  117. NCBI_NUMERIC_LIMITS_UNSIGNED (unsigned long, ULong);
  118. NCBI_NUMERIC_LIMITS          (float,  Float);
  119. NCBI_NUMERIC_LIMITS          (double, Double);
  120. #  if (SIZEOF_LONG_LONG > 0)
  121. NCBI_NUMERIC_LIMITS          (signed   long long,  LongLong);
  122. NCBI_NUMERIC_LIMITS_UNSIGNED (unsigned long long, ULongLong);
  123. #  endif
  124. #  if defined(NCBI_USE_INT64)
  125. NCBI_NUMERIC_LIMITS          (signed   __int64,  Int64);
  126. NCBI_NUMERIC_LIMITS_UNSIGNED (unsigned __int64, UInt64);
  127. #  endif
  128. END_NCBI_SCOPE
  129. #endif // !HAVE_LIMITS  ||  NCBI_COMPILER_WORKSHOP
  130. BEGIN_NCBI_SCOPE
  131. /// Generic template to get STD limits by a variable.
  132. /// Typical use:
  133. /// <pre>
  134. ///  int a = 10; 
  135. ///  
  136. /// @note 
  137. ///   Causes a compile-time failure if used
  138. ///    instead of the specialized implementations.
  139. template<typename T> 
  140. inline numeric_limits<T> get_limits(const T&)
  141. {
  142. typename T::TypeIsNotSupported tmp; 
  143. return numeric_limits<T>();
  144. }
  145. /// Macro to declare specilized get_limits
  146. #  define NCBI_GET_NUMERIC_LIMITS(type) 
  147.     EMPTY_TEMPLATE 
  148.     inline numeric_limits<type> get_limits(const type&) 
  149. { return numeric_limits<type>(); }
  150. NCBI_GET_NUMERIC_LIMITS(         char)
  151. NCBI_GET_NUMERIC_LIMITS(signed   char)
  152. NCBI_GET_NUMERIC_LIMITS(unsigned char)
  153. NCBI_GET_NUMERIC_LIMITS(signed   short)
  154. NCBI_GET_NUMERIC_LIMITS(unsigned short)
  155. NCBI_GET_NUMERIC_LIMITS(signed   int)
  156. NCBI_GET_NUMERIC_LIMITS(unsigned int)
  157. NCBI_GET_NUMERIC_LIMITS(signed   long)
  158. NCBI_GET_NUMERIC_LIMITS(unsigned long)
  159. NCBI_GET_NUMERIC_LIMITS(float)
  160. NCBI_GET_NUMERIC_LIMITS(double)
  161. #  if (SIZEOF_LONG_LONG > 0)
  162. NCBI_GET_NUMERIC_LIMITS(signed   long long)
  163. NCBI_GET_NUMERIC_LIMITS(unsigned long long)
  164. #  endif
  165. #  if defined(NCBI_USE_INT64)
  166. NCBI_GET_NUMERIC_LIMITS(signed   __int64)
  167. NCBI_GET_NUMERIC_LIMITS(unsigned __int64)
  168. #  endif
  169. END_NCBI_SCOPE
  170. /* @} */
  171. /*
  172.  * ==========================================================================
  173.  * $Log: ncbi_limits.hpp,v $
  174.  * Revision 1000.1  2004/06/01 19:07:36  gouriano
  175.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  176.  *
  177.  * Revision 1.7  2004/06/01 12:09:45  kuznets
  178.  * + get_limits
  179.  *
  180.  * Revision 1.6  2003/04/01 14:18:50  siyan
  181.  * Added doxygen support
  182.  *
  183.  * Revision 1.5  2002/11/04 21:47:56  ucko
  184.  * Use system numeric_limits<> whenever <limits> exists, except on
  185.  * WorkShop (which has "long long" but not numeric_limits<long long>).
  186.  *
  187.  * Revision 1.4  2002/04/11 20:39:15  ivanov
  188.  * CVS log moved to end of the file
  189.  *
  190.  * Revision 1.3  2002/02/14 17:15:44  kans
  191.  * use standard numeric limits on MacOS (AU)
  192.  *
  193.  * Revision 1.2  2001/05/30 16:17:23  vakatov
  194.  * Introduced #NCBI_USE_INT64 -- in oreder to use "__int64" type
  195.  * only when absolutely necessary (otherwise it conflicted with
  196.  * "long long" for the Intel C++ compiler).
  197.  *
  198.  * Revision 1.1  2001/01/03 17:35:23  vakatov
  199.  * Initial revision
  200.  *
  201.  * ==========================================================================
  202.  */
  203. #endif /* NCBI_LIMITS__HPP */