WIP: Implement Filesystem TS
Ed Smith-Rowland
3dw4rd@verizon.net
Tue Aug 5 13:24:00 GMT 2014
On 08/04/2014 01:11 PM, Jonathan Wakely wrote:
> On 04/08/14 14:50 +0100, Jonathan Wakely wrote:
>> This is a 99% complete implementation of the Filesystem TS as defined
>> by the N4099 draft,
>> http://open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4099.html
>
> The missing 1% relates to code conversions from wide character
> strings, which will be easier with the C++11 codecvt facets.
>
> And that 99% only refers to POSIX systems, there are large chunks
> missing for Windows, but as I don't have access to a Windows PC and
> don't know the API someone else will have to provide those missing
> pieces. I hope no major redesign will be needed to add Windows support
> though.
>
> I plan to document the design, but I'm not sure when that will happen,
> so for now:
>
> * filesystem::path is implemented as a basic_string containing the
> native path, an enumeration describing the type of path represented
> (either an individual component such as root-name, root-dir,
> directory, filename, or a composite path of multiple components) and
> a std::list containing the separate components of a composite path
> (which is empty unless the path has multiple components). The list
> exists so that dereferencing a filesystem::path::iterator can return
> a reference to an object that is stored somewhere outside the
> iterator, as required for forward iterators.
>
> * It might be possible to optimize path by lazily populating the
> std::list, so that copying paths and passing them around by value
> just copies the basic_string containing the native path, and it only
> gets parsed to find the individual components as needed.
Interesting, I also parsed the path on creation - I felt weird about it
and wanted to lazily parse later on.
OTOH, I guessed that mostly we'd want the whole sequence most often.
Actually, I parsed it on creation of path::iterator (I had forgotten the
requirement of forward_iterators, so I had a vector of string_views
inside the iterator.)
>
> * directory_iterator holds a shared_ptr<_Dir> where _Dir is a pimpl
> class containing a DIR* returned by opendir(), a path object
> containing the path the dir was opened with, and a directory_entry
> object that gets returned by dereferencing the iterator. It also
> contained a file_type enumeration, which gets used on GNU and BSD
> platforms where the dirent struct contains the file type, which
> means no stat() system call is needed to find out whether the
> current entry is a directory and should be recursed into.
Why not unique_ptr?
>
> * recursive_directory_iterator holds a shared_ptr to a
> stack<pair<_Dir, directory_iterator>> representing each directory
> recursed into and the position within that directory. The
> shared_ptr<_Dir>s belong to the directory_iterator objects in the
> stack alias the shared_ptr held by the parent
> recursive_directory_iterator, so the reference counts are shared by
> the whole stack.
>
Tidbit: Explicit return bool in create_directories (ec version)? I'm not
sure when true should be returned though.
More information about the Libstdc++
mailing list