ASIO async_read_until...

Hello list, I have a set of inherited classes as follows: client [parent of] stream [parent of] parser [parent of] grammar When I perform the following call: boost::asio::async_read_until( socket_, streambuf_, stream::parse(), boost::bind( &client::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred ) ); The xml::parser::operator() call for the match condition is a copy of the classes: parser [parent of] grammar I need to know if someone could suggest a client way for me to use (shared) pointers to the classes so that the xml::parser::operator() can keep its state changes over successive calls for async_read_until. Currently I have this (hack) for the issue, but hope there is a cleaner approach: class parser : public grammar { public: parser( ) : parser_(//stupid hack... this ) { }; virtual ~parser( ) { }; parser& parse( ) { return *this; }; template <typename T> std::pair<T, bool> operator()( T begin, T end ) { ...[state changes based on content matches]... }; private: parser* parser_;//needed for stupid hack... protected: }; When I call stream::parse() it returns the parser object, at which async_read_until makes a copy of the parser object and its base classes. When parser::operator() is called by async_read_until, I then apply all state changes via parser* parser_ to the original class. Any suggestions are welcome. Etienne.

On Thu, Jul 23, 2009 at 1:27 PM, Etienne Philip Pretorius<icewolfhunter@gmail.com> wrote:
Hello list,
I have a set of inherited classes as follows:
client [parent of] stream [parent of] parser [parent of] grammar
When I perform the following call:
boost::asio::async_read_until( socket_, streambuf_, stream::parse(), boost::bind( &client::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred ) );
The xml::parser::operator() call for the match condition is a copy of the classes:
parser [parent of] grammar
I need to know if someone could suggest a client way for me to use (shared) pointers to the classes so that the xml::parser::operator() can keep its state changes over successive calls for async_read_until.
I should throw in a disclaimer that I have no experience at all with the xml parsing classes you're using so this may not apply. Can you store a single instance of parser inside client and then call async_read_until with boost::ref(parser_) instead of stream::parse()?

Zachary Turner wrote:
On Thu, Jul 23, 2009 at 1:27 PM, Etienne Philip Pretorius<icewolfhunter@gmail.com> wrote:
Hello list,
I have a set of inherited classes as follows:
client [parent of] stream [parent of] parser [parent of] grammar
When I perform the following call:
boost::asio::async_read_until( socket_, streambuf_, stream::parse(), boost::bind( &client::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred ) );
The xml::parser::operator() call for the match condition is a copy of the classes:
parser [parent of] grammar
I need to know if someone could suggest a client way for me to use (shared) pointers to the classes so that the xml::parser::operator() can keep its state changes over successive calls for async_read_until.
I should throw in a disclaimer that I have no experience at all with the xml parsing classes you're using so this may not apply.
No problem, I am a hobby coder and decided to make my own with boost libraries...
Can you store a single instance of parser inside client and then call async_read_until with boost::ref(parser_) instead of stream::parse()?
You are correct. Thank you.
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
participants (2)
-
Etienne Philip Pretorius
-
Zachary Turner