Boost logo

Boost :

Subject: Re: [boost] boost::filesystem::path frustration
From: Dave Abrahams (dave_at_[hidden])
Date: 2013-01-25 18:49:33


on Fri Jan 25 2013, Neil Groves <neil-AT-grovescomputing.com> wrote:

> On Fri, Jan 25, 2013 at 4:30 PM, Beman Dawes <bdawes_at_[hidden]> wrote:
>
>> On Thu, Jan 24, 2013 at 8:56 PM, Dave Abrahams <dave_at_[hidden]> wrote:
>> >
>> > In particular, this comes up because I'm trying to find the greatest
>> > common prefix of two paths. I thought this would be easy; I'd just use
>> > std::mismatch. But even once I've found the mismatch I don't see any
>> > obvious way to chop off the non-matching parts of one of the paths. I
>> > end up having to resort to some really ugly code (or I just haven't
>> > figured out how to use this thing correctly).
>>
>>
> I wonder if this is *really* what you want!

A little credit, please. Yes, it's *really* what I want.

> I suspect that you probably want to determine the common effective
> prefix of the paths after canonicalisation.

No, the paths are known to be already canonicalized (with a 'z' ;->)

>
> Not particularly elegant, but this does work:
>>
>> path x("/foo/bar");
>> path y("/foo/baar");
>>
>> auto result = std::mismatch(x.begin(), x.end(), y.begin());
>>
>> path prefix;
>> for (auto itr = x.begin(); itr != result.first; ++itr)
>> prefix /= *itr;
>>
>> std::cout << prefix << std::endl;
>>
>>
> I think this code doesn't "work" because it meets the stated requirements
> exactly! I think the requirements are normally greater than those we first
> think of when looking at the problem.

A. you didn't know my requirements ;-), and

B. for such an operation requiring the input paths to be canonical
   beforehand might in fact be the most appropriate interface.

-- 
Dave Abrahams
BoostPro Computing                  Software Development        Training
http://www.boostpro.com             Clang/LLVM/EDG Compilers  C++  Boost

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk