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;
}

Compiling that with g++ 3.3.3 gives:

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

This is with Boost 1.34.1
Can any of you shed any light on this please?!

Thanks for all the help so far :-)
--rob


On Jan 21, 2008 3:09 PM, Eric MALENFANT < Eric.Malenfant@sagem-interstar.com> wrote:
>       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,
> 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."

>       Rob Desbois, le 18 janvier 2008 13:58:
>
> 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 "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).

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



--
Rob Desbois
Eml: rob.desbois@gmail.com
Tel: 07946 705987
"There's a whale there's a whale there's a whale fish" he cried, and the whale was in full view.
...Then ooh welcome. Ahhh. Ooh mug welcome.