From d9f0bc64898a207e5b15da443a92cc6c51ded419 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sat, 5 Aug 2017 16:47:14 +0200 Subject: Add path_map::find_sub() --- libbutl/path-map.hxx | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/libbutl/path-map.hxx b/libbutl/path-map.hxx index 7a966ab..5f282fb 100644 --- a/libbutl/path-map.hxx +++ b/libbutl/path-map.hxx @@ -109,12 +109,41 @@ namespace butl // Note that the delimiter character is not used (is_delimiter() from // path_traits is used instead). // + template + struct path_map_impl: prefix_map + { + using base = prefix_map; + using base::base; + + using iterator = typename base::iterator; + using const_iterator = typename base::const_iterator; + + // Find the most qualified entry of which this path is a sub-path. + // + iterator + find_sub (const P& p) + { + // Get the greatest less than, if any. We might still not be a sub. Note + // also that we still have to check the last element if upper_bound() + // returned end(). + // + auto i (this->upper_bound (p)); + return i == this->begin () || !p.sub ((--i)->first) ? this->end () : i; + } + + const_iterator + find_sub (const P& p) const + { + auto i (this->upper_bound (p)); + return i == this->begin () || !p.sub ((--i)->first) ? this->end () : i; + } + }; + template - using path_map = prefix_map; + using path_map = path_map_impl; template - using dir_path_map = - prefix_map; + using dir_path_map = path_map_impl; } #endif // LIBBUTL_PATH_MAP_HXX -- cgit v1.1