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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbiobj.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/13 19:57:54  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.56
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CORELIB___NCBIOBJ__HPP
  10. #define CORELIB___NCBIOBJ__HPP
  11. /*  $Id: ncbiobj.hpp,v 1000.1 2004/04/13 19:57:54 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:  Eugene Vasilchenko
  37.  *
  38.  *
  39.  */
  40. /// @file ncbiobj.hpp
  41. /// Portable reference counted smart pointers using CRef and CObject.
  42. #include <corelib/ncbistd.hpp>
  43. #include <corelib/ncbicntr.hpp>
  44. #include <corelib/ncbiatomic.hpp>
  45. #include <corelib/ddumpable.hpp>
  46. /** @addtogroup Object
  47.  *
  48.  * @{
  49.  */
  50. BEGIN_NCBI_SCOPE
  51. /// Define "null" pointer value.
  52. enum ENull {
  53.     null = 0
  54. };
  55. /////////////////////////////////////////////////////////////////////////////
  56. ///
  57. /// CObjectException --
  58. ///
  59. /// Define exceptions generated by CObject.
  60. ///
  61. /// CObjectException inherits its basic functionality from CCoreException
  62. /// and defines additional error codes.
  63. class NCBI_XNCBI_EXPORT CObjectException : public CCoreException
  64. {
  65. public:
  66.     /// Error types that an application can generate.
  67.     enum EErrCode {
  68.         eRefDelete,     ///< Attempt to delete valid reference
  69.         eDeleted,       ///< Attempt to delete a deleted object
  70.         eCorrupted,     ///< Object corrupted error
  71.         eRefOverflow,   ///< Reference overflow error
  72.         eNoRef,         ///< Attempt to access an object that is unreferenced
  73.         eRefUnref       ///< Attempt to make a referenced object an
  74.                         ///< unreferenced one
  75.     };
  76.     /// Translate from the error code value to its string representation.
  77.     virtual const char* GetErrCodeString(void) const
  78.     {
  79.         switch (GetErrCode()) {
  80.         case eRefDelete:    return "eRefDelete";
  81.         case eDeleted:      return "eDeleted";
  82.         case eCorrupted:    return "eCorrupted";
  83.         case eRefOverflow:  return "eRefOverflow";
  84.         case eNoRef:        return "eNoRef";
  85.         case eRefUnref:     return "eRefUnref";
  86.         default:    return CException::GetErrCodeString();
  87.         }
  88.     }
  89.     // Standard exception boilerplate code.
  90.     NCBI_EXCEPTION_DEFAULT(CObjectException, CCoreException);
  91. protected:
  92.     void x_InitErrCode(CException::EErrCode err_code);
  93. };
  94. /////////////////////////////////////////////////////////////////////////////
  95. ///
  96. /// CObject --
  97. ///
  98. /// Define the CObject which stores the reference count and the object.
  99. ///
  100. /// CObject inherits from CDebugDumpable the ability to "dump" diagnostic
  101. /// information useful for debugging.
  102. class CObject : public CDebugDumpable
  103. {
  104. public:
  105.     /// Constructor.
  106.     NCBI_XNCBI_EXPORT
  107.     CObject(void);
  108.     /// Copy constructor.
  109.     NCBI_XNCBI_EXPORT
  110.     CObject(const CObject& src);
  111.     /// Destructor.
  112.     NCBI_XNCBI_EXPORT
  113.     virtual ~CObject(void);
  114.     /// Assignment operator.
  115.     CObject& operator=(const CObject& src) THROWS_NONE;
  116.     /// Check if object can be deleted.
  117.     bool CanBeDeleted(void) const THROWS_NONE;
  118.     /// Check if object is referenced.
  119.     bool Referenced(void) const THROWS_NONE;
  120.     /// Check if object is referenced only once.
  121.     bool ReferencedOnlyOnce(void) const THROWS_NONE;
  122.     /// Add reference to object.
  123.     void AddReference(void) const;
  124.     /// Remove reference to object.
  125.     void RemoveReference(void) const;
  126.     /// Remove reference without deleting object.
  127.     NCBI_XNCBI_EXPORT
  128.     void ReleaseReference(void) const;
  129.     /// Mark this object as not allocated in heap --  do not delete this
  130.     /// object.
  131.     NCBI_XNCBI_EXPORT
  132.     virtual void DoNotDeleteThisObject(void);
  133.     /// Mark this object as allocated in heap -- object can be deleted.
  134.     NCBI_XNCBI_EXPORT
  135.     virtual void DoDeleteThisObject(void);
  136.     // operators new/delete for additional checking in debug mode
  137.     /// Define new operator for memory allocation.
  138.     NCBI_XNCBI_EXPORT
  139.     void* operator new(size_t size);
  140.     /// Define new[] operator for 'array' memory allocation.
  141.     NCBI_XNCBI_EXPORT
  142.     void* operator new[](size_t size);
  143.     /// Define delete operator for memory deallocation.
  144.     NCBI_XNCBI_EXPORT
  145.     void operator delete(void* ptr);
  146.     /// Define delete[] operator for memory deallocation.
  147.     NCBI_XNCBI_EXPORT
  148.     void operator delete[](void* ptr);
  149.     /// Define new operator.
  150.     NCBI_XNCBI_EXPORT
  151.     void* operator new(size_t size, void* place);
  152.     /// Define delete operator.
  153.     NCBI_XNCBI_EXPORT
  154.     void operator delete(void* ptr, void* place);
  155.     /// Define method for dumping debug information.
  156.     NCBI_XNCBI_EXPORT
  157.     virtual void DebugDump(CDebugDumpContext ddc, unsigned int depth) const;
  158.     /// Define method to throw null pointer exception.
  159.     ///
  160.     /// Static method through which all CRef<> / CConstRef<> null pointer
  161.     /// throws travel.  This is done to avoid an inline throw.
  162.     NCBI_XNCBI_EXPORT
  163.     static void ThrowNullPointerException(void);
  164. private:
  165.     typedef CAtomicCounter   TCounter;  ///< Counter type is CAtomiCounter
  166.     typedef TCounter::TValue TCount;    ///< Alias for value type of counter
  167.     /// Define possible object states.
  168.     /// 
  169.     /// When TCounter is signed, all valid values start with 01;
  170.     /// when it is unsigned, they start with 1. In other words, when
  171.     /// TCounter is signed, the msb (most significant bit) is 0, and the bit
  172.     /// after that is a 1; and if the counter is unsigned, then the msb is 1.
  173.     ///
  174.     /// Least significant bit is the "heap" bit and the most significant bit
  175.     /// (or the one after it) is the "valid" bit.
  176.     ///
  177.     /// The following bit positions have special signifcance:
  178.     /// - Least significant bit = 0 means object not in heap.
  179.     /// - Least significant bit = 1 means object in heap.
  180.     /// - Most significant bit (or one after it) = 0 means object not valid
  181.     /// - Most significant bit (or one after it) = 1 means object is valid 
  182.     ///
  183.     /// Possible bit patterns:
  184.     /// - [0]0x...xxx : non valid object -> cannot be referenced.
  185.     /// - [0]1c...cc0 : object not in heap -> cannot be referenced.
  186.     /// - [0]1c...cc1 : object in heap -> can be referenced.
  187.     enum EObjectState {
  188.         eStateBitsInHeap  = 1 << 0,
  189. #ifdef NCBI_COUNTER_UNSIGNED
  190.         eStateBitsValid   = (unsigned int)(1 << (sizeof(TCount) * 8 - 1)),
  191.             ///< 1 in the left most of the valid bits -- unsigned case
  192. #else
  193.         eStateBitsValid   = (unsigned int)(1 << (sizeof(TCount) * 8 - 2)),
  194.             ///< 1 in the left most of the valid bits -- signed case
  195. #endif
  196.         eStateMask        = eStateBitsValid | eStateBitsInHeap,
  197.             ///< Valid object, and object in heap. 
  198.         eCounterStep      = 1 << 1, 
  199.             ///< Shift one bit left over the "heap" bit
  200.         eCounterNotInHeap = eStateBitsValid,
  201.             ///< Mask for testing if counter is for valid object, not in heap
  202.         eCounterInHeap    = eStateBitsValid | eStateBitsInHeap,
  203.             ///< Mask for testing if counter is for valid object, in heap
  204.         eCounterValid     = eStateBitsValid,
  205.             ///< Mask for testing if counter is for a valid object
  206.         eSpecialValueMask = (unsigned int)eStateBitsValid -
  207.                             (unsigned int)eCounterStep,
  208.             ///< Special mask value: lsb two bits 0, and msb (or one bit after)
  209.             ///< is 0 and all other bits are 1
  210.         eCounterDeleted   = (unsigned int)(0x5b4d9f34 & eSpecialValueMask),
  211.             ///< Mask for testing if counter is for a deleted object
  212.         eCounterNew       = (unsigned int)(0x3423cb13 & eSpecialValueMask)
  213.             ///< Mask for testing if counter is for a new object
  214.     };
  215.     // special methods for parsing object state number
  216.     /// Check if object state is valid.
  217.     static bool ObjectStateValid(TCount count);
  218.     /// Check if object can be deleted.
  219.     static bool ObjectStateCanBeDeleted(TCount count);
  220.     /// Check if object can be referenced.
  221.     static bool ObjectStateReferenced(TCount count);
  222.     /// Check if object can be double referenced.
  223.     static bool ObjectStateDoubleReferenced(TCount count);
  224.     /// Check if object can be referenced only once.
  225.     static bool ObjectStateReferencedOnlyOnce(TCount count);
  226.     /// Initialize counter. 
  227.     void InitCounter(void);
  228.     /// Remove the last reference.
  229.     NCBI_XNCBI_EXPORT
  230.     void RemoveLastReference(void) const;
  231.     // report different kinds of error
  232.     /// Report object is invalid.
  233.     ///
  234.     /// Example: Attempt to use a deleted object.
  235.     void InvalidObject(void) const;
  236.     /// Report that counter has overflowed.
  237.     NCBI_XNCBI_EXPORT
  238.     void CheckReferenceOverflow(TCount count) const;
  239.     mutable TCounter  m_Counter;  ///< The actual reference counter
  240. };
  241. /////////////////////////////////////////////////////////////////////////////
  242. ///
  243. /// CRefBase --
  244. ///
  245. /// Define a template class for adding, removing, and releasing references.
  246. template<class C>
  247. class CRefBase
  248. {
  249. public:
  250.     /// Add reference to specified object.
  251.     static
  252.     void AddReference(const C* object)
  253.         {
  254.             object->AddReference();
  255.         }
  256.     /// Remove reference from specified object.
  257.     static
  258.     void RemoveReference(const C* object)
  259.         {
  260.             object->RemoveReference();
  261.         }
  262.     
  263.     /// Release reference from specified object.
  264.     static
  265.     void ReleaseReference(const C* object)
  266.         {
  267.             object->ReleaseReference();
  268.         }
  269. };
  270. /////////////////////////////////////////////////////////////////////////////
  271. ///
  272. /// CRef --
  273. ///
  274. /// Define a template class that stores a pointer to an object and defines
  275. /// methods for referencing that object.
  276. template<class C>
  277. class CRef {
  278. public:
  279.     typedef C element_type;             ///< Define alias element_type
  280.     typedef element_type TObjectType;   ///< Define alias TObjectType
  281.     /// Constructor for null pointer.
  282.     inline
  283.     CRef(void) THROWS_NONE
  284.         : m_Ptr(0)
  285.         {
  286.         }
  287.     /// Constructor for ENull pointer.
  288.     inline
  289.     CRef(ENull /*null*/) THROWS_NONE
  290.         : m_Ptr(0)
  291.         {
  292.         }
  293.     /// Constructor for explicit type conversion from pointer to object.
  294.     explicit CRef(TObjectType* ptr)
  295.         {
  296.             if ( ptr )
  297.                 CRefBase<C>::AddReference(ptr);
  298.             m_Ptr = ptr;
  299.         }
  300.     /// Copy constructor from an existing CRef object, 
  301.     CRef(const CRef<C>& ref)
  302.         {
  303.             TObjectType* ptr = ref.m_Ptr;
  304.             if ( ptr )
  305.                 CRefBase<C>::AddReference(ptr);
  306.             m_Ptr = ptr;
  307.         }
  308.     /// Destructor.
  309.     ~CRef(void)
  310.         {
  311.             TObjectType* ptr = m_Ptr;
  312.             if ( ptr )
  313.                 CRefBase<C>::RemoveReference(ptr);
  314.         }
  315.     
  316.     /// Check if CRef is empty -- not pointing to any object, which means
  317.     /// having a null value. 
  318.     ///
  319.     /// @sa
  320.     ///   IsNull()
  321.     bool Empty(void) const THROWS_NONE
  322.         {
  323.             return m_Ptr == 0;
  324.         }
  325.     /// Check if CRef is not empty -- pointing to an object and has
  326.     /// a non-null value. 
  327.     bool NotEmpty(void) const THROWS_NONE
  328.         {
  329.             return m_Ptr != 0;
  330.         }
  331.     /// Check if pointer is null -- same affect as Empty().
  332.     ///
  333.     /// @sa
  334.     ///   Empty()
  335.     bool IsNull(void) const THROWS_NONE
  336.         {
  337.             return m_Ptr == 0;
  338.         }
  339.     /// Operator to test object.
  340.     ///
  341.     /// @return
  342.     ///   TRUE if there is a pointer to object; FALSE, otherwise.
  343.     operator bool(void) THROWS_NONE
  344.         {
  345.             return NotEmpty();
  346.         }
  347.     /// Operator to test object -- const version.
  348.     ///
  349.     /// @return
  350.     ///   TRUE if there is a pointer to object; FALSE, otherwise.
  351.     operator bool(void) const THROWS_NONE
  352.         {
  353.             return NotEmpty();
  354.         }
  355.     /// Operator to test object.
  356.     ///
  357.     /// @return
  358.     ///   TRUE if there is a null pointer to object; FALSE, otherwise.
  359.     bool operator!(void) const THROWS_NONE
  360.         {
  361.             return Empty();
  362.         }
  363.     /// Reset reference object.
  364.     ///
  365.     /// This sets the pointer to object to null, and removes reference
  366.     /// count to object and deletes the object if this is the last reference
  367.     /// to the object.
  368.     /// @sa
  369.     ///   Reset(TObjectType*)
  370.     inline
  371.     void Reset(void)
  372.         {
  373.             TObjectType* ptr = m_Ptr;
  374.             if ( ptr ) {
  375.                 m_Ptr = 0;
  376.                 CRefBase<C>::RemoveReference(ptr);
  377.             }
  378.         }
  379.     /// Reset reference object to new pointer.
  380.     ///
  381.     /// This sets the pointer to object to the new pointer, and removes
  382.     /// reference count to old object and deletes the old object if this is
  383.     /// the last reference to the old object.
  384.     /// @sa
  385.     ///   Reset()
  386.     inline
  387.     void Reset(TObjectType* newPtr)
  388.         {
  389.             TObjectType* oldPtr = m_Ptr;
  390.             if ( newPtr != oldPtr ) {
  391.                 if ( newPtr )
  392.                     CRefBase<C>::AddReference(newPtr);
  393.                 m_Ptr = newPtr;
  394.                 if ( oldPtr )
  395.                     CRefBase<C>::RemoveReference(oldPtr);
  396.             }
  397.         }
  398.     /// Release a reference to the object and return a pointer to the object.
  399.     ///
  400.     /// Releasing a reference means decreasing the reference count by "1". A
  401.     /// pointer to the existing object is returned, unless this pointer is
  402.     /// already null(0), in which case a null(0) is returned.
  403.     ///
  404.     /// Similar to Release(), except that this method returns a null,
  405.     /// whereas Release() throws a null pointer exception.
  406.     ///
  407.     /// @sa
  408.     ///   Release()
  409.     inline
  410.     TObjectType* ReleaseOrNull(void)
  411.         {
  412.             TObjectType* ptr = m_Ptr;
  413.             if ( !ptr )
  414.                 return 0;
  415.             m_Ptr = 0;
  416.             CRefBase<C>::ReleaseReference(ptr);
  417.             return ptr;
  418.         }
  419.     /// Release a reference to the object and return a pointer to the object.
  420.     ///
  421.     /// Releasing a reference means decreasing the reference count by "1". A
  422.     /// pointer to the existing object is returned, unless this pointer is
  423.     /// already null(0), in which the null pointer exception (eNullPtr) is
  424.     /// thrown.
  425.     ///
  426.     /// Similar to ReleaseOrNull(), except that this method throws an exception
  427.     /// whereas ReleaseOrNull() does not.
  428.     ///
  429.     /// @sa
  430.     ///   ReleaseOrNull()
  431.     inline
  432.     TObjectType* Release(void)
  433.         {
  434.             TObjectType* ptr = m_Ptr;
  435.             if ( !ptr ) {
  436.                 CObject::ThrowNullPointerException();
  437.             }
  438.             m_Ptr = 0;
  439.             CRefBase<C>::ReleaseReference(ptr);
  440.             return ptr;
  441.         }
  442.     /// Reset reference object to new pointer.
  443.     ///
  444.     /// This sets the pointer to object to the new pointer, and removes
  445.     /// reference count to old object and deletes the old object if this is
  446.     /// the last reference to the old object.
  447.     /// The new pointer is got from ref argument.
  448.     /// Operation is atomic on this object, so that AtomicResetFrom() and
  449.     /// AtomicReleaseTo() called from different threads will work properly.
  450.     /// Operation is not atomic on ref argument.
  451.     /// @sa
  452.     ///   AtomicReleaseTo(CRef& ref);
  453.     inline
  454.     void AtomicResetFrom(const CRef& ref)
  455.         {
  456.             TObjectType* ptr = ref.m_Ptr;
  457.             if ( ptr )
  458.                 CRefBase<C>::AddReference(ptr); // for this
  459.             TObjectType* old_ptr = AtomicSwap(ptr);
  460.             if ( old_ptr )
  461.                 CRefBase<C>::RemoveReference(old_ptr);
  462.         }
  463.     /// Release referenced object to another CRef<> object.
  464.     ///
  465.     /// This copies the pointer to object to the argument ref,
  466.     /// and release reference from this object.
  467.     /// Old reference object held by argument ref is released and deleted if
  468.     /// necessary.
  469.     /// Operation is atomic on this object, so that AtomicResetFrom() and
  470.     /// AtomicReleaseTo() called from different threads will work properly.
  471.     /// Operation is not atomic on ref argument.
  472.     /// @sa
  473.     ///   AtomicResetFrom(const CRef& ref);
  474.     inline
  475.     void AtomicReleaseTo(CRef& ref)
  476.         {
  477.             TObjectType* old_ptr = AtomicSwap(0);
  478.             if ( old_ptr ) {
  479.                 ref.Reset(old_ptr);
  480.                 CRefBase<C>::RemoveReference(old_ptr);
  481.             }
  482.             else {
  483.                 ref.Reset();
  484.             }
  485.         }
  486.     /// Assignment operator for references.
  487.     CRef<C>& operator=(const CRef<C>& ref)
  488.         {
  489.             Reset(ref.m_Ptr);
  490.             return *this;
  491.         }
  492.     /// Assignment operator for references with right hand side set to
  493.     /// a pointer.
  494.     CRef<C>& operator=(TObjectType* ptr)
  495.         {
  496.             Reset(ptr);
  497.             return *this;
  498.         }
  499.     /// Assignment operator with right hand side set to ENull.
  500.     CRef<C>& operator=(ENull /*null*/)
  501.         {
  502.             Reset(0);
  503.             return *this;
  504.         }
  505.     /// Get pointer value and throw a null pointer exception if pointer
  506.     /// is null.
  507.     ///
  508.     /// Similar to GetPointerOrNull() except that this method throws a null
  509.     /// pointer exception if pointer is null, whereas GetPointerOrNull()
  510.     /// returns a null value.
  511.     ///
  512.     /// @sa
  513.     ///   GetPointerOrNull(), GetPointer(), GetObject()
  514.     inline
  515.     TObjectType* GetNonNullPointer(void)
  516.         {
  517.             TObjectType* ptr = m_Ptr;
  518.             if ( !ptr ) {
  519.                 CObject::ThrowNullPointerException();
  520.             }
  521.             return ptr;
  522.         }
  523.     /// Get pointer value.
  524.     ///
  525.     /// Similar to GetNonNullPointer() except that this method returns a null
  526.     /// if the pointer is null, whereas GetNonNullPointer() throws a null
  527.     /// pointer exception.
  528.     ///
  529.     /// @sa
  530.     ///   GetNonNullPointer()
  531.     inline
  532.     TObjectType* GetPointerOrNull(void) THROWS_NONE
  533.         {
  534.             return m_Ptr;
  535.         }
  536.     /// Get pointer,
  537.     ///
  538.     /// Same as GetPointerOrNull().
  539.     ///
  540.     /// @sa
  541.     ///   GetPointerOrNull()
  542.     inline
  543.     TObjectType* GetPointer(void) THROWS_NONE
  544.         {
  545.             return GetPointerOrNull();
  546.         }
  547.     /// Get object.
  548.     ///
  549.     /// Similar to GetNonNullPointer(), except that this method returns the
  550.     /// object whereas GetNonNullPointer() returns a pointer to the object.
  551.     /// 
  552.     /// @sa
  553.     ///   GetNonNullPointer()
  554.     inline
  555.     TObjectType& GetObject(void)
  556.         {
  557.             return *GetNonNullPointer();
  558.         }
  559.     /// Dereference operator returning object.
  560.     ///
  561.     /// @sa
  562.     ///   GetObject()
  563.     inline
  564.     TObjectType& operator*(void)
  565.         {
  566.             return *GetNonNullPointer();
  567.         }
  568.     /// Reference operator.
  569.     ///
  570.     /// @sa
  571.     ///   GetPointer()
  572.     inline
  573.     TObjectType* operator->(void)
  574.         {
  575.             return GetNonNullPointer();
  576.         }
  577.     /// Dereference operator returning pointer.
  578.     ///
  579.     /// @sa
  580.     ///   GetPointer()
  581.     inline
  582.     operator TObjectType*(void)
  583.         {
  584.             return GetPointerOrNull();
  585.         }
  586.     // Const getters.
  587.     /// Get pointer value and throw a null pointer exception if pointer
  588.     /// is null -- constant version.
  589.     ///
  590.     /// Similar to GetPointerOrNull() except that this method throws a null
  591.     /// pointer exception if pointer is null, whereas GetPointerOrNull()
  592.     /// returns a null value.
  593.     ///
  594.     /// @sa
  595.     ///   GetPointerOrNull(), GetPointer(), GetObject()
  596.     const TObjectType* GetNonNullPointer(void) const
  597.         {
  598.             const TObjectType* ptr = m_Ptr;
  599.             if ( !ptr ) {
  600.                 CObject::ThrowNullPointerException();
  601.             }
  602.             return ptr;
  603.         }
  604.     /// Get pointer value -- constant version.
  605.     ///
  606.     /// Similar to GetNonNullPointer() except that this method returns a null
  607.     /// if the pointer is null, whereas GetNonNullPointer() throws a null
  608.     /// pointer exception.
  609.     ///
  610.     /// @sa
  611.     ///   GetNonNullPointer()
  612.     const TObjectType* GetPointerOrNull(void) const THROWS_NONE
  613.         {
  614.             return m_Ptr;
  615.         }
  616.     /// Get pointer -- constant version,
  617.     ///
  618.     /// Same as GetPointerOrNull().
  619.     ///
  620.     /// @sa
  621.     ///   GetPointerOrNull()
  622.     inline
  623.     const TObjectType* GetPointer(void) const THROWS_NONE
  624.         {
  625.             return GetPointerOrNull();
  626.         }
  627.     /// Get object -- constant version.
  628.     ///
  629.     /// Similar to GetNonNullPointer(), except that this method returns the
  630.     /// object whereas GetNonNullPointer() returns a pointer to the object.
  631.     /// 
  632.     /// @sa
  633.     ///   GetNonNullPointer()
  634.     inline
  635.     const TObjectType& GetObject(void) const
  636.         {
  637.             return *GetNonNullPointer();
  638.         }
  639.     /// Dereference operator returning object -- constant version.
  640.     ///
  641.     /// @sa
  642.     ///   GetObject()
  643.     inline
  644.     const TObjectType& operator*(void) const
  645.         {
  646.             return *GetNonNullPointer();
  647.         }
  648.     /// Reference operator -- constant version.
  649.     ///
  650.     /// @sa
  651.     ///   GetPointer()
  652.     inline
  653.     const TObjectType* operator->(void) const
  654.         {
  655.             return GetNonNullPointer();
  656.         }
  657.     /// Dereference operator returning pointer -- constant version.
  658.     ///
  659.     /// @sa
  660.     ///   GetPointer()
  661.     inline
  662.     operator const TObjectType*(void) const
  663.         {
  664.             return GetPointerOrNull();
  665.         }
  666. private:
  667.     TObjectType* AtomicSwap(TObjectType* ptr)
  668.         {
  669.             // MIPSpro won't accept static_cast for some reason.
  670.             return reinterpret_cast<TObjectType*>
  671.                 (SwapPointers(const_cast<void*volatile*>(
  672.                                   reinterpret_cast<void**>(&m_Ptr)),
  673.                               ptr));
  674.         }
  675.     TObjectType* m_Ptr;             ///< Pointer to object
  676. };
  677. /////////////////////////////////////////////////////////////////////////////
  678. ///
  679. /// CConstRef --
  680. ///
  681. /// Define a template class that stores a pointer to an object and defines
  682. /// methods for constant referencing of object. 
  683. template<class C>
  684. class CConstRef {
  685. public:
  686.     typedef C element_type;                 ///< Define alias element_type
  687.     typedef const element_type TObjectType; ///< Define alias TObjectType
  688.     /// Constructor for null pointer.
  689.     inline
  690.     CConstRef(void) THROWS_NONE
  691.         : m_Ptr(0)
  692.         {
  693.         }
  694.     /// Constructor for ENull pointer.
  695.     inline
  696.     CConstRef(ENull /*null*/) THROWS_NONE
  697.         : m_Ptr(0)
  698.         {
  699.         }
  700.     /// Constructor for explicit type conversion from pointer to object.
  701.     explicit CConstRef(TObjectType* ptr)
  702.         {
  703.             if ( ptr )
  704.                 CRefBase<C>::AddReference(ptr);
  705.             m_Ptr = ptr;
  706.         }
  707.     /// Constructor from an existing CRef object, 
  708.     CConstRef(const CConstRef<C>& ref)
  709.         {
  710.             TObjectType* ptr = ref.m_Ptr;
  711.             if ( ptr )
  712.                 CRefBase<C>::AddReference(ptr);
  713.             m_Ptr = ptr;
  714.         }
  715.     /// Constructor from an existing CRef object, 
  716.     CConstRef(const CRef<C>& ref)
  717.         {
  718.             TObjectType* ptr = ref.GetPointerOrNull();
  719.             if ( ptr )
  720.                 CRefBase<C>::AddReference(ptr);
  721.             m_Ptr = ptr;
  722.         }
  723.     /// Destructor.
  724.     ~CConstRef(void)
  725.         {
  726.             TObjectType* ptr = m_Ptr;
  727.             if ( ptr )
  728.                 CRefBase<C>::RemoveReference(ptr);
  729.         }
  730.     
  731.     /// Check if CConstRef is empty -- not pointing to any object which means
  732.     /// having a null value. 
  733.     ///
  734.     /// @sa
  735.     ///   IsNull()
  736.     bool Empty(void) const THROWS_NONE
  737.         {
  738.             return m_Ptr == 0;
  739.         }
  740.     /// Check if CConstRef is not empty -- pointing to an object and has
  741.     /// a non-null value. 
  742.     bool NotEmpty(void) const THROWS_NONE
  743.         {
  744.             return m_Ptr != 0;
  745.         }
  746.     /// Check if pointer is null -- same affect as Empty().
  747.     ///
  748.     /// @sa
  749.     ///   Empty()
  750.     bool IsNull(void) const THROWS_NONE
  751.         {
  752.             return m_Ptr == 0;
  753.         }
  754.     /// Operator to test object.
  755.     ///
  756.     /// @return
  757.     ///   TRUE if there is a pointer to object; FALSE, otherwise.
  758.     operator bool(void) THROWS_NONE
  759.         {
  760.             return NotEmpty();
  761.         }
  762.     /// Operator to test object.
  763.     ///
  764.     /// @return
  765.     ///   TRUE if there is a pointer to object; FALSE, otherwise.
  766.     operator bool(void) const THROWS_NONE
  767.         {
  768.             return NotEmpty();
  769.         }
  770.     /// Operator to test object -- const version.
  771.     ///
  772.     /// @return
  773.     ///   TRUE if there is a null pointer to object; FALSE, otherwise.
  774.     bool operator!(void) const THROWS_NONE
  775.         {
  776.             return Empty();
  777.         }
  778.     /// Reset reference object.
  779.     ///
  780.     /// This sets the pointer to object to null, and removes reference
  781.     /// count to object and deletes the object if this is the last reference
  782.     /// to the object.
  783.     /// @sa
  784.     ///   Reset(TObjectType*)
  785.     inline
  786.     void Reset(void)
  787.         {
  788.             TObjectType* ptr = m_Ptr;
  789.             if ( ptr ) {
  790.                 m_Ptr = 0;
  791.                 CRefBase<C>::RemoveReference(ptr);
  792.             }
  793.         }
  794.     /// Reset reference object to new pointer.
  795.     ///
  796.     /// This sets the pointer to object to the new pointer, and removes
  797.     /// reference count to old object and deletes the old object if this is
  798.     /// the last reference to the old object.
  799.     /// @sa
  800.     ///   Reset()
  801.     inline
  802.     void Reset(TObjectType* newPtr)
  803.         {
  804.             TObjectType* oldPtr = m_Ptr;
  805.             if ( newPtr != oldPtr ) {
  806.                 if ( newPtr )
  807.                     CRefBase<C>::AddReference(newPtr);
  808.                 m_Ptr = newPtr;
  809.                 if ( oldPtr )
  810.                     CRefBase<C>::RemoveReference(oldPtr);
  811.             }
  812.         }
  813.     /// Release a reference to the object and return a pointer to the object.
  814.     ///
  815.     /// Releasing a reference means decreasing the reference count by "1". A
  816.     /// pointer to the existing object is returned, unless this pointer is
  817.     /// already null(0), in which case a null(0) is returned.
  818.     ///
  819.     /// Similar to Release(), except that this method returns a null,
  820.     /// whereas Release() throws a null pointer exception.
  821.     ///
  822.     /// @sa
  823.     ///   Release()
  824.     inline
  825.     TObjectType* ReleaseOrNull(void)
  826.         {
  827.             TObjectType* ptr = m_Ptr;
  828.             if ( !ptr )
  829.                 return 0;
  830.             m_Ptr = 0;
  831.             CRefBase<C>::ReleaseReference(ptr);
  832.             return ptr;
  833.         }
  834.     /// Release a reference to the object and return a pointer to the object.
  835.     ///
  836.     /// Releasing a reference means decreasing the reference count by "1". A
  837.     /// pointer to the existing object is returned, unless this pointer is
  838.     /// already null(0), in which the null pointer exception (eNullPtr) is
  839.     /// thrown.
  840.     ///
  841.     /// Similar to ReleaseOrNull(), except that this method throws an exception
  842.     /// whereas ReleaseOrNull() does not.
  843.     ///
  844.     /// @sa
  845.     ///   ReleaseOrNull()
  846.     inline
  847.     TObjectType* Release(void)
  848.         {
  849.             TObjectType* ptr = m_Ptr;
  850.             if ( !ptr ) {
  851.                 CObject::ThrowNullPointerException();
  852.             }
  853.             m_Ptr = 0;
  854.             CRefBase<C>::ReleaseReference(ptr);
  855.             return ptr;
  856.         }
  857.     /// Reset reference object to new pointer.
  858.     ///
  859.     /// This sets the pointer to object to the new pointer, and removes
  860.     /// reference count to old object and deletes the old object if this is
  861.     /// the last reference to the old object.
  862.     /// The new pointer is got from ref argument.
  863.     /// Operation is atomic on this object, so that AtomicResetFrom() and
  864.     /// AtomicReleaseTo() called from different threads will work properly.
  865.     /// Operation is not atomic on ref argument.
  866.     /// @sa
  867.     ///   AtomicReleaseTo(CConstRef& ref);
  868.     inline
  869.     void AtomicResetFrom(const CConstRef& ref)
  870.         {
  871.             TObjectType* ptr = ref.m_Ptr;
  872.             if ( ptr )
  873.                 CRefBase<C>::AddReference(ptr); // for this
  874.             TObjectType* old_ptr = AtomicSwap(ptr);
  875.             if ( old_ptr )
  876.                 CRefBase<C>::RemoveReference(old_ptr);
  877.         }
  878.     /// Release referenced object to another CConstRef<> object.
  879.     ///
  880.     /// This copies the pointer to object to the argument ref,
  881.     /// and release reference from this object.
  882.     /// Old reference object held by argument ref is released and deleted if
  883.     /// necessary.
  884.     /// Operation is atomic on this object, so that AtomicResetFrom() and
  885.     /// AtomicReleaseTo() called from different threads will work properly.
  886.     /// Operation is not atomic on ref argument.
  887.     /// @sa
  888.     ///   AtomicResetFrom(const CConstRef& ref);
  889.     inline
  890.     void AtomicReleaseTo(CConstRef& ref)
  891.         {
  892.             TObjectType* old_ptr = AtomicSwap(0);
  893.             if ( old_ptr ) {
  894.                 ref.Reset(old_ptr);
  895.                 CRefBase<C>::RemoveReference(old_ptr);
  896.             }
  897.             else {
  898.                 ref.Reset();
  899.             }
  900.         }
  901.     /// Assignment operator for const references.
  902.     CConstRef<C>& operator=(const CConstRef<C>& ref)
  903.         {
  904.             Reset(ref.m_Ptr);
  905.             return *this;
  906.         }
  907.     /// Assignment operator for assigning a reference to a const reference.
  908.     CConstRef<C>& operator=(const CRef<C>& ref)
  909.         {
  910.             Reset(ref.GetPointerOrNull());
  911.             return *this;
  912.         }
  913.     /// Assignment operator for const references with right hand side set to
  914.     /// a pointer.
  915.     CConstRef<C>& operator=(TObjectType* ptr)
  916.         {
  917.             Reset(ptr);
  918.             return *this;
  919.         }
  920.     /// Assignment operator with right hand side set to ENull.
  921.     CConstRef<C>& operator=(ENull /*null*/)
  922.         {
  923.             Reset(0);
  924.             return *this;
  925.         }
  926.     /// Get pointer value and throw a null pointer exception if pointer
  927.     /// is null.
  928.     ///
  929.     /// Similar to GetPointerOrNull() except that this method throws a null
  930.     /// pointer exception if pointer is null, whereas GetPointerOrNull()
  931.     /// returns a null value.
  932.     ///
  933.     /// @sa
  934.     ///   GetPointerOrNull(), GetPointer(), GetObject()
  935.     inline
  936.     TObjectType* GetNonNullPointer(void) const
  937.         {
  938.             TObjectType* ptr = m_Ptr;
  939.             if ( !ptr ) {
  940.                 CObject::ThrowNullPointerException();
  941.             }
  942.             return ptr;
  943.         }
  944.     /// Get pointer value.
  945.     ///
  946.     /// Similar to GetNonNullPointer() except that this method returns a null
  947.     /// if the pointer is null, whereas GetNonNullPointer() throws a null
  948.     /// pointer exception.
  949.     ///
  950.     /// @sa
  951.     ///   GetNonNullPointer()
  952.     inline
  953.     TObjectType* GetPointerOrNull(void) const THROWS_NONE
  954.         {
  955.             return m_Ptr;
  956.         }
  957.     /// Get pointer,
  958.     ///
  959.     /// Same as GetPointerOrNull().
  960.     ///
  961.     /// @sa
  962.     ///   GetPointerOrNull()
  963.     inline
  964.     TObjectType* GetPointer(void) const THROWS_NONE
  965.         {
  966.             return GetPointerOrNull();
  967.         }
  968.     /// Get object.
  969.     ///
  970.     /// Similar to GetNonNullPointer(), except that this method returns the
  971.     /// object whereas GetNonNullPointer() returns a pointer to the object.
  972.     /// 
  973.     /// @sa
  974.     ///   GetNonNullPointer()
  975.     inline
  976.     TObjectType& GetObject(void) const
  977.         {
  978.             return *GetNonNullPointer();
  979.         }
  980.     /// Dereference operator returning object.
  981.     ///
  982.     /// @sa
  983.     ///   GetObject()
  984.     inline
  985.     TObjectType& operator*(void) const
  986.         {
  987.             return *GetNonNullPointer();
  988.         }
  989.     /// Reference operator.
  990.     ///
  991.     /// @sa
  992.     ///   GetPointer()
  993.     inline
  994.     TObjectType* operator->(void) const
  995.         {
  996.             return GetNonNullPointer();
  997.         }
  998.     /// Dereference operator returning pointer.
  999.     ///
  1000.     /// @sa
  1001.     ///   GetPointer()
  1002.     inline
  1003.     operator TObjectType*(void) const
  1004.         {
  1005.             return GetPointerOrNull();
  1006.         }
  1007. private:
  1008.     TObjectType* AtomicSwap(TObjectType* ptr)
  1009.         {
  1010.             // MIPSpro won't accept static_cast for some reason.
  1011.             return reinterpret_cast<TObjectType*>
  1012.                 (SwapPointers(const_cast<void*volatile*>(
  1013.                                   const_cast<void**>(
  1014.                                       reinterpret_cast<const void**>(&m_Ptr))),
  1015.                               const_cast<C*>(ptr)));
  1016.         }
  1017.     TObjectType* m_Ptr;             ///< Pointer to object
  1018. };
  1019. /// Template operator < function for CRef objects.
  1020. template<class T>
  1021. inline
  1022. bool operator< (const CRef<T>& r1, const CRef<T>& r2)
  1023. {
  1024.     return r1.GetPointerOrNull() < r2.GetPointerOrNull();
  1025. }
  1026. /// Template operator > function for CRef objects.
  1027. template<class T>
  1028. inline
  1029. bool operator> (const CRef<T>& r1, const CRef<T>& r2)
  1030. {
  1031.     return r1.GetPointerOrNull() > r2.GetPointerOrNull();
  1032. }
  1033. /// Template operator == function for CRef objects -- rhs is null.
  1034. template<class T>
  1035. inline
  1036. bool operator== (const CRef<T>& r1, ENull /*null*/)
  1037. {
  1038.     return r1.IsNull();
  1039. }
  1040. /// Template operator == function for CRef objects -- lhs is null.
  1041. template<class T>
  1042. inline
  1043. bool operator== (ENull /*null*/, const CRef<T>& r1)
  1044. {
  1045.     return r1.IsNull();
  1046. }
  1047. /// Template operator != function for CRef objects -- rhs is null.
  1048. template<class T>
  1049. inline
  1050. bool operator!= (const CRef<T>& r1, ENull /*null*/)
  1051. {
  1052.     return !r1.IsNull();
  1053. }
  1054. /// Template operator != function for CRef objects -- lhs is null.
  1055. template<class T>
  1056. inline
  1057. bool operator!= (ENull /*null*/, const CRef<T>& r1)
  1058. {
  1059.     return !r1.IsNull();
  1060. }
  1061. /// Template operator < function for CConstRef objects.
  1062. template<class T>
  1063. inline
  1064. bool operator< (const CConstRef<T>& r1, const CConstRef<T>& r2)
  1065. {
  1066.     return r1.GetPointerOrNull() < r2.GetPointerOrNull();
  1067. }
  1068. /// Template operator > function for CConstRef objects.
  1069. template<class T>
  1070. inline
  1071. bool operator> (const CConstRef<T>& r1, const CConstRef<T>& r2)
  1072. {
  1073.     return r1.GetPointerOrNull() > r2.GetPointerOrNull();
  1074. }
  1075. /// Template operator == function for CConstRef objects -- rhs is null.
  1076. template<class T>
  1077. inline
  1078. bool operator== (const CConstRef<T>& r1, ENull /*null*/)
  1079. {
  1080.     return r1.IsNull();
  1081. }
  1082. /// Template operator == function for CConstRef objects -- lhs is null.
  1083. template<class T>
  1084. inline
  1085. bool operator== (ENull /*null*/, const CConstRef<T>& r1)
  1086. {
  1087.     return r1.IsNull();
  1088. }
  1089. /// Template operator != function for CConstRef objects -- rhs is null.
  1090. template<class T>
  1091. inline
  1092. bool operator!= (const CConstRef<T>& r1, ENull /*null*/)
  1093. {
  1094.     return !r1.IsNull();
  1095. }
  1096. /// Template operator != function for CConstRef objects -- lhs is null.
  1097. template<class T>
  1098. inline
  1099. bool operator!= (ENull /*null*/, const CConstRef<T>& r1)
  1100. {
  1101.     return !r1.IsNull();
  1102. }
  1103. /// Template operator == function for CRef objects.
  1104. template<class T>
  1105. inline
  1106. bool operator== (const CRef<T>& r1, const CRef<T>& r2)
  1107. {
  1108.     return r1.GetPointerOrNull() == r2.GetPointerOrNull();
  1109. }
  1110. /// Template operator == function for CConstRef objects.
  1111. template<class T>
  1112. inline
  1113. bool operator== (const CConstRef<T>& r1, const CConstRef<T>& r2)
  1114. {
  1115.     return r1.GetPointerOrNull() == r2.GetPointerOrNull();
  1116. }
  1117. /// Template operator == function for CConstRef and CRef objects.
  1118. template<class T>
  1119. inline
  1120. bool operator== (const CConstRef<T>& r1, const CRef<T>& r2)
  1121. {
  1122.     return r1.GetPointerOrNull() == r2.GetPointerOrNull();
  1123. }
  1124. /// Template operator == function for CRef and CConstRef objects.
  1125. template<class T>
  1126. inline
  1127. bool operator== (const CRef<T>& r1, const CConstRef<T>& r2)
  1128. {
  1129.     return r1.GetPointerOrNull() == r2.GetPointerOrNull();
  1130. }
  1131. /// Template operator == function for CRef and CRef objects.
  1132. template<class T>
  1133. inline
  1134. bool operator!= (const CRef<T>& r1, const CRef<T>& r2)
  1135. {
  1136.     return r1.GetPointerOrNull() != r2.GetPointerOrNull();
  1137. }
  1138. /// Template operator != function for CConstRef objects.
  1139. template<class T>
  1140. inline
  1141. bool operator!= (const CConstRef<T>& r1, const CConstRef<T>& r2)
  1142. {
  1143.     return r1.GetPointerOrNull() != r2.GetPointerOrNull();
  1144. }
  1145. /// Template operator != function for CConstRef and CRef objects.
  1146. template<class T>
  1147. inline
  1148. bool operator!= (const CConstRef<T>& r1, const CRef<T>& r2)
  1149. {
  1150.     return r1.GetPointerOrNull() != r2.GetPointerOrNull();
  1151. }
  1152. /// Template operator != function for CRef and CConstRef objects.
  1153. template<class T>
  1154. inline
  1155. bool operator!= (const CRef<T>& r1, const CConstRef<T>& r2)
  1156. {
  1157.     return r1.GetPointerOrNull() != r2.GetPointerOrNull();
  1158. }
  1159. /// Template function for conversion of object pointer to CRef
  1160. template<class C>
  1161. inline
  1162. CRef<C> Ref(C* object)
  1163. {
  1164.     return CRef<C>(object);
  1165. }
  1166. /// Template function for conversion of const object pointer to CConstRef
  1167. template<class C>
  1168. inline
  1169. CConstRef<C> ConstRef(const C* object)
  1170. {
  1171.     return CConstRef<C>(object);
  1172. }
  1173. /////////////////////////////////////////////////////////////////////////////
  1174. ///
  1175. /// CObjectFor --
  1176. ///
  1177. /// Define a template class whose template parameter is a standard data type 
  1178. /// that will be pointed to.
  1179. ///
  1180. /// The template class defines a private data member of the same type as the
  1181. /// template parameter, and accessor methods GetData() to retrieve the value
  1182. /// of this private data member. The class is derived from CObject and
  1183. /// therefore inherits the reference counter defined in that class. In essence,
  1184. /// this class serves as a "wrapper" class for standard data types allowing
  1185. /// reference counted smart pointers to be used for standard data types. 
  1186. template<typename T>
  1187. class CObjectFor : public CObject
  1188. {
  1189. public:
  1190.     typedef T TObjectType;          ///< Define alias for template parameter
  1191.     /// Get data as a reference.
  1192.     T& GetData(void)
  1193.         {
  1194.             return m_Data;
  1195.         }
  1196.     /// Get data as a reference -- const version.
  1197.     const T& GetData(void) const
  1198.         {
  1199.             return m_Data;
  1200.         }
  1201.     /// Operator () to get data -- same as GetData().
  1202.     ///
  1203.     /// @sa
  1204.     ///   GetData()
  1205.     operator T& (void)
  1206.         {
  1207.             return GetData();
  1208.         }
  1209.     /// Operator () to get data -- const version, same as GetData().
  1210.     ///
  1211.     /// @sa
  1212.     ///   GetData()
  1213.     operator const T& (void) const
  1214.         {
  1215.             return GetData();
  1216.         }
  1217.     /// Assignment operator.
  1218.     T& operator=(const T& data)
  1219.         {
  1220.             m_Data = data;
  1221.             return *this;
  1222.         }
  1223. private:
  1224.     T m_Data;               ///< Data member of template parameter type
  1225. };
  1226. /* @} */
  1227. #include <corelib/ncbiobj.inl>
  1228. END_NCBI_SCOPE
  1229. /*
  1230.  * ===========================================================================
  1231.  * $Log: ncbiobj.hpp,v $
  1232.  * Revision 1000.1  2004/04/13 19:57:54  gouriano
  1233.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.56
  1234.  *
  1235.  * Revision 1.56  2004/04/06 20:34:23  grichenk
  1236.  * Added atomic release and reset to CRef.
  1237.  *
  1238.  * Revision 1.55  2004/03/10 18:40:21  gorelenk
  1239.  * Added/Removed NCBI_XNCBI_EXPORT prefixes.
  1240.  *
  1241.  * Revision 1.54  2004/03/10 17:34:05  gorelenk
  1242.  * Removed NCBI_XNCBI_EXPORT prefix for classes members-functions
  1243.  * that are implemented as a inline functions.
  1244.  *
  1245.  * Revision 1.53  2003/10/20 20:07:10  siyan
  1246.  * Added CORELIB___ prefix in conditional includes.
  1247.  *
  1248.  * Revision 1.52  2003/10/01 00:24:02  ucko
  1249.  * CConstRef::AtomicSwap: use reinterpret_cast rather than static_cast to
  1250.  * placate MIPSpro.
  1251.  *
  1252.  * Revision 1.51  2003/09/17 17:57:38  vasilche
  1253.  * Added Ref() and ConstRef() templated functions for getting CRef<> objects.
  1254.  *
  1255.  * Revision 1.50  2003/09/17 15:20:45  vasilche
  1256.  * Moved atomic counter swap functions to separate file.
  1257.  * Added CRef<>::AtomicResetFrom(), CRef<>::AtomicReleaseTo() methods.
  1258.  *
  1259.  * Revision 1.49  2003/08/12 13:35:50  siyan
  1260.  * Minor comment changes.
  1261.  *
  1262.  * Revision 1.48  2003/08/12 12:03:48  siyan
  1263.  * Added documentation. Change private method name from AddReferenceOverflow()
  1264.  * to a more meaningful name of its purpose, CheckReferenceOverflow().
  1265.  *
  1266.  * Revision 1.47  2003/07/17 23:00:50  vasilche
  1267.  * Added matching operator delete.
  1268.  *
  1269.  * Revision 1.46  2003/07/17 20:01:06  vasilche
  1270.  * Added inplace operator new().
  1271.  *
  1272.  * Revision 1.45  2003/05/18 04:47:09  vakatov
  1273.  * Rollback to R1.43, as R1.44 created another, more problematic warning --
  1274.  * that "operator T*()" would be chosen over "operator bool()" for non-const
  1275.  *
  1276.  * Revision 1.43  2003/04/01 14:19:58  siyan
  1277.  * Added doxygen support
  1278.  *
  1279.  * Revision 1.42  2002/12/18 22:53:21  dicuccio
  1280.  * Added export specifier for building DLLs in windows.  Added global list of
  1281.  * all such specifiers in mswin_exports.hpp, included through ncbistl.hpp
  1282.  *
  1283.  * Revision 1.41  2002/11/27 12:53:14  dicuccio
  1284.  * Added CObject::ThrowNullPointerException to get around some inlining issues.
  1285.  * Fixed a few returns (m_Ptr -> ptr).
  1286.  *
  1287.  * Revision 1.40  2002/11/26 14:25:34  dicuccio
  1288.  * Added more explicit error reporting for thrown exceptions.
  1289.  *
  1290.  * Revision 1.39  2002/11/08 19:43:29  grichenk
  1291.  * CConstRef<> constructor made explicit
  1292.  *
  1293.  * Revision 1.38  2002/11/04 21:30:53  grichenk
  1294.  * Made CRef<> constructor explicit, const CRef<> getters
  1295.  * return const references/pointers.
  1296.  *
  1297.  * Revision 1.37  2002/09/19 20:05:41  vasilche
  1298.  * Safe initialization of static mutexes
  1299.  *
  1300.  * Revision 1.36  2002/08/28 17:05:50  vasilche
  1301.  * Remove virtual inheritance, fixed heap detection
  1302.  *
  1303.  * Revision 1.35  2002/07/15 18:17:51  gouriano
  1304.  * renamed CNcbiException and its descendents
  1305.  *
  1306.  * Revision 1.34  2002/07/11 14:17:55  gouriano
  1307.  * exceptions replaced by CNcbiException-type ones
  1308.  *
  1309.  * Revision 1.33  2002/05/31 15:16:51  gouriano
  1310.  * more unsigned ints in EObjectState flags
  1311.  *
  1312.  * Revision 1.32  2002/05/30 18:32:14  gouriano
  1313.  * changed eStateBitsValid to "unsigned int" to make some compilers happy
  1314.  *
  1315.  * Revision 1.31  2002/05/23 22:24:21  ucko
  1316.  * Use low-level atomic operations for reference counts
  1317.  *
  1318.  * Revision 1.30  2002/05/17 14:25:40  gouriano
  1319.  * added DebugDump base class and function to CObject
  1320.  *
  1321.  * Revision 1.29  2002/05/14 21:12:59  gouriano
  1322.  * DebugDump moved into a separate class
  1323.  *
  1324.  * Revision 1.28  2002/05/14 14:42:13  gouriano
  1325.  * added DebugDump function to CObject
  1326.  *
  1327.  * Revision 1.27  2002/04/11 20:39:18  ivanov
  1328.  * CVS log moved to end of the file
  1329.  *
  1330.  * Revision 1.26  2001/10/10 04:03:22  vakatov
  1331.  * Added operator> for C(Const)Ref -- for ICC and MIPSpro
  1332.  *
  1333.  * Revision 1.25  2001/06/21 15:17:42  kholodov
  1334.  * Added: null special value, support for null in CRef classes, equality
  1335.  * operators.
  1336.  *
  1337.  * Revision 1.24  2001/06/13 14:19:54  grichenk
  1338.  * Added operators == and != for C(Const)Ref
  1339.  *
  1340.  * Revision 1.23  2001/05/17 14:53:56  lavr
  1341.  * Typos corrected
  1342.  *
  1343.  * Revision 1.22  2001/03/26 21:22:51  vakatov
  1344.  * Minor cosmetics
  1345.  *
  1346.  * Revision 1.21  2001/03/13 22:43:48  vakatov
  1347.  * Made "CObject" MT-safe
  1348.  * + CObject::DoDeleteThisObject()
  1349.  *
  1350.  * Revision 1.20  2001/03/05 22:14:18  vakatov
  1351.  * Added "operator<" for CRef:: and CConstRef:: to make them usable
  1352.  * as keys in the stnadard C++ associative containers (set, map, ...)
  1353.  *
  1354.  * Revision 1.19  2001/02/21 21:16:08  grichenk
  1355.  * CRef:: Release, Reset -- reset m_Ptr BEFORE removing the reference
  1356.  *
  1357.  * Revision 1.18  2000/12/26 17:25:38  vasilche
  1358.  * CRef<> returns non const object.
  1359.  *
  1360.  * Revision 1.17  2000/12/15 19:18:36  vakatov
  1361.  * Added assignment operator for CRef<> and CConstRef<>
  1362.  *
  1363.  * Revision 1.16  2000/12/15 15:36:29  vasilche
  1364.  * Added header corelib/ncbistr.hpp for all string utility functions.
  1365.  * Optimized string utility functions.
  1366.  * Added assignment operator to CRef<> and CConstRef<>.
  1367.  * Add Upcase() and Locase() methods for automatic conversion.
  1368.  *
  1369.  * Revision 1.15  2000/12/12 14:20:14  vasilche
  1370.  * Added operator bool to CArgValue.
  1371.  * Added standard typedef element_type to CRef<> and CConstRef<>.
  1372.  * Macro iterate() now calls method end() only once and uses temporary variabl.
  1373.  * Various NStr::Compare() methods made faster.
  1374.  * Added class Upcase for printing strings to ostream with automatic conversion
  1375.  *
  1376.  * Revision 1.14  2000/11/01 20:35:01  vasilche
  1377.  * Fixed detection of heap objects.
  1378.  * Removed ECanDelete enum and related constructors.
  1379.  *
  1380.  * Revision 1.13  2000/10/13 16:25:43  vasilche
  1381.  * Added heuristic for detection of CObject allocation in heap.
  1382.  *
  1383.  * Revision 1.12  2000/09/01 13:14:25  vasilche
  1384.  * Fixed throw() declaration in CRef/CConstRef
  1385.  *
  1386.  * Revision 1.11  2000/08/15 19:42:06  vasilche
  1387.  * Changed reference counter to allow detection of more errors.
  1388.  *
  1389.  * Revision 1.10  2000/06/16 16:29:42  vasilche
  1390.  * Added SetCanDelete() method to allow to change CObject 'in heap' status 
  1391.  * immediately after creation.
  1392.  *
  1393.  * Revision 1.9  2000/06/07 19:44:16  vasilche
  1394.  * Removed unneeded THROWS declaration - they lead to encreased code size.
  1395.  *
  1396.  * Revision 1.8  2000/05/09 16:36:54  vasilche
  1397.  * CObject::GetTypeInfo now moved to CObjectGetTypeInfo::GetTypeInfo to reduce
  1398.  * possible errors.
  1399.  *
  1400.  * Revision 1.7  2000/04/28 16:56:13  vasilche
  1401.  * Fixed implementation of CRef<> and CConstRef<>
  1402.  *
  1403.  * Revision 1.6  2000/03/31 17:08:07  kans
  1404.  * moved ECanDelete to public area of CObject
  1405.  *
  1406.  * Revision 1.5  2000/03/29 15:50:27  vasilche
  1407.  * Added const version of CRef - CConstRef.
  1408.  * CRef and CConstRef now accept classes inherited from CObject.
  1409.  *
  1410.  * Revision 1.4  2000/03/10 14:18:37  vasilche
  1411.  * Added CRef<>::GetPointerOrNull() method similar to std::auto_ptr<>.get()
  1412.  *
  1413.  * Revision 1.3  2000/03/08 14:18:19  vasilche
  1414.  * Fixed throws instructions.
  1415.  *
  1416.  * Revision 1.2  2000/03/07 15:25:42  vasilche
  1417.  * Fixed implementation of CRef::->
  1418.  *
  1419.  * Revision 1.1  2000/03/07 14:03:11  vasilche
  1420.  * Added CObject class as base for reference counted objects.
  1421.  * Added CRef templace for reference to CObject descendant.
  1422.  *
  1423.  * ==========================================================================
  1424.  */
  1425. #endif /* NCBIOBJ__HPP */