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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbiutil.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/02/12 21:45:20  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.35
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CORELIB___NCBI_UTILITY__HPP
  10. #define CORELIB___NCBI_UTILITY__HPP
  11. /*  $Id: ncbiutil.hpp,v 1000.2 2004/02/12 21:45:20 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: 
  37.  *   Eugene Vasilchenko
  38.  *
  39.  *
  40.  */
  41. /// @file ncbiutil.hpp
  42. /// Useful/utility classes and methods.
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbi_limits.h>
  45. #include <memory>
  46. #include <map>
  47. BEGIN_NCBI_SCOPE
  48. /** @addtogroup Utility Template Utilities
  49.  *
  50.  * @{
  51.  */
  52. //-------------------------------------------
  53. // Utilities
  54. /// Check for equality of objects pointed to by pointer.
  55. template <class T>
  56. struct p_equal_to : public binary_function
  57. <const T*, const T*, bool>
  58. {
  59. #if defined(NCBI_COMPILER_MIPSPRO) || defined(NCBI_COMPILER_METROWERKS) || defined(NCBI_COMPILER_VISUALAGE)
  60.     // fails to define these
  61.     typedef const T* first_argument_type;
  62.     typedef const T* second_argument_type;
  63. #endif
  64.     // Sigh.  WorkShop rejects this code without typename (but only in
  65.     // 64-bit mode!), and GCC rejects typename without a scope.
  66.     bool operator() (const typename p_equal_to::first_argument_type& x,
  67.                      const typename p_equal_to::second_argument_type& y) const
  68.     { return *x == *y; }
  69. };
  70. /// Compare objects pointed to by (smart) pointer.
  71. template <class T>
  72. struct PPtrLess : public binary_function<T, T, bool>
  73. {
  74. #if defined(NCBI_COMPILER_MIPSPRO) || defined(NCBI_COMPILER_METROWERKS) || defined(NCBI_COMPILER_VISUALAGE)
  75.     // fails to define these
  76.     typedef T first_argument_type;
  77.     typedef T second_argument_type;
  78. #endif
  79.     bool operator() (const T& x, const T& y) const
  80.     { return *x < *y; }
  81. };
  82. /// Check whether a pair's second element matches a given value.
  83. template <class Pair>
  84. struct pair_equal_to : public binary_function
  85. <Pair, typename Pair::second_type, bool>
  86. {
  87.     bool operator() (const Pair& x,
  88.                      const typename Pair::second_type& y) const
  89.     { return x.second == y; }
  90. };
  91. /// Check for not null value (after C malloc, strdup etc.).
  92. template<class X>
  93. inline X* NotNull(X* object)
  94. {
  95.     if ( !object ) {
  96.         NCBI_THROW(CCoreException,eNullPtr,kEmptyStr);
  97.     }
  98.     return object;
  99. }
  100. /// Get map element (pointer) or NULL if absent.
  101. template<class Key, class Element>
  102. inline Element GetMapElement(const map<Key, Element>& m, const Key& key,
  103.                              const Element& def = 0)
  104. {
  105.     typename map<Key, Element>::const_iterator ptr = m.find(key);
  106.     if ( ptr !=m.end() )
  107.         return ptr->second;
  108.     return def;
  109. }
  110. /// Set map element -- if data is null, erase the existing key.
  111. template<class Key, class Element>
  112. inline void SetMapElement(map<Key, Element*>& m, const Key& key, Element* data)
  113. {
  114.     if ( data )
  115.         m[key] = data;
  116.     else
  117.         m.erase(key);
  118. }
  119. /// Insert map element.
  120. template<class Key, class Element>
  121. inline bool InsertMapElement(map<Key, Element*>& m,
  122.                              const Key& key, Element* data)
  123. {
  124.     return m.insert(map<Key, Element*>::value_type(key, data)).second;
  125. }
  126. /// Get string map element or "" if absent.
  127. template<class Key>
  128. inline string GetMapString(const map<Key, string>& m, const Key& key)
  129. {
  130.     typename map<Key, string>::const_iterator ptr = m.find(key);
  131.     if ( ptr != m.end() )
  132.         return ptr->second;
  133.     return string();
  134. }
  135. /// Set string map element -- if data is null erase the existing key.
  136. template<class Key>
  137. inline void SetMapString(map<Key, string>& m,
  138.                          const Key& key, const string& data)
  139. {
  140.     if ( !data.empty() )
  141.         m[key] = data;
  142.     else
  143.         m.erase(key);
  144. }
  145. /// Delete all elements from a container of pointers (list, vector, set,
  146. /// multiset); clear the container afterwards.
  147. template<class Cnt>
  148. inline void DeleteElements( Cnt& cnt )
  149. {
  150.     for ( typename Cnt::iterator i = cnt.begin(); i != cnt.end(); ++i ) {
  151.         delete *i;
  152.     }
  153.     cnt.clear();
  154. }
  155. /// Delete all elements from map containing pointers; clear container
  156. /// afterwards.
  157. template<class Key, class Element>
  158. inline void DeleteElements(map<Key, Element*>& m)
  159. {
  160.     for ( typename map<Key, Element*>::iterator i = m.begin();  i != m.end();
  161.           ++i ) {
  162.         delete i->second;
  163.     }
  164.     m.clear();
  165. }
  166. /// Delete all elements from multimap containing pointers; clear container
  167. /// afterwards.
  168. template<class Key, class Element>
  169. inline void DeleteElements(multimap<Key, Element*>& m)
  170. {
  171.     for ( typename map<Key, Element*>::iterator i = m.begin();  i != m.end();
  172.           ++i ) {
  173.         delete i->second;
  174.     }
  175.     m.clear();
  176. }
  177. /// Retrieve the result from the result cache - if cache is empty,
  178. /// insert into cache from the supplied source.
  179. template<class Result, class Source, class ToKey>
  180. inline
  181. Result&
  182. AutoMap(auto_ptr<Result>& cache, const Source& source, const ToKey& toKey)
  183. {
  184.     Result* ret = cache.get();
  185.     if ( !ret ) {
  186.         cache.reset(ret = new Result);
  187.         for ( typename Source::const_iterator i = source.begin();
  188.               i != source.end();
  189.               ++i ) {
  190.             ret->insert(Result::value_type(toKey.GetKey(*i), *i));
  191.         }
  192.     }
  193.     return *ret;
  194. }
  195. /// Get name attribute for Value object.
  196. template<class Value>
  197. struct CNameGetter
  198. {
  199.     const string& GetKey(const Value* value) const
  200.     {
  201.         return value->GetName();
  202.     }
  203. };
  204. // These templates may yield 0 if no (suitable) elements exist.  Also,
  205. // in part for consistency with the C Toolkit, lower scores are
  206. // better, and earlier elements win ties.
  207. /// Tracks the best score (lowest value).
  208. ///
  209. /// Values are specified by template parameter T, and scoring function by
  210. /// template parameter F.
  211. template <typename T, typename F>
  212. class CBestChoiceTracker : public unary_function<T, void>
  213. {
  214. public:
  215.     /// Constructor.
  216.     CBestChoiceTracker(F func) : m_Func(func), m_Value(T()), m_Score(kMax_Int)
  217.     { }
  218.     /// Define application operator.
  219.     void operator() (const T& x)
  220.     {
  221.         int score = m_Func(x);
  222.         if (score < m_Score) {
  223.             m_Value = x;
  224.             m_Score = score;
  225.         }
  226.     }
  227.     /// Get best choice with lowest score.
  228.     const T& GetBestChoice() { return m_Value; }
  229. private:
  230.     F   m_Func;         ///< Scoring function
  231.     T   m_Value;        ///< Current best value 
  232.     int m_Score;        ///< Current best score
  233. };
  234. /// Find the best choice (lowest score) for values in a container.
  235. ///
  236. /// Container and scoring functions are specified as template parameters.
  237. template <typename C, typename F>
  238. inline
  239. typename C::value_type
  240. FindBestChoice(const C& container, F score_func)
  241. {
  242.     typedef typename C::value_type T;
  243.     CBestChoiceTracker<T, F> tracker(score_func);
  244.     ITERATE (typename C, it, container) {
  245.         tracker(*it);
  246.     }
  247.     return tracker.GetBestChoice();
  248. }
  249. END_NCBI_SCOPE
  250. /* @} */
  251. /*
  252.  * ===========================================================================
  253.  * $Log: ncbiutil.hpp,v $
  254.  * Revision 1000.2  2004/02/12 21:45:20  gouriano
  255.  * PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.35
  256.  *
  257.  * Revision 1.35  2004/01/29 12:59:57  siyan
  258.  * Fixed error in doc on SetMapString().
  259.  *
  260.  * Revision 1.34  2003/12/03 20:54:49  ucko
  261.  * +PPtrLess, for using (smart) pointers as keys.
  262.  *
  263.  * Revision 1.33  2003/11/18 11:58:41  siyan
  264.  * Changed so @addtogroup does not cross namespace boundary
  265.  *
  266.  * Revision 1.32  2003/10/20 01:49:10  siyan
  267.  * Documentation changes.
  268.  *
  269.  * Revision 1.31  2003/04/01 19:19:23  siyan
  270.  * Added doxygen support
  271.  *
  272.  * Revision 1.30  2003/03/10 17:43:45  kuznets
  273.  * iterate -> ITERATE cleanup
  274.  *
  275.  * Revision 1.29  2003/03/06 19:33:27  rsmith
  276.  * in p_equal_to change NCBI_OS_MAC to NCBI_COMPILER_METROWERKS to more accurately reflect when the fix is needed.
  277.  *
  278.  * Revision 1.28  2003/02/05 22:41:11  ucko
  279.  * +ncbi_limits.h (for FindBestChoice)
  280.  *
  281.  * Revision 1.27  2003/01/03 01:19:58  ucko
  282.  * Change default fallback for GetMapElement to 0, since "Element()"
  283.  * seems to confuse at least some compilers.
  284.  *
  285.  * Revision 1.26  2003/01/02 15:52:04  ucko
  286.  * Generalized GetMapElement to support non-pointer value types.
  287.  *
  288.  * Revision 1.25  2002/08/28 14:48:00  ucko
  289.  * Tweak FindBestChoice<> to work with MSVC.
  290.  *
  291.  * Revision 1.24  2002/08/22 21:24:24  ucko
  292.  * Added templates for finding the best element (e.g., CRef<CSeq_id>) in
  293.  * a container according to some score function.
  294.  *
  295.  * Revision 1.23  2002/07/15 18:54:40  gouriano
  296.  * typo correction
  297.  *
  298.  * Revision 1.22  2002/07/15 18:17:52  gouriano
  299.  * renamed CNcbiException and its descendents
  300.  *
  301.  * Revision 1.21  2002/07/11 14:17:56  gouriano
  302.  * exceptions replaced by CNcbiException-type ones
  303.  *
  304.  * Revision 1.20  2002/04/11 20:39:20  ivanov
  305.  * CVS log moved to end of the file
  306.  *
  307.  * Revision 1.19  2002/02/13 22:39:13  ucko
  308.  * Support AIX.
  309.  *
  310.  * Revision 1.18  2001/11/16 18:21:15  thiessen
  311.  * fix for Mac/CodeWarrior
  312.  *
  313.  * Revision 1.17  2001/11/09 20:04:04  ucko
  314.  * Tweak p_equal_to for portability.  (Tested with GCC, WorkShop,
  315.  * MIPSpro, and MSVC.)
  316.  *
  317.  * Revision 1.16  2001/05/17 14:54:44  lavr
  318.  * Typos corrected
  319.  *
  320.  * Revision 1.15  2000/12/24 00:01:48  vakatov
  321.  * Moved some code from NCBIUTIL to NCBISTD.
  322.  * Fixed AutoPtr to always work with assoc.containers
  323.  *
  324.  * Revision 1.13  2000/12/12 14:20:14  vasilche
  325.  * Added operator bool to CArgValue.
  326.  * Added standard typedef element_type to CRef<> and CConstRef<>.
  327.  * Macro iterate() now calls method end() only once and uses temporary variable
  328.  * Various NStr::Compare() methods made faster.
  329.  * Added class Upcase for printing strings to ostream with automatic conversion
  330.  *
  331.  * Revision 1.12  2000/08/29 18:32:38  vakatov
  332.  * Rollback R1.11 to R1.10
  333.  *
  334.  * Revision 1.10  2000/07/27 16:05:25  golikov
  335.  * Added DeleteElements for multimap
  336.  *
  337.  * Revision 1.9  1999/12/01 17:35:48  vasilche
  338.  * Added missing typename keyword.
  339.  *
  340.  * Revision 1.8  1999/11/19 18:24:49  vasilche
  341.  * Added ArrayDeleter and CDeleter for use in AutoPtr.
  342.  *
  343.  * Revision 1.7  1999/11/19 15:44:51  vasilche
  344.  * Modified AutoPtr template to allow its use in STL containers 
  345.  * (map, vector etc.)
  346.  *
  347.  * Revision 1.6  1999/09/16 15:49:36  sandomir
  348.  * DeleteElements: clear container added to avoid case when user forgets to
  349.  * call clear after DeleteElements
  350.  *
  351.  * Revision 1.5  1999/09/14 18:49:09  vasilche
  352.  * Added AutoMap template to convert cached maps for set/list/vector of values.
  353.  *
  354.  * Revision 1.4  1999/09/03 21:29:56  vakatov
  355.  * Fixes for AutoPtr::  specify template parameter for the base "auto_ptr"
  356.  * + #include <memory>
  357.  *
  358.  * Revision 1.3  1999/07/08 19:07:54  vakatov
  359.  * Fixed "p_equal_to" and "pair_equal_to" to pass MIPSpro 7.3 (-n32) compil
  360.  *
  361.  * Revision 1.2  1999/06/02 00:46:06  vakatov
  362.  * DeleteElements():  use "typename" for Cnt::iterator
  363.  *
  364.  * Revision 1.1  1999/05/06 20:32:52  pubmed
  365.  * CNcbiResource -> CNcbiDbResource; utils from query; few more context methods
  366.  *
  367.  * Revision 1.10  1999/04/22 14:22:24  vasilche
  368.  * Fixed mix of report name and label.
  369.  * Fixed 'related articles' of 'related articles' bug.
  370.  * Added _TRACE_THROW() macro before every throw statement.
  371.  *
  372.  * Revision 1.9  1999/04/14 17:36:30  vasilche
  373.  * Filling of CPmResource with commands was moved to main() function.
  374.  * main() function now in separate file: querymain.cpp
  375.  * All buttons implemented as IMAGE input tags.
  376.  * Retrieve command now doesn't appear in history.
  377.  * Results with one document now have this document selected by default.
  378.  *
  379.  * Revision 1.8  1999/04/09 15:52:45  vasilche
  380.  * Fixed warning about generated extern "C" function passes as arguments.
  381.  *
  382.  * Revision 1.7  1999/04/08 19:02:38  vasilche
  383.  * Added clipboards
  384.  *
  385.  * Revision 1.6  1999/04/06 19:36:17  vasilche
  386.  * Changed hockey puck structures.
  387.  * Added defalut DB filters.
  388.  * Added DB clipboards and clipboard page.
  389.  *
  390.  * Revision 1.5  1999/03/26 22:03:28  sandomir
  391.  * Link as kind of report added (qlink.hpp); filters redesigned; new filters
  392.  * for nuc and protein
  393.  *
  394.  * Revision 1.4  1999/03/15 20:01:59  vasilche
  395.  * Changed query-command interaction.
  396.  * qwebenv files split to smaller chunks.
  397.  *
  398.  * Revision 1.3  1999/02/25 19:50:36  vasilche
  399.  * First implementation of history page.
  400.  *
  401.  * Revision 1.2  1999/02/18 19:28:15  vasilche
  402.  * Added WebEnvironment.
  403.  * Fixed makefiles.
  404.  *
  405.  * Revision 1.1  1999/02/11 21:36:32  vasilche
  406.  * Added storable Web environment.
  407.  * Added qutility.hpp.
  408.  * Removed some unneeded try/catch blocks by using auto_ptr.
  409.  * ===========================================================================
  410.  */
  411. #endif /* NCBI_UTILITY__HPP */