[Dune] [Dune-Commit] dune-common r5954 - trunk/dune/common

Oliver Sander sander at mi.fu-berlin.de
Wed Apr 7 11:58:51 CEST 2010


Hi Martin!
Thanks for putting all this work into the allocator issue.  From looking at
the code below I see that you use new/delete to implement the allocator
methods allocate/deallocate.  This is not standard-conforming, as the stl
methods allocate/deallocate only reserve/free memory, but do not call
constructors/destructors.  Hence malloc/free would be the appropriate
way.

Please consider this mail void if I am telling you things that you already
know.

best,
Oliver

mnolte at dune-project.org schrieb:
> Author: mnolte
> Date: 2010-04-07 09:36:52 +0200 (Wed, 07 Apr 2010)
> New Revision: 5954
>
> Added:
>    trunk/dune/common/polyallocator.hh
> Modified:
>    trunk/dune/common/Makefile.am
>    trunk/dune/common/smallobject.hh
> Log:
> add an allocator that can create object of arbitrary type (otherwise similar
> to STL)
>
> This will need some further discussion, of course. It is intended for FS #766,
> i.e., use an allocator to construct polymorphic objects in GenericGeometries.
>
>
>
> Added: trunk/dune/common/polyallocator.hh
> ===================================================================
> --- trunk/dune/common/polyallocator.hh	                        (rev 0)
> +++ trunk/dune/common/polyallocator.hh	2010-04-07 07:36:52 UTC (rev 5954)
> @@ -0,0 +1,36 @@
> +#ifndef DUNE_POLYALLOCATOR_HH
> +#define DUNE_POLYALLOCATOR_HH
> +
> +namespace Dune
> +{
> +
> +  // PolyAllocator
> +  // -------------
> +
> +  struct PolyAllocator
> +  {
> +    template< class T >
> +    T *allocate ( size_t n = 1 )
> +    {
> +      return static_cast< T * >( operator new( n * sizeof( T ) ) );
> +    }
> +
> +    template< class T > void deallocate ( T *p )
> +    {
> +      operator delete( p );
> +    }
> +
> +    template< class T > void construct ( T *p, const T &value )
> +    {
> +      new( p ) T( value );
> +    }
> +
> +    template< class T > void destroy ( T *p )
> +    {
> +      p->~T();
> +    }
> +  };
> +
> +}
> +
> +#endif // #ifndef DUNE_POLYALLOCATOR_HH
>
> Modified: trunk/dune/common/smallobject.hh
> ===================================================================
> --- trunk/dune/common/smallobject.hh	2010-04-06 07:04:52 UTC (rev 5953)
> +++ trunk/dune/common/smallobject.hh	2010-04-07 07:36:52 UTC (rev 5954)
> @@ -154,6 +154,20 @@
>  
>  
>  
> +  // SmallObjectPolyAllocator
> +  // ------------------------
> +
> +  struct SmallObjectPolyAllocator
> +  {
> +    template< class T > T *allocate ( size_t n = 1 );
> +    template< class T > void deallocate ( T *p );
> +
> +    template< class T > void construct ( T *p, const T &value ) { new( p ) T( value ); }
> +    template< class T > void destroy ( T *p ) { p->~T(); }
> +  };
> +
> +
> +
>    // Implementation of SmallObjectAllocator
>    // --------------------------------------
>  
> @@ -161,7 +175,7 @@
>    inline typename SmallObjectAllocator< T >::pointer
>    SmallObjectAllocator< T >::allocate ( size_type n, SmallObjectAllocator< void >::const_pointer hint )
>    {
> -    return reinterpret_cast< pointer >( SmallObjectPool::allocate( n * sizeof( T ) ) );
> +    return static_cast< pointer >( SmallObjectPool::allocate( n * sizeof( T ) ) );
>    }
>  
>  
> @@ -186,6 +200,23 @@
>      return false;
>    }
>  
> +
> +
> +  // Implementation of SmallObjectPolyAllocator
> +  // ------------------------------------------
> +
> +  template< class T >
> +  inline T *SmallObjectPolyAllocator::allocate ( size_t n )
> +  {
> +    return static_cast< T * >( SmallObjectPool::allocate( n * sizeof( T ) ) );
> +  }
> +
> +  template< class T >
> +  inline void SmallObjectPolyAllocator::deallocate ( T *p )
> +  {
> +    SmallObjectPool::free( p );
> +  }
> +
>  }
>  
>  #endif // #ifndef DUNE_SMALLOBJECT_HH
>
>
> _______________________________________________
> Dune-Commit mailing list
> Dune-Commit at dune-project.org
> http://lists.dune-project.org/mailman/listinfo/dune-commit
>   


-- 
************************************************************************
* Oliver Sander                ** email: sander at mi.fu-berlin.de        *
* Freie Universität Berlin     ** phone: + 49 (30) 838 75348           *
* Institut für Mathematik      ** URL  : page.mi.fu-berlin.de/~sander  *
* Arnimallee 6                 ** -------------------------------------*
* 14195 Berlin, Germany        ** Member of MATHEON (www.matheon.de)   *
************************************************************************





More information about the Dune mailing list