[pdal] RE: Cloneable streams
Michael P. Gerlek
mpg at flaxen.com
Tue Mar 27 18:55:06 EDT 2012
Hearing no objections and taking that for vigorous assent, I've gone ahead and implemented this.
class PDAL_DLL StreamFactory
{
public:
StreamFactory() {}
virtual ~StreamFactory() {}
// returns the stream in the open state
virtual std::istream& allocate() = 0;
// will close the stream for you
virtual void deallocate(std::istream&) = 0;
};
Works pretty well...
-mpg
> -----Original Message-----
> From: Michael P. Gerlek [mailto:mpg at flaxen.com]
> Sent: Monday, March 26, 2012 4:52 PM
> To: pdal at lists.osgeo.org
> Subject: Cloneable streams
>
> Thinking out loud....
>
>
> The las::Writer constructor takes a filename (via an Option string) or a std::stream.
>
> The las::Reader constructor takes a filename -- but not a stream! This is because the Reader stage wants to be read-only: the file I/O is
> actually done by the Iterator, so the iterator has to call mystage->getFilename() and do the open() itself.
>
> Ideally, each reader and writer stage would support at least two canonical forms: a string (or Option object) for simple usage and a
> stream pointer for interoperability with other systems.
>
> But when you now add the need for the NITF reader to give the LAS reader a "subset" of the full file, things get even more fun: since
> we can't pass streams to Readers directly, we have to pass a filename and a length + offset... which means the iterator in turn has to
> get smarter and know about this new kind of stream creation mechanism that does offsets... ick.
>
>
> In addition to a ctor that takes an Option set, how about Readers and Writers also have a ctor that takes a StreamFactory object?
>
> class StreamFactory
> {
> public:
> std::stream* create() = 0;
> }
>
> When you create a Reader, you give it a Factory so it can make streams without having to know about the creation mechanism. We
> would supply a few derived classes for daily usage, with ctors like this:
>
> PassthruStreamFactory(std::istream& stream);
> FilenameStreamFactory(std::string);
> CurlStreamFactory(std::string url);
> ...
>
> and so on. The iterator would be able to use this factory to make new streams at will (so we can have parallel iterators), and the class
> could even take care of doing the cleanups of open streams in its dtor (by keeping a mutable and mutex-locked list of open streams or
> whatever).
>
> [I already made a StreamManager class a while back, but this StreamFactory is a more general concept.]
>
> -mpg
More information about the pdal
mailing list