
template< class Archive, typename T,typename Arg1,typename Arg2,typename Arg3
void save( Archive& ar,const ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>& f, const unsigned int version) { typedef ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3> flyweight; ar << f.get(); // use serialization tracking - no need to call helper } template< class Archive, typename T,typename Arg1,typename Arg2,typename Arg3
void load( Archive& ar,const ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>& f, const unsigned int version) { typedef ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3> flyweight; T t; ar >> t; f = t; // look up here ar.reset_object_address(& f.get(), &t); } vs. // from flyweight serialize template< class Archive, typename T,typename Arg1,typename Arg2,typename Arg3
void load( Archive& ar,::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>& f, const unsigned int version ){ typedef ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3> flyweight; typedef ::boost::flyweights::detail::serialization_helper<flyweight> helper; typedef typename helper::size_type size_type; helper& hlp= ::boost::flyweights::detail::get_serialization_helper<flyweight>(ar); size_type n=0; ar>>make_nvp("item",n); if(n>hlp.size()){ throw_exception( archive::archive_exception(archive::archive_exception::other_exception)); } else if(n==hlp.size()){ ::boost::flyweights::detail::archive_constructed<T> v("value",ar,version); hlp.push_back(flyweight(v.get())); // Doesn't push_back need to do a find? } f=hlp[n]; } I've delved into the helper. I kind of ran out of gas at multi-index. Doesn't this require a lookup to maintain the mult-indexed table?. Also using the helper entails a lot more generated code. It looks like a bunch more code generated for each type flyweight. I'm not convinced that there is a real saving here. If you dropped the helper, then you're class would be serializable right now and it would entail a lot less code. You could always make it more elaborate later. Robert Ramey