Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2007-12-16 16:06:01


More about

http://svn.boost.org/svn/boost/sandbox/flyweight/libs/flyweight/doc/reference/flyweight.html#flyweight

I don't understand the source of the complexity at the flyweight<> level. A
"naive" flyweight<> could look like:

template<class T, class F = default_factory> class flyweight
{
    typedef typename F::handle_type handle_type;
    handle_type handle_;

public:

    flyweight( ... args ): handle_( F::insert( T( args... ) ) ) {}
    T const& get() const { return F::value( handle_ ); }
};

It seems to me that this provides the same amount of expressive power as the
current interface. Locking/tracking/holding can be made parameters of the
Factory if so desired, and a factory_core<F',L,T,H> template may be provided
as a convenience in a separate header, but in the majority of the cases the
user will never need it.

In fact flyweight<> is already implemented in a similar way, it uses a
flyweight_core<> class as F.

Note that the above simpler flyweight<> allows me to pass the aforementioned

template<class T> struct sp_factory
{
    typedef boost::shared_ptr<T const> handle_type;

    static handle_type insert( T const & t ) { return handle_type( new T(
t ) ); }
    static T const & entry( handle_type p ) { return *p; }
};

as F; there's no need to invent a locking policy, a tracking policy, a
holder, or a stateful factory.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk