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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbimisc.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/02/12 21:45:03  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.71
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CORELIB___NCBIMISC__HPP
  10. #define CORELIB___NCBIMISC__HPP
  11. /*  $Id: ncbimisc.hpp,v 1000.2 2004/02/12 21:45:03 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, Eugene Vasilchenko
  37.  *
  38.  *
  39.  */
  40. /// @file ncbistd.hpp
  41. /// Miscellaneous common-use basic types and functionality
  42. #include <corelib/ncbistl.hpp>
  43. #ifdef NCBI_OS_UNIX
  44. #  include <sys/types.h>
  45. #endif
  46. /** @addtogroup AppFramework
  47.  *
  48.  * @{
  49.  */
  50. BEGIN_NCBI_SCOPE
  51. /// Which type of ownership between objects.
  52. ///
  53. /// Can be used to specify ownership relationship between objects.
  54. /// For example, specify if a CSocket object owns the underlying
  55. /// SOCK object. 
  56. enum EOwnership {
  57.     eNoOwnership,       ///< No ownership relationship
  58.     eTakeOwnership      ///< An object can take ownership of another
  59. };
  60. /// Whether a value is nullable.
  61. enum ENullable
  62. {
  63.     eNullable,          ///< Value can be null
  64.     eNotNullable        ///< Value cannot be null
  65. };
  66. #if defined(HAVE_NO_AUTO_PTR)
  67. /////////////////////////////////////////////////////////////////////////////
  68. ///
  69. /// auto_ptr --
  70. ///
  71. /// Define auto_ptr if needed.
  72. ///
  73. /// Replacement of STL's std::auto_ptr for compilers with poor "auto_ptr"
  74. /// implementation.
  75. /// 
  76. /// See C++ Toolkit documentation for limiatations and use of auto_ptr.
  77. template <class X>
  78. class auto_ptr
  79. {
  80. public:
  81.     typedef X element_type;         ///< Define element_type
  82.     /// Explicit conversion to auto_ptr.
  83.     explicit auto_ptr(X* p = 0) : m_Ptr(p) {}
  84.     /// Copy constructor with implicit conversion.
  85.     ///
  86.     /// Note that the copy constructor parameter is not a const
  87.     /// because it is modified -- ownership is transferred.
  88.     auto_ptr(auto_ptr<X>& a) : m_Ptr(a.release()) {}
  89.     /// Assignment operator.
  90.     auto_ptr<X>& operator=(auto_ptr<X>& a) {
  91.         if (this != &a) {
  92.             if (m_Ptr  &&  m_Ptr != a.m_Ptr) {
  93.                 delete m_Ptr;
  94.             }
  95.             m_Ptr = a.release();
  96.         }
  97.         return *this;
  98.     }
  99.     /// Destructor.
  100.     ~auto_ptr(void) {
  101.         if ( m_Ptr )
  102.             delete m_Ptr;
  103.     }
  104.     /// Deference operator.
  105.     X&  operator*(void) const { return *m_Ptr; }
  106.     /// Reference operator.
  107.     X*  operator->(void) const { return m_Ptr; }
  108.     /// Equality operator.
  109.     int operator==(const X* p) const { return (m_Ptr == p); }
  110.     /// Get pointer value.
  111.     X*  get(void) const { return m_Ptr; }
  112.     /// Release pointer.
  113.     X* release(void) {
  114.         X* x_Ptr = m_Ptr;  m_Ptr = 0;  return x_Ptr;
  115.     }
  116.     /// Reset pointer.
  117.     void reset(X* p = 0) {
  118.         if (m_Ptr != p) {
  119.             delete m_Ptr;
  120.             m_Ptr = p;
  121.         }
  122.     }
  123. private:
  124.     X* m_Ptr;               ///< Internal pointer implementation.
  125. };
  126. #endif /* HAVE_NO_AUTO_PTR */
  127. /// Functor template for allocating object.
  128. template<class X>
  129. struct Creater
  130. {
  131.     /// Default create function.
  132.     static X* Create(void)
  133.     { return new X; }
  134. };
  135. /// Functor tempate for deleting object.
  136. template<class X>
  137. struct Deleter
  138. {
  139.     /// Default delete function.
  140.     static void Delete(X* object)
  141.     { delete object; }
  142. };
  143. /// Functor template for deleting array of objects.
  144. template<class X>
  145. struct ArrayDeleter
  146. {
  147.     /// Array delete function.
  148.     static void Delete(X* object)
  149.     { delete[] object; }
  150. };
  151. /// Functor template for the C language deallocation function, free().
  152. template<class X>
  153. struct CDeleter
  154. {
  155.     /// C Language deallocation function.
  156.     static void Delete(X* object)
  157.     { free(object); }
  158. };
  159. /////////////////////////////////////////////////////////////////////////////
  160. ///
  161. /// AutoPtr --
  162. ///
  163. /// Define an "auto_ptr" like class that can be used inside STL containers.
  164. ///
  165. /// The Standard auto_ptr template from STL doesn't allow the auto_ptr to be
  166. /// put in STL containers (list, vector, map etc.). The reason for this is
  167. /// the absence of copy constructor and assignment operator.
  168. /// We decided that it would be useful to have an analog of STL's auto_ptr
  169. /// without this restriction - AutoPtr.
  170. ///
  171. /// Due to nature of AutoPtr its copy constructor and assignment operator
  172. /// modify the state of the source AutoPtr object as it transfers ownership
  173. /// to the target AutoPtr object. Also, we added possibility to redefine the
  174. /// way pointer will be deleted: the second argument of template allows
  175. /// pointers from "malloc" in AutoPtr, or you can use "ArrayDeleter" (see
  176. /// above) to properly delete an array of objects using "delete[]" instead
  177. /// of "delete". By default, the internal pointer will be deleted by C++
  178. /// "delete" operator.
  179. ///
  180. /// @sa
  181. ///   Deleter(), ArrayDeleter(), CDeleter()
  182. template< class X, class Del = Deleter<X> >
  183. class AutoPtr
  184. {
  185. public:
  186.     typedef X element_type;         ///< Define element type.
  187.     /// Constructor.
  188.     AutoPtr(X* p = 0)
  189.         : m_Ptr(p), m_Owner(true)
  190.     {
  191.     }
  192.     /// Copy constructor.
  193.     AutoPtr(const AutoPtr<X, Del>& p)
  194.         : m_Ptr(0), m_Owner(p.m_Owner)
  195.     {
  196.         m_Ptr = p.x_Release();
  197.     }
  198.     /// Destructor.
  199.     ~AutoPtr(void)
  200.     {
  201.         reset();
  202.     }
  203.     /// Assignment operator.
  204.     AutoPtr<X, Del>& operator=(const AutoPtr<X, Del>& p)
  205.     {
  206.         if (this != &p) {
  207.             bool owner = p.m_Owner;
  208.             reset(p.x_Release());
  209.             m_Owner = owner;
  210.         }
  211.         return *this;
  212.     }
  213.     /// Assignment operator.
  214.     AutoPtr<X, Del>& operator=(X* p)
  215.     {
  216.         reset(p);
  217.         return *this;
  218.     }
  219.     /// Bool operator for use in if() clause.
  220.     operator bool(void) const
  221.     {
  222.         return m_Ptr != 0;
  223.     }
  224.     // Standard getters.
  225.     /// Dereference operator.
  226.     X& operator* (void) const { return *m_Ptr; }
  227.     /// Reference operator.
  228.     X* operator->(void) const { return  m_Ptr; }
  229.     /// Get pointer.
  230.     X* get       (void) const { return  m_Ptr; }
  231.     /// Release will release ownership of pointer to caller.
  232.     X* release(void)
  233.     {
  234.         m_Owner = false;
  235.         return m_Ptr;
  236.     }
  237.     /// Reset will delete old pointer, set content to new value,
  238.     /// and accept ownership upon the new pointer.
  239.     void reset(X* p = 0)
  240.     {
  241.         if (m_Ptr  &&  m_Owner) {
  242.             Del::Delete(release());
  243.         }
  244.         m_Ptr   = p;
  245.         m_Owner = true;
  246.     }
  247. private:
  248.     X* m_Ptr;                       ///< Internal pointer representation.
  249.     mutable bool m_Owner;
  250.     /// Release for const object.
  251.     X* x_Release(void) const
  252.     {
  253.         return const_cast<AutoPtr<X, Del>*>(this)->release();
  254.     }
  255. };
  256. // "min" and "max" templates
  257. //
  258. #if defined(HAVE_NO_MINMAX_TEMPLATE)
  259. #  define NOMINMAX
  260. #  ifdef min
  261. #    undef min
  262. #  endif
  263. #  ifdef max
  264. #    undef max
  265. #  endif
  266. /// Min function template.
  267. template <class T>
  268. inline
  269. const T& min(const T& a, const T& b) {
  270.     return b < a ? b : a;
  271. }
  272. /// Max function template.
  273. template <class T>
  274. inline
  275. const T& max(const T& a, const T& b) {
  276.     return  a < b ? b : a;
  277. }
  278. #endif /* HAVE_NO_MINMAX_TEMPLATE */
  279. // strdup()
  280. //
  281. #if !defined(HAVE_STRDUP)
  282. /// Supply string duplicate function, if one is not defined.
  283. extern char* strdup(const char* str);
  284. #endif
  285. //  ITERATE
  286. //  NON_CONST_ITERATE
  287. //
  288. // Useful macro to write 'for' statements with the STL container iterator as
  289. // a variable.
  290. //
  291. /// iterate macro to sequence through container elements.
  292. ///
  293. /// This version is deprecated. Use equivalent ITERATE instead.
  294. /// @sa
  295. ///   ITERATE
  296. #define iterate(Type, Var, Cont) 
  297.     for ( Type::const_iterator Var = (Cont).begin(), NCBI_NAME2(Var,_end) = (Cont).end();  Var != NCBI_NAME2(Var,_end);  ++Var )
  298. /// Non constant version of iterate macro.
  299. #define non_const_iterate(Type, Var, Cont) 
  300.     for ( Type::iterator Var = (Cont).begin();  Var != (Cont).end();  ++Var )
  301. /// ITERATE macro to sequence through container elements.
  302. ///
  303. /// This upper case style is prefered over the "iterate" macro.
  304. /// @sa
  305. ///   iterate
  306. #define ITERATE(Type, Var, Cont) 
  307.     for ( Type::const_iterator Var = (Cont).begin(), NCBI_NAME2(Var,_end) = (Cont).end();  Var != NCBI_NAME2(Var,_end);  ++Var )
  308. /// Non constant version of iterate macro.
  309. ///
  310. /// This upper case style is prefered over the "non_const_iterate" macro.
  311. /// @sa
  312. ///   non_const_iterate
  313. #define NON_CONST_ITERATE(Type, Var, Cont) 
  314.     for ( Type::iterator Var = (Cont).begin();  Var != (Cont).end();  ++Var )
  315. #if defined(NCBI_OS_MSWIN)  &&  !defined(Beep)
  316. /// Avoid a silly name clash between MS-Win and C Toolkit headers.
  317. #  define Beep Beep
  318. #endif
  319. /// Type for sequence locations and lengths.
  320. ///
  321. /// Use this typedef rather than its expansion, which may change.
  322. typedef unsigned int TSeqPos;
  323. /// Define special value for invalid sequence position.
  324. const TSeqPos kInvalidSeqPos = ((TSeqPos) (-1));
  325. /// Type for signed sequence position.
  326. ///
  327. /// Use this type when and only when negative values are a possibility
  328. /// for reporting differences between positions, or for error reporting --
  329. /// though exceptions are generally better for error reporting.
  330. /// Use this typedef rather than its expansion, which may change.
  331. typedef int TSignedSeqPos;
  332. /// Helper address class
  333. class CRawPointer
  334. {
  335. public:
  336.     /// add offset to object reference (to get object's member)
  337.     static void* Add(void* object, ssize_t offset);
  338.     static const void* Add(const void* object, ssize_t offset);
  339.     /// calculate offset inside object
  340.     static ssize_t Sub(const void* first, const void* second);
  341. };
  342. inline
  343. void* CRawPointer::Add(void* object, ssize_t offset)
  344. {
  345.     return static_cast<char*> (object) + offset;
  346. }
  347. inline
  348. const void* CRawPointer::Add(const void* object, ssize_t offset)
  349. {
  350.     return static_cast<const char*> (object) + offset;
  351. }
  352. inline
  353. ssize_t CRawPointer::Sub(const void* first, const void* second)
  354. {
  355.     return
  356.         static_cast<const char*> (first) - static_cast<const char*> (second);
  357. }
  358. END_NCBI_SCOPE
  359. /* @} */
  360. /*
  361.  * ===========================================================================
  362.  * $Log: ncbimisc.hpp,v $
  363.  * Revision 1000.2  2004/02/12 21:45:03  gouriano
  364.  * PRODUCTION: UPGRADED [CORE_001] Dev-tree R1.71
  365.  *
  366.  * Revision 1.71  2004/01/20 17:10:08  ivanov
  367.  * Rollback previous commit
  368.  *
  369.  * Revision 1.70  2004/01/20 17:06:42  ivanov
  370.  * Added #include <ncbiconf.h>
  371.  *
  372.  * Revision 1.69  2003/12/01 20:44:46  ucko
  373.  * +<sys/types.h> on Unix for ssize_t
  374.  *
  375.  * Revision 1.68  2003/12/01 19:04:20  grichenk
  376.  * Moved Add and Sub from serialutil to ncbimisc, made them methods
  377.  * of CRawPointer class.
  378.  *
  379.  * Revision 1.67  2003/10/02 17:43:43  vakatov
  380.  * The code extracted from NCBISTD.HPP. -- The latter is a "pure virtual"
  381.  * header now.
  382.  *
  383.  * Revision 1.66  2003/09/17 15:17:30  vasilche
  384.  * Fixed self references in template class AutoPtr.
  385.  *
  386.  * Revision 1.65  2003/08/14 12:48:18  siyan
  387.  * Documentation changes.
  388.  *
  389.  * Revision 1.64  2003/04/21 14:31:12  kuznets
  390.  * lower case iterate returned back to the header
  391.  *
  392.  * Revision 1.63  2003/04/18 18:10:08  kuznets
  393.  * + enum ENullable
  394.  *
  395.  * Revision 1.62  2003/03/10 17:43:45  kuznets
  396.  * iterate -> ITERATE cleanup
  397.  *
  398.  * Revision 1.61  2003/02/04 18:15:54  gouriano
  399.  * removed reference to ncbifloat.h
  400.  *
  401.  * Revision 1.60  2003/02/04 17:02:53  gouriano
  402.  * added reference to ncbifloat.h
  403.  *
  404.  * Revision 1.59  2002/09/19 22:17:11  vakatov
  405.  * + kInvalidSeqPos
  406.  *
  407.  * Revision 1.58  2002/08/12 14:57:52  lavr
  408.  * +EOwnership
  409.  *
  410.  * Revision 1.57  2002/07/11 14:17:55  gouriano
  411.  * exceptions replaced by CNcbiException-type ones
  412.  *
  413.  * Revision 1.56  2002/05/03 21:27:59  ucko
  414.  * Introduce T(Signed)SeqPos.
  415.  *
  416.  * Revision 1.55  2002/04/11 20:39:19  ivanov
  417.  * CVS log moved to end of the file
  418.  *
  419.  * Revision 1.54  2001/05/30 16:04:22  vakatov
  420.  * AutoPtr::  -- do not make it owner if the source AutoPtr object was not
  421.  * an owner (for copy-constructor and operator=).
  422.  *
  423.  * Revision 1.53  2001/05/17 14:54:12  lavr
  424.  * Typos corrected
  425.  *
  426.  * Revision 1.52  2001/04/13 02:52:34  vakatov
  427.  * Rollback to R1.50.  It is premature to check for #HAVE_NCBI_C until
  428.  * we can configure it on MS-Windows...
  429.  *
  430.  * Revision 1.51  2001/04/12 22:53:00  vakatov
  431.  * Apply fix R1.50 only #if HAVE_NCBI_C
  432.  *
  433.  * Revision 1.50  2001/03/16 02:20:40  vakatov
  434.  * [MSWIN]  Avoid the "Beep()" clash between MS-Win and C Toolkit headers
  435.  *
  436.  * Revision 1.49  2001/02/22 00:09:28  vakatov
  437.  * non_const_iterate() -- added parenthesis around the "Cont" arg
  438.  *
  439.  * Revision 1.48  2000/12/24 00:01:48  vakatov
  440.  * Moved some code from NCBIUTIL to NCBISTD.
  441.  * Fixed AutoPtr to always work with assoc.containers
  442.  *
  443.  * Revision 1.46  2000/12/15 15:36:30  vasilche
  444.  * Added header corelib/ncbistr.hpp for all string utility functions.
  445.  * Optimized string utility functions.
  446.  * Added assignment operator to CRef<> and CConstRef<>.
  447.  * Add Upcase() and Locase() methods for automatic conversion.
  448.  *
  449.  * Revision 1.45  2000/12/12 14:20:14  vasilche
  450.  * Added operator bool to CArgValue.
  451.  * Added standard typedef element_type to CRef<> and CConstRef<>.
  452.  * Macro iterate() now calls method end() only once and uses temporary variable
  453.  * Various NStr::Compare() methods made faster.
  454.  * Added class Upcase for printing strings to ostream with automatic conversion
  455.  *
  456.  * Revision 1.44  2000/12/11 20:42:48  vakatov
  457.  * + NStr::PrintableString()
  458.  *
  459.  * Revision 1.43  2000/11/07 04:07:19  vakatov
  460.  * kEmptyCStr, kEmptyStr (equiv. to NcbiEmptyCStr,NcbiEmptyString)
  461.  *
  462.  * Revision 1.42  2000/10/05 20:01:10  vakatov
  463.  * auto_ptr -- no "const" in constructor and assignment
  464.  *
  465.  * Revision 1.41  2000/08/03 20:21:10  golikov
  466.  * Added predicate PCase for AStrEquiv
  467.  * PNocase, PCase goes through NStr::Compare now
  468.  *
  469.  * Revision 1.40  2000/07/19 19:03:52  vakatov
  470.  * StringToBool() -- short and case-insensitive versions of "true"/"false"
  471.  * ToUpper/ToLower(string&) -- fixed
  472.  *
  473.  * Revision 1.39  2000/04/17 19:30:12  vakatov
  474.  * Allowed case-insensitive comparison for StartsWith() and EndsWith()
  475.  *
  476.  * Revision 1.38  2000/04/17 04:14:20  vakatov
  477.  * NStr::  extended Compare(), and allow case-insensitive string comparison
  478.  * NStr::  added ToLower() and ToUpper()
  479.  *
  480.  * Revision 1.37  2000/04/04 22:28:06  vakatov
  481.  * NStr::  added conversions for "long"
  482.  *
  483.  * Revision 1.36  2000/02/17 20:00:24  vasilche
  484.  * Added EResetVariant enum for serialization package.
  485.  *
  486.  * Revision 1.35  2000/01/20 16:24:20  vakatov
  487.  * Kludging around the "NcbiEmptyString" to ensure its initialization when
  488.  * it is used by the constructor of a statically allocated object
  489.  * (I believe that it is actually just another Sun WorkShop compiler "feature")
  490.  *
  491.  * Revision 1.34  1999/12/28 19:04:22  vakatov
  492.  * #HAVE_NO_MINMAX_TEMPLATE
  493.  *
  494.  * Revision 1.33  1999/12/28 18:55:25  vasilche
  495.  * Reduced size of compiled object files:
  496.  * 1. avoid inline or implicit virtual methods (especially destructors).
  497.  * 2. avoid std::string's methods usage in inline methods.
  498.  * 3. avoid string literals ("xxx") in inline methods.
  499.  *
  500.  * Revision 1.32  1999/12/17 19:04:06  vasilche
  501.  * NcbiEmptyString made extern.
  502.  *
  503.  * Revision 1.31  1999/12/03 21:36:45  vasilche
  504.  * Added forward decaration of CEnumeratedTypeValues
  505.  *
  506.  * Revision 1.30  1999/11/26 18:45:08  golikov
  507.  * NStr::Replace added
  508.  *
  509.  * Revision 1.29  1999/11/17 22:05:02  vakatov
  510.  * [!HAVE_STRDUP]  Emulate "strdup()" -- it's missing on some platforms
  511.  *
  512.  * Revision 1.28  1999/10/26 18:10:24  vakatov
  513.  * [auto_ptr] -- simpler and more standard
  514.  *
  515.  * Revision 1.27  1999/09/29 22:22:37  vakatov
  516.  * [auto_ptr] Use "mutable" rather than "static_cast" on m_Owns; fixed a
  517.  *            double "delete" bug in reset().
  518.  *
  519.  * Revision 1.26  1999/09/14 18:49:40  vasilche
  520.  * Added forward declaration of CTypeInfo class.
  521.  *
  522.  * Revision 1.25  1999/07/08 14:44:52  vakatov
  523.  * Tiny fix in EndsWith()
  524.  *
  525.  * Revision 1.24  1999/07/06 15:21:04  vakatov
  526.  * + NStr::TruncateSpaces(const string& str, ETrunc where=eTrunc_Both)
  527.  *
  528.  * Revision 1.23  1999/06/21 15:59:40  vakatov
  529.  * [auto_ptr] -- closer to standard:  added an ownership and
  530.  * initialization/assignment with "auto_ptr<>&", made "release()" be "const"
  531.  *
  532.  * Revision 1.22  1999/06/15 20:50:03  vakatov
  533.  * NStr::  +BoolToString, +StringToBool
  534.  *
  535.  * Revision 1.21  1999/05/28 20:12:29  vakatov
  536.  * [HAVE_NO_AUTO_PTR]  Prohibit "operator=" in the home-made "auto_ptr::"
  537.  *
  538.  * Revision 1.20  1999/04/16 17:45:31  vakatov
  539.  * [MSVC++] Replace the <windef.h>'s min/max macros by the hand-made templates.
  540.  *
  541.  * Revision 1.19  1999/04/15 21:56:47  vakatov
  542.  * Introduced NcbiMin/NcbiMax to workaround some portability issues with
  543.  * the standard "min/max"
  544.  *
  545.  * Revision 1.18  1999/04/14 21:20:31  vakatov
  546.  * Dont use "snprintf()" as it is not quite portable yet
  547.  *
  548.  * Revision 1.17  1999/04/14 19:46:01  vakatov
  549.  * Fixed for the features:
  550.  *    { NCBI_OBSOLETE_STR_COMPARE, HAVE_NO_AUTO_PTR, HAVE_NO_SNPRINTF }
  551.  *
  552.  * Revision 1.16  1999/04/09 19:51:36  sandomir
  553.  * minor changes in NStr::StringToXXX - base added
  554.  *
  555.  * Revision 1.15  1999/01/21 16:18:04  sandomir
  556.  * minor changes due to NStr namespace to contain string utility functions
  557.  *
  558.  * Revision 1.14  1999/01/11 22:05:45  vasilche
  559.  * Fixed CHTML_font size.
  560.  * Added CHTML_image input element.
  561.  *
  562.  * Revision 1.13  1998/12/28 17:56:29  vakatov
  563.  * New CVS and development tree structure for the NCBI C++ projects
  564.  *
  565.  * Revision 1.12  1998/12/21 17:19:36  sandomir
  566.  * VC++ fixes in ncbistd; minor fixes in Resource
  567.  *
  568.  * Revision 1.11  1998/12/17 21:50:43  sandomir
  569.  * CNCBINode fixed in Resource; case insensitive string comparison predicate
  570.  * added
  571.  *
  572.  * Revision 1.10  1998/12/15 17:38:16  vasilche
  573.  * Added conversion functions string <> int.
  574.  *
  575.  * Revision 1.9  1998/12/04 23:36:30  vakatov
  576.  * + NcbiEmptyCStr and NcbiEmptyString (const)
  577.  *
  578.  * Revision 1.8  1998/11/06 22:42:38  vakatov
  579.  * Introduced BEGIN_, END_ and USING_ NCBI_SCOPE macros to put NCBI C++
  580.  * API to namespace "ncbi::" and to use it by default, respectively
  581.  * Introduced THROWS_NONE and THROWS(x) macros for the exception
  582.  * specifications
  583.  * Other fixes and rearrangements throughout the most of "corelib" code
  584.  *
  585.  * ==========================================================================
  586.  */
  587. #endif  /* CORELIB___NCBIMISC__HPP */