Jonathan - thank you, that's helped massively. I now have a serial_device type along the lines you described :-)
Bob - thanks for the asio suggestion - I decided that it wasn't quite what I'm looking for though.
Eric - I realised I actually configure the serial port as a blocking device so it should be fine.
My final (I hope!) problem is in using a stream.
I cannot compile a program creating a stream object templated for my serial device:
#include <boost/iostreams/stream.hpp>
#include "serial_device.h"
int main(void) {
boost::iostreams::stream<serial_device> s;
}
test-stream.cpp: In function `int main()':
test-stream.cpp:5: error: invalid use of template `template<class Device,
class Tr, class Alloc> struct boost::iostreams::stream'
test-stream.cpp:5: error: syntax error before `;' token
> Rob Desbois, le 18 janvier 2008 08:02:
>
> >
> > After trying to compile I realised that a SeekableDevice
> > provides read, write and seek functions, nothing else.
> > Am I seriously misunderstanding the point of
> boost::iostreams?
> On Jan 18, 2008 6:46 PM, Eric MALENFANT
> <Eric.Malenfant@sagem-interstar.com > wrote:> A file_descriptor only implements the Device concept,> Rob Desbois, le 18 janvier 2008 13:58:
> it not an std::iostream.
> If you want an std::iostream, you wrap the Device in a
> boost::iostreams::stream which, as stated in its
> documentation: "performs i/o by delegating to a contained
> Device", and "derives from a specialization of
> std::basic_istream, std::basic_ostream or
> std::basic_iostream, depending on whether the underlying
> Device models Source, Sink or both.">The "seekability" should not be a problem. You could define a BidirectionalDevice as Jonathan suggests in another message. If you only need read (or write), you could even just define a Source (or Sink).
> Are you able to comment on whether I 'should' be doing this
> as regards the non-blocking and non-seekable nature of a serial port?
The "blocking" side of things may be more trouble, depending on your needs.
Boost.Iostreams offers minimal support for non-blocking strings: boost::iostreams::char_traits::would_block() can be used to indicate that a read or write attempt was interrupted but, unless I missed something, nothing allows the caller to wait for the blocking condition to be removed (like select() allows for non-blocking sockets, for example), so the caller has to poll the stream. As suggested by Bob Warren, Boost.Asio may offer an interesting alternative.
Éric Malenfant
---------------------------------------------
Amateur programmers think there are 1000 bytes in a kilobyte;
Real Programmers think there are 1024 meters in a kilometer._______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users