
From: Angus Leeming <angus.leeming@btopenworld.com>
Rob Stewart wrote:
This is, in essence, what I am proposing. I have now reworked the interface following Gennadiy's suggestion. Here's a glob_iterator that can recurse down directories: [snipped code] I think you misunderstood what Gennadiy meant. (If not, I think this is a good idea, anyway.) Your function should accept an output iterator through which you save the results. That enables the caller to decide where the results go instead of you deciding that they go into a list which then must be iterated. Thus, I'm proposing something like this:
template <typename OutIt, typename Char> OutIt glob(OutIt & out, std::basic_string<Char> const & pattern, filesystem::path const & pathname, glob_flags flags);
Appropriate output iterators can forward the matches to a collection, to a GUI control, to a file, etc.
As for the output iterator idea, I don't see how to use it. For example, with my suggestion I could populate an STL container with:
namespace fs = filesystem; std::list<fs::path> const matches( glob_iterator("*.cpp", fs::path("."), glob_brace), glob_iterator());
How do I do that with your idea? Once you've explained it, can you tell me why it's better than glob_iterator, above?
Gennadiy already weighed in on my interpretation of his statement. As to what I've suggested, you already had code that built a std::list -- your original version, IIRC. Where you appended to the list, you would assign to the dereferenced output iterator. That deref/assignment can be coded to do many things by the author of the output iterator, including appending to a std::list. -- Rob Stewart stewart@sig.com Software Engineer http://www.sig.com Susquehanna International Group, LLP using std::disclaimer;