diff options
author | romkatv <roman.perepelitsa@gmail.com> | 2020-05-10 16:58:05 +0300 |
---|---|---|
committer | romkatv <roman.perepelitsa@gmail.com> | 2020-05-10 16:58:05 +0300 |
commit | 97fac973afa021ae3ef49e0feae203fd09b231e1 (patch) | |
tree | 5c1ba4f09905cc53fdfc75d3668a876d3e14a447 /gitstatus/src/dir.h | |
parent | c159f3aaefe13724421655d06df990b2ddf23e59 (diff) | |
parent | 1531d6e5439daae01627b2645684876b75eaf5eb (diff) |
Merge commit '1531d6e5439daae01627b2645684876b75eaf5eb' as 'gitstatus'
Diffstat (limited to 'gitstatus/src/dir.h')
-rw-r--r-- | gitstatus/src/dir.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/gitstatus/src/dir.h b/gitstatus/src/dir.h new file mode 100644 index 00000000..42ab29bb --- /dev/null +++ b/gitstatus/src/dir.h @@ -0,0 +1,50 @@ +// Copyright 2019 Roman Perepelitsa. +// +// This file is part of GitStatus. +// +// GitStatus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// GitStatus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with GitStatus. If not, see <https://www.gnu.org/licenses/>. + +#ifndef ROMKATV_GITSTATUS_DIR_H_ +#define ROMKATV_GITSTATUS_DIR_H_ + +#include <cstddef> +#include <vector> + +#include "arena.h" + +namespace gitstatus { + +// On error, clears entries and returns false. Does not throw. +// +// On success, fills entries with the names of files from the specified directory and returns true. +// Every entry is a null-terminated string. At -1 offset is its d_type. All elements point into the +// arena. They are sorted either by strcmp or strcasecmp depending on case_sensitive. +// +// Does not close dir_fd. +// +// There are two distinct implementations of ListDir -- one for Linux and another for everything +// else. The linux-specific implementation is 20% faster. +// +// The reason sorting is bundled with directory listing is performance on Linux. The API of +// getdents64 allows for much faster sorting than what can be done with a plain vector<char*>. +// For the POSIX implementation there is no need to bundle sorting in this way. In fact, it's +// done at the end with a generic StrSort() call. +// +// For best results, reuse the arena and vector for multiple calls to avoid heap allocations. +bool ListDir(int dir_fd, Arena& arena, std::vector<char*>& entries, bool precompose_unicode, + bool case_sensitive); + +} // namespace gitstatus + +#endif // ROMKATV_GITSTATUS_DIR_H_ |