[bind] Help with functional composition of shared_ptr::use_count in std::map

Hello all, I'm trying to use bind to help with removeif in a std::map<string, shared_ptr<something> >. I want to remove items where the shared_ptr use_count is 1. map<string, shared_ptr<data> > Fred; RemoveIf(Fred.begin(), Fred.end(), boost::bind(std::equal_to<long>(), 1, boost::bind(&map<string, shared_ptr<data>
::value_type::second::use_count, _1) )
However, I get a compile error on ::second not being a class or namespace. Anyone know how I should do this? I'm a beginner at boost::bind, so be gentle.... James This message (including any attachments) contains confidential and/or proprietary information intended only for the addressee. Any unauthorized disclosure, copying, distribution or reliance on the contents of this information is strictly prohibited and may constitute a violation of law. If you are not the intended recipient, please notify the sender immediately by responding to this e-mail, and delete the message from your system. If you have any questions about this e-mail please notify the sender immediately.

-----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org] On Behalf Of Hughes, James Sent: 11 June 2007 12:04 To: boost-users@lists.boost.org Subject: [Boost-users] [bind] Help with functional composition ofshared_ptr::use_count in std::map
Hello all,
I'm trying to use bind to help with removeif in a std::map<string, shared_ptr<something> >. I want to remove items where the shared_ptr use_count is 1.
map<string, shared_ptr<data> > Fred;
RemoveIf(Fred.begin(), Fred.end(), boost::bind(std::equal_to<long>(), 1, boost::bind(&map<string, shared_ptr<data>
::value_type::second::use_count, _1) )
However, I get a compile error on ::second not being a class or namespace.
Anyone know how I should do this? I'm a beginner at boost::bind, so be gentle....
James
Sorry, that should read remove_if, and in fact the purpose is better served using shared_ptr<>::unique, which should mean I can get rid of the std:equal_to stuff RemoveIf(Fred.begin(), Fred.end(), boost::bind(&map<string, shared_ptr<data>
::value_type::second::unique, _1) )
Still get same compile fault however. James This message (including any attachments) contains confidential and/or proprietary information intended only for the addressee. Any unauthorized disclosure, copying, distribution or reliance on the contents of this information is strictly prohibited and may constitute a violation of law. If you are not the intended recipient, please notify the sender immediately by responding to this e-mail, and delete the message from your system. If you have any questions about this e-mail please notify the sender immediately.

Hello all,
I'm trying to use bind to help with removeif in a std::map<string, shared_ptr<something> >. I want to remove items where the shared_ptr use_count is 1.
map<string, shared_ptr<data> > Fred;
RemoveIf(Fred.begin(), Fred.end(), boost::bind(std::equal_to<long>(), 1, boost::bind(&map<string, shared_ptr<data>
::value_type::second::use_count, _1) )
However, I get a compile error on ::second not being a class or namespace.
Anyone know how I should do this? I'm a beginner at boost::bind, so be gentle....
James
Sorry, that should read remove_if, and in fact the purpose is better served using shared_ptr<>::unique, which should mean I can get rid of the std:equal_to stuff
RemoveIf(Fred.begin(), Fred.end(), boost::bind(&map<string, shared_ptr<data>
::value_type::second::unique, _1) )
Still get same compile fault however.
James
Have now replaced second in above with second_type Remove_if(Fred.begin(), Fred.end(), boost::bind(&map<string, shared_ptr<data>
::value_type::second_type::unique, _1) )
And am not getting a completely differnet error - bind seems to be doing a load of work, but eventually I get an mem_fn_template.hpp:90: error : No matching function for call to 'get_pointer(const std::pair<const std::string, boost::shared_ptr<data>
&)'
I'm running out of ideas here so all welcome.. James This message (including any attachments) contains confidential and/or proprietary information intended only for the addressee. Any unauthorized disclosure, copying, distribution or reliance on the contents of this information is strictly prohibited and may constitute a violation of law. If you are not the intended recipient, please notify the sender immediately by responding to this e-mail, and delete the message from your system. If you have any questions about this e-mail please notify the sender immediately.

Hughes, James wrote:
RemoveIf(Fred.begin(), Fred.end(), boost::bind(&map<string, shared_ptr<data>
::value_type::second::unique, _1) )
Still get same compile fault however.
It would be nice if this could work with a single bind, but unfortunately you need two: boost::bind( &shared_ptr<data>::unique, boost::bind( &map<string, shared_ptr<data> >::value_type::second, _1 ) ) There is an additional pitfall here; depending on the version of boost::bind and the compiler, the inner bind may return a shared_ptr by value, making the use_count at least 2. You should probably just fall back to the old-fashioned bool second_unique( map<string, shared_ptr<data> >::value_type & v ) { return v.second.unique(); } (I'm using a non-const reference as a parameter to guard against potential silent implicit conversions which could also increase the use_count.) Removing the unique entries sounds like purging a cache, maybe weak_ptr will work better in your map?

-----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org] On Behalf Of Peter Dimov Sent: 11 June 2007 14:11 To: boost-users@lists.boost.org Subject: Re: [Boost-users] [bind] Help with functionalcompositionofshared_ptr::use_count in std::map
Hughes, James wrote:
RemoveIf(Fred.begin(), Fred.end(), boost::bind(&map<string, shared_ptr<data>
::value_type::second::unique, _1) )
Still get same compile fault however.
It would be nice if this could work with a single bind, but unfortunately you need two:
boost::bind( &shared_ptr<data>::unique, boost::bind( &map<string, shared_ptr<data>
::value_type::second, _1 ) )
There is an additional pitfall here; depending on the version of boost::bind and the compiler, the inner bind may return a shared_ptr by value, making the use_count at least 2. You should probably just fall back to the old-fashioned
bool second_unique( map<string, shared_ptr<data> >::value_type & v ) { return v.second.unique(); }
(I'm using a non-const reference as a parameter to guard against potential silent implicit conversions which could also increase the use_count.)
Removing the unique entries sounds like purging a cache, maybe weak_ptr will work better in your map?
Thanks Peter - you are right - it's a cache! James This message (including any attachments) contains confidential and/or proprietary information intended only for the addressee. Any unauthorized disclosure, copying, distribution or reliance on the contents of this information is strictly prohibited and may constitute a violation of law. If you are not the intended recipient, please notify the sender immediately by responding to this e-mail, and delete the message from your system. If you have any questions about this e-mail please notify the sender immediately.
participants (2)
-
Hughes, James
-
Peter Dimov