49 class CLASS_DECL_ACME path :
56 using BASE_RANGE = typename ::string::BASE_RANGE;
57 using CHARACTER =
typename BASE_RANGE::CHARACTER;
58 using ITEM = CHARACTER;
61 path() { m_epath = e_path_file; }
62 path(enum_path epath) { m_epath = epath; }
67 path(
const path & path) : string(path), path_meta(path) {}
68 path(path&& path) : string(::transfer(path)), path_meta(::transfer(path)) {}
83 template < prototype_
character_range RANGE >
84 inline path(
const RANGE&
range, enum_path epath = e_path_none, e_type etype = e_type_unknown,
bool bNormalizePath =
true, ::i64 iSize = -1)
86 (!(::std::is_base_of_v < path, RANGE >
87 || ::std::is_same_v < path, RANGE >)) :
93 if (etype == e_type_doesnt_exist)
104 if (epath == e_path_none)
107 m_epath = file_path_get_type(*
this, epath);
120 bool bCertainlySyntathicallyDir = file_path_normalize_inline(*
this, m_epath);
122 if (bCertainlySyntathicallyDir)
125 m_etype = ((etype | e_type_folder2) & ~e_type_file2);
211 template < prototype_
character CHARACTER2 >
212 path(
const CHARACTER2 * start,
const CHARACTER2 * end, enum_path epath = e_path_none, e_type etype = e_type_unknown,
bool bNormalize =
true, ::i64 iSize = -1) :
213 path(::string(start, end), epath, etype, bNormalize, iSize) {}
214 template < prototype_
character CHARACTER2 >
215 path(
const CHARACTER2 * start, enum_path epath = e_path_none, e_type etype = e_type_unknown,
bool bNormalize =
true, ::i64 iSize = -1) :
216 path(::string(start), epath, etype, bNormalize, iSize) {}
217 template < prototype_
character CHARACTER2 >
218 path(
const CHARACTER2 * start, character_count len, enum_path epath = e_path_none, e_type etype = e_type_unknown,
bool bNormalize =
true, ::i64 iSize = -1) :
219 path(::string(start, len), epath, etype, bNormalize, iSize) {}
222 template < prototype_
character CHARACTER2,
character_count sizeMaximumLength >
223 path(
const inline_string < CHARACTER2, sizeMaximumLength > & inlinestring) :
224 path(inlinestring.begin(), inlinestring.end())
237 path(const_iterator begin, const_iterator end) : path(begin, end - begin) { }
250 template < prototype_
character CHARACTER2 >
251 path(CHARACTER2 chSrc, character_count repeat);
252 path(::ansi_character ansich) : path(::string(ansich)) {}
253 path(::wd16_character wd16ch) : path(::string(wd16ch)) {}
254 path(::wd32_character wd32ch) : path(::string(wd32ch)) {}
256 path(const ::atom &
atom);
257 path(const ::payload &
payload);
264 ::string consume_item()
269 auto iFind = path.find_index(
'/');
280 ::string str = path.left(iFind);
282 while (path[iFind] ==
'/')
289 path = path.substr(iFind);
327 ::windows_path windows_path()
const;
330 void set_type(enum_path epath);
332 path & set_file_path(const ::scoped_string & scopedstrFile);
333 path & set_folder_path(const ::scoped_string & scopedstrFolder);
335 path & set_file_path();
336 path & set_folder_path();
338 path& set_existent();
340 path& set_existent_file();
341 path& set_existent_folder();
344 constexpr e_type type()
const {
return m_etype; }
345 e_type & type() {
return m_etype; }
346 bool is_unknown_type()
const {
return this->type() == ::file::e_type_unknown; }
347 void set_type(e_type etype) { m_etype = etype; }
350 constexpr ::i32_boolean does_exist()
const {
return (m_etype & e_type_exists) && !(m_etype & e_type_doesnt_exist); }
351 constexpr ::i32_boolean is_file()
const {
return (m_etype & e_type_file2); }
352 constexpr ::i32_boolean is_folder()
const {
return (m_etype & e_type_folder2); }
353 constexpr ::i32_boolean is_file_or_folder()
const {
return is_file() || is_folder(); }
354 constexpr ::i32_boolean not_file_or_folder()
const {
return !is_file_or_folder(); }
355 constexpr ::i32_boolean is_existent_file()
const {
return is_file() && does_exist(); }
356 constexpr ::i32_boolean is_existent_folder()
const {
return is_folder() && does_exist(); }
357 constexpr ::i32_boolean is_existent_file_or_folder()
const {
return is_file_or_folder() && does_exist(); }
361 void set_all_extensions(const ::scoped_string& scopestrExtension);
362 void set_final_extension(const ::scoped_string& scopestrExtension);
363 void set_extension_if_no_extension(const ::scoped_string & scopestrExtension);
377 void defer_set_extension(const ::string_array_base& straPreserveExtensions, const ::string_array_base& straRelatedExtensions);
378 void defer_set_extension(const ::string_array_base& straPreserveExtensions);
379 void defer_set_extension(const ::file::file_dialog * pdialog);
381 ::file::path with_all_extensions(const ::scoped_string& scopestrExtension)
const;
382 ::file::path with_final_extension(const ::scoped_string& scopestrExtension)
const;
383 ::file::path with_extension_if_no_extension(const ::scoped_string& scopestrExtension)
const;
385 ::file::path with_deferred_extension(const ::string_array_base & straPreserveExtensions, const ::string_array_base& straRelatedExtensions)
const;
386 ::file::path with_deferred_extension(const ::string_array_base & straPreserveExtensions)
const;
387 ::file::path with_deferred_extension(const ::file::file_dialog* pdialog)
const;
411 path & operator = (const ::file::path & path);
449 bool is_equal_fast(
const path & path)
const
454 if (ansi_icmp(c_str(), path.c_str()) == 0)
459 if (ansi_cmp(c_str(), path.c_str()) == 0)
469 bool operator == (
const path & path)
const
472 return is_equal_fast(path);
476 template <
character_count n >
477 bool operator == (const ::i8 (&cha)[n])
const
480 return operator ==(::string(cha));
484 bool operator == (const ::scoped_string & scopedstr)
const;
496 bool operator == (const ::string & str)
const;
499 bool operator != (
const path & path)
const;
501 bool operator != (const ::ansi_string & str)
const;
503 bool operator != (const ::scoped_string & scopedstr)
const;
521 path & operator += (const ::scoped_string & scopedstr);
526 path slashed_path(const ::scoped_string & scopedstr)
const;
532 path slash_path(const ::scoped_string & scopedstr)
const;
536 path & operator /= (const ::scoped_string & scopedstr);
540 bool is_empty()
const;
541 bool has_character()
const;
556 path.flags() |= eflag;
558 return ::transfer(path);
591 path sibling(const ::scoped_string & scopedstr)
const;
596 path operator * (const ::scoped_string & scopedstr)
const;
602 path & operator *= (const ::scoped_string & scopedstr);
605 ::const_ansi_range title()
const;
607 ::const_ansi_range name()
const;
624 ::const_ansi_range all_extensions()
const;
628 ::const_ansi_range final_extension()
const;
636 auto relative()
const
639 return this->substr(maximum(0, m_iBasePathLength));
645 path folder(::i32 i)
const;
647 path ascendant(::i32 i)
const;
649 path & ascend(::i32 i);
650 path operator - (::i32 i)
const {
return this->ascendant(i); }
651 path & operator -= (::i32 i);
654 ::string_array_base parts()
const;
659 ::file::path & patch_base_path(const ::file::path & pathBase);
668 using string::_get_count_parts_from_beginning;
673 const_ansi_range _get_count_parts_from_beginning(::collection::count iPathPartCountToConsume)
const;
675 const_ansi_range get_count_parts_from_beginning(::collection::count iPathPartCountToConsume)
const;