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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: version.hpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:08:19  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CORELIB___VERSION__HPP
  10. #define CORELIB___VERSION__HPP
  11. /*  $Id: version.hpp,v 1000.4 2004/06/01 19:08:19 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.  * Authors:  Denis Vakatov, Vladimir Ivanov, Anatoliy Kuznetsov
  37.  *
  38.  *
  39.  */
  40. /// @file version.hpp
  41. /// Define CVersionInfo, a version info storage class.
  42. #include <corelib/ncbistd.hpp>
  43. BEGIN_NCBI_SCOPE
  44. /** @addtogroup Version
  45.  *
  46.  * @{
  47.  */
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CVersionInfo
  50. /////////////////////////////////////////////////////////////////////////////
  51. ///
  52. /// CVersionInfo --
  53. ///
  54. /// Define class for storing version information.
  55. class NCBI_XNCBI_EXPORT CVersionInfo
  56. {
  57. public:
  58.     /// Constructor.
  59.     CVersionInfo(int  ver_major,
  60.                  int  ver_minor,
  61.                  int  patch_level = 0,
  62.                  const string& name        = kEmptyStr);
  63.     /// Constructor.
  64.     CVersionInfo(const CVersionInfo& version);
  65.     /// Destructor.
  66.     virtual ~CVersionInfo() {}
  67.     /// Print version information.
  68.     ///
  69.     /// Version information is printed in the following forms:
  70.     /// - <ver_major>.<ver_minor>.<patch_level>
  71.     /// - <ver_major>.<ver_minor>.<patch_level> (<name>)
  72.     virtual string Print(void) const;
  73.     /// Major version
  74.     int GetMajor(void) const { return m_Major; }
  75.     /// Minor version
  76.     int GetMinor(void) const { return m_Minor; }
  77.     /// Patch level
  78.     int GetPatchLevel(void) const { return m_PatchLevel; }
  79.     const string& GetName(void) const { return m_Name; }
  80.     static const CVersionInfo kAny;      /// { 0,  0,  0}
  81.     static const CVersionInfo kLatest;   /// {-1, -1, -1}
  82.     /// Version comparison result
  83.     /// @sa Match
  84.     enum EMatch {
  85.         eNonCompatible,           ///< major, minor does not match
  86.         eConditionallyCompatible, ///< patch level incompatibility
  87.         eBackwardCompatible,      ///< patch level is newer
  88.         eFullyCompatible          ///< exactly the same version
  89.     };
  90.     /// Check if version matches another version.
  91.     /// @param version_info
  92.     ///   Version Info to compare with
  93.     EMatch Match(const CVersionInfo& version_info) const;
  94.     /// Check if version is all zero (major, minor, patch)
  95.     /// Convention is that all-zero version used in requests as 
  96.     /// "get me anything". 
  97.     /// @sa kAny
  98.     bool IsAny() const 
  99.        { return (!m_Major && !m_Minor && !m_PatchLevel); }
  100.     /// Check if version is all -1 (major, minor, patch)
  101.     /// Convention is that -1 version used in requests as 
  102.     /// "get me the latest version". 
  103.     /// @sa kLatest
  104.     bool IsLatest() const 
  105.        { return (m_Major == -1 && m_Minor == -1 && m_PatchLevel == -1); }
  106. protected:
  107.     int           m_Major;       ///< Major number
  108.     int           m_Minor;       ///< Minor number
  109.     int           m_PatchLevel;  ///< Patch level
  110.     const  string m_Name;        ///< Name
  111. };
  112. /// Return true if one version info is matches another better than
  113. /// the best variant.
  114. /// When condition satisfies, return true and the former best values 
  115. /// are getting updated
  116. /// @param info
  117. ///    Version info to search
  118. /// @param cinfo
  119. ///    Comparison candidate
  120. /// @param best_major
  121. ///    Best major version found (reference)
  122. /// @param best_minor
  123. ///    Best minor version found (reference)
  124. /// @param best_patch_level
  125. ///    Best patch levelfound (reference)
  126. bool NCBI_XNCBI_EXPORT IsBetterVersion(const CVersionInfo& info, 
  127.                                        const CVersionInfo& cinfo,
  128.                                        int&  best_major, 
  129.                                        int&  best_minor,
  130.                                        int&  best_patch_level);
  131. /// Algorithm function to find version in the container
  132. ///
  133. /// Scans the provided iterator for version with the same major and
  134. /// minor version and the newest patch level.
  135. ///
  136. /// @param first
  137. ///    first iterator to start search 
  138. /// @param last
  139. ///    ending iterator (typically returned by end() fnction of an STL
  140. ///    container)
  141. /// @return 
  142. ///    iterator on the best version or last
  143. template<class It>
  144. It FindVersion(It first, It last, const CVersionInfo& info)
  145. {
  146.     It  best_version = last;  // not found by default
  147.     int best_major = -1;
  148.     int best_minor = -1;
  149.     int best_patch_level = -1;
  150.     for ( ;first != last; ++first) {
  151.         const CVersionInfo& vinfo = *first;
  152.         if (IsBetterVersion(vinfo, info, 
  153.                             best_major, best_minor, best_patch_level))
  154.         {
  155.             best_version = first;
  156.         }
  157.     }        
  158.     
  159.     return best_version;
  160. }
  161. /// Algorithm function to find version in the container
  162. ///
  163. /// Scans the provided container for version with the same major and
  164. /// minor version and the newest patch level.
  165. ///
  166. /// @param container
  167. ///    container object to search in 
  168. /// @return 
  169. ///    iterator on the best fit version (last if no version found)
  170. template<class TClass>
  171. typename TClass::const_iterator FindVersion(const TClass& cont, 
  172.                                             const CVersionInfo& info)
  173. {
  174.     typename TClass::const_iterator it = cont.begin();
  175.     typename TClass::const_iterator it_end = cont.end();
  176.     return FindVersion(it, it_end, info);
  177. }
  178. /* @} */
  179. END_NCBI_SCOPE
  180. /*
  181.  * ===========================================================================
  182.  * $Log: version.hpp,v $
  183.  * Revision 1000.4  2004/06/01 19:08:19  gouriano
  184.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  185.  *
  186.  * Revision 1.12  2004/04/26 14:47:25  ucko
  187.  * Fix a typo in FindVersion.
  188.  *
  189.  * Revision 1.11  2004/01/21 16:29:33  siyan
  190.  * Changed order of addtogroup relative to begin name scope.
  191.  *
  192.  * Revision 1.10  2003/12/03 16:15:00  kuznets
  193.  * Added missing dll export spec for IsBetterVersion
  194.  *
  195.  * Revision 1.9  2003/11/17 19:51:31  kuznets
  196.  * + IsBetterVersion service function
  197.  *
  198.  * Revision 1.8  2003/11/17 16:46:50  kuznets
  199.  * + container based FindVersion template
  200.  *
  201.  * Revision 1.7  2003/11/07 16:29:15  kuznets
  202.  * Added CVersionInfo::IsAny(), IsLatest()
  203.  *
  204.  * Revision 1.6  2003/10/30 19:24:44  kuznets
  205.  * Merged together version of CVersionInfo mastered by Denis with my
  206.  * version of CVersionInfo...Best of both versions.
  207.  *
  208.  * Revision 1.5  2003/10/30 16:38:08  kuznets
  209.  * CVersionInfo changed:
  210.  *  - added accessors for major, minor and patch level
  211.  *  - Match function to compare versions
  212.  * Added FindVersion algorithm to scan containers for the best version
  213.  *
  214.  * Revision 1.4  2003/09/08 12:17:42  siyan
  215.  * Documentation changes.
  216.  *
  217.  * Revision 1.3  2003/04/01 19:19:52  siyan
  218.  * Added doxygen support
  219.  *
  220.  * Revision 1.2  2002/12/26 19:18:07  dicuccio
  221.  * Added empty virtual destructor
  222.  *
  223.  * Revision 1.1  2002/12/26 17:11:10  ivanov
  224.  * Initial revision
  225.  *
  226.  * ===========================================================================
  227.  */
  228. #endif // CORELIB___VERSION__HPP