18 Filename(
const std::string &filename) {
27 Filename(
const std::wstring &filename) {
46 _filename(copy._filename.c_str()),
47 _dirname_end(copy._dirname_end),
48 _basename_start(copy._basename_start),
49 _basename_end(copy._basename_end),
50 _extension_start(copy._extension_start),
51 _hash_start(copy._hash_start),
52 _hash_end(copy._hash_end),
61 Filename(std::string &&filename) noexcept : _flags(0) {
62 (*this) = std::move(filename);
70 _filename(std::move(from._filename)),
71 _dirname_end(from._dirname_end),
72 _basename_start(from._basename_start),
73 _basename_end(from._basename_end),
74 _extension_start(from._extension_start),
75 _hash_start(from._hash_start),
76 _hash_end(from._hash_end),
88 _basename_end(std::string::npos),
89 _extension_start(std::string::npos),
90 _hash_start(std::string::npos),
91 _hash_end(std::string::npos),
99 text_filename(
const Filename &filename) {
109 text_filename(
const std::string &filename) {
119 binary_filename(
const Filename &filename) {
129 binary_filename(
const std::string &filename) {
139 dso_filename(
const std::string &filename) {
141 result.set_type(T_dso);
149 executable_filename(
const std::string &filename) {
151 result.set_type(T_executable);
170 operator = (
const std::string &filename) {
171 _filename = filename;
183 operator = (
const std::wstring &filename) {
187 return operator = (encoder.
get_text());
194 operator = (
const char *filename) {
195 assert(filename !=
nullptr);
196 return (*
this) = std::string(filename);
204 _filename = copy._filename;
205 _dirname_end = copy._dirname_end;
206 _basename_start = copy._basename_start;
207 _basename_end = copy._basename_end;
208 _extension_start = copy._extension_start;
209 _hash_start = copy._hash_start;
210 _hash_end = copy._hash_end;
211 _flags = copy._flags;
219 operator = (std::string &&filename) noexcept {
220 _filename = std::move(filename);
232 operator = (
Filename &&from) noexcept {
233 _filename = std::move(from._filename);
234 _dirname_end = from._dirname_end;
235 _basename_start = from._basename_start;
236 _basename_end = from._basename_end;
237 _extension_start = from._extension_start;
238 _hash_start = from._hash_start;
239 _hash_end = from._hash_end;
240 _flags = from._flags;
248 operator
const std::string & ()
const {
255 INLINE
const char *Filename::
257 return _filename.c_str();
263 INLINE
bool Filename::
265 return _filename.empty();
271 INLINE
size_t Filename::
273 return _filename.length();
279 INLINE
char Filename::
280 operator [] (
size_t n)
const {
281 assert(n < _filename.length());
288 INLINE std::string Filename::
289 substr(
size_t begin)
const {
290 return _filename.substr(begin);
296 INLINE std::string Filename::
297 substr(
size_t begin,
size_t end)
const {
298 return _filename.substr(begin, end);
359 return _filename.substr(0, _dirname_end);
368 return _filename.substr(_basename_start);
378 return _filename.substr(0, _basename_end);
387 if (_basename_end == std::string::npos) {
388 return _filename.substr(_basename_start);
390 return _filename.substr(_basename_start, _basename_end - _basename_start);
401 if (_extension_start == std::string::npos) {
402 return std::string();
404 return _filename.substr(_extension_start);
415 _flags = (_flags & ~F_text) | F_binary;
425 _flags = (_flags & ~F_binary) | F_text;
436 return ((_flags & F_binary) != 0);
446 return ((_flags & (F_binary | F_text)) != 0);
457 return ((_flags & F_text) != 0);
469 _flags = (_flags & ~F_type) | type;
486 return (Type)(_flags & (int)F_type);
508 _flags &= ~F_pattern;
520 return (_flags & F_pattern) != 0;
532 return (_hash_start != _hash_end);
541 return _filename.substr(_hash_start);
550 return _filename.empty() || _filename[0] !=
'/';
564 (_filename.size() > 2 && _filename[0] ==
'.' && _filename[1] ==
'/') ||
565 (!_filename.empty() && _filename[0] ==
'/');
571 INLINE
bool Filename::
572 operator == (
const std::string &other)
const {
573 return (*(std::string *)
this) == other;
579 INLINE
bool Filename::
580 operator != (
const std::string &other)
const {
581 return (*(std::string *)
this) != other;
587 INLINE
bool Filename::
588 operator < (
const std::string &other)
const {
589 return (*(std::string *)
this) < other;
595 INLINE
int Filename::
596 compare_to(
const Filename &other)
const {
597 return strcmp(_filename.c_str(), other._filename.c_str());
612 return !_filename.empty();
618 INLINE
void Filename::
619 output(std::ostream &out)
const {
631 _filesystem_encoding = encoding;
640 return _filesystem_encoding;