dbertoni    00/07/28 14:59:58

  Modified:    c/src/PlatformSupport ArenaBlock.hpp
                        ReusableArenaAllocator.hpp ReusableArenaBlock.hpp
  Log:
  Added functionality.
  
  Revision  Changes    Path
  1.5       +20 -8     xml-xalan/c/src/PlatformSupport/ArenaBlock.hpp
  
  Index: ArenaBlock.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/ArenaBlock.hpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ArenaBlock.hpp    2000/07/10 22:45:28     1.4
  +++ ArenaBlock.hpp    2000/07/28 21:59:56     1.5
  @@ -111,14 +111,7 @@
   
        ~ArenaBlock()
        {
  -#if !defined(XALAN_NO_NAMESPACES)
  -             using std::for_each;
  -#endif
  -
  -             // Destroy all existing objects...
  -             for_each(m_objectBlock,
  -                              m_objectBlock + m_objectCount,
  -                              DeleteFunctor(*this, m_destroyFunction));
  +             destroyAll();
   
                // Release the memory...
                m_allocator.deallocate(m_objectBlock, 0);
  @@ -263,6 +256,25 @@
                {
                        return false;
                }
  +     }
  +
  +     /*
  +      * Destroy all objects in the block.  You can then reuse the
  +      * block.
  +      */
  +     void
  +     destroyAll()
  +     {
  +#if !defined(XALAN_NO_NAMESPACES)
  +             using std::for_each;
  +#endif
  +
  +             // Destroy all existing objects...
  +             for_each(m_objectBlock,
  +                              m_objectBlock + m_objectCount,
  +                              DeleteFunctor(*this, m_destroyFunction));
  +
  +             m_objectCount = 0;
        }
   
   protected:
  
  
  
  1.8       +39 -2     
xml-xalan/c/src/PlatformSupport/ReusableArenaAllocator.hpp
  
  Index: ReusableArenaAllocator.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/PlatformSupport/ReusableArenaAllocator.hpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ReusableArenaAllocator.hpp        2000/07/12 19:26:26     1.7
  +++ ReusableArenaAllocator.hpp        2000/07/28 21:59:56     1.8
  @@ -119,8 +119,6 @@
        bool
        destroyObject(ObjectType*       theObject)
        {
  -             assert(m_blocks.size() != 0);
  -
                bool    fSucess = false;
   
                // Check this, just in case...
  @@ -222,6 +220,45 @@
   
                m_lastBlockReferenced->commitAllocation(theObject);
                assert(m_lastBlockReferenced->ownsObject(theObject) == true);
  +     }
  +
  +     virtual bool
  +     ownsObject(const ObjectType*    theObject) const
  +     {
  +             bool    fResult = false;
  +
  +             // If no block has ever been referenced, then we haven't 
allocated
  +             // any objects.
  +             if (m_lastBlockReferenced != 0)
  +             {
  +                     // Check the last referenced block first.
  +                     fResult = m_lastBlockReferenced->ownsObject(theObject);
  +
  +                     if (fResult == false)
  +                     {
  +                             // Search back for a block with some space 
available...
  +                             ArenaBlockListType::const_reverse_iterator      
i = m_blocks.rbegin();
  +                             const 
ArenaBlockListType::const_reverse_iterator        theEnd = m_blocks.rend();
  +
  +                             while(i != theEnd)
  +                             {
  +                                     assert(*i != 0);
  +
  +                                     if ((*i)->ownsObject(theObject) == true)
  +                                     {
  +                                             fResult = true;
  +
  +                                             break;
  +                                     }
  +                                     else
  +                                     {
  +                                             ++i;
  +                                     }
  +                             }
  +                     }
  +             }
  +
  +             return fResult;
        }
   
   private:
  
  
  
  1.5       +1 -0      xml-xalan/c/src/PlatformSupport/ReusableArenaBlock.hpp
  
  Index: ReusableArenaBlock.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/ReusableArenaBlock.hpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ReusableArenaBlock.hpp    2000/07/11 15:28:51     1.4
  +++ ReusableArenaBlock.hpp    2000/07/28 21:59:56     1.5
  @@ -98,6 +98,7 @@
   
        ~ReusableArenaBlock()
        {
  +             destroyAll();
        }
   
        /*
  
  
  

Reply via email to