28 #ifndef YB_INC_ystdex_path_hpp_
29 #define YB_INC_ystdex_path_hpp_ 1
46 template<
typename _type>
80 clone() const override = 0;
85 template<typename _type>
92 template<typename _tChar, class _tAlloc>
93 class file_path_norm<std::basic_string<_tChar, _tAlloc>>
102 return str.length() == 1 && str[0] ==
'/';
108 return str.length() == 2 && str[0] ==
'.' && str[1] ==
'.';
120 return str.length() == 1 && str[0] ==
'.';
127 return new file_path_norm(*
this);
147 template<
class _tSeqCon,
168 =
typename base::container_type::const_reverse_iterator;
173 path(std::unique_ptr<norm> p = std::unique_ptr<norm>())
178 path(
base&& b, std::unique_ptr<norm> p = std::unique_ptr<norm>())
179 :
base(std::move(b)), p_norm(unique_norm(p))
186 std::unique_ptr<norm> p = std::unique_ptr<norm>())
187 :
path(n != 0 ? n : 1, std::move(p))
189 this->begin() = std::move(root);
191 template<
typename _tIn>
193 std::unique_ptr<norm> p = std::unique_ptr<norm>())
194 :
path(
base(first, last), std::move(p))
197 template<
typename... _tParams>
202 :
base(pth), p_norm(pth.get_norm().
clone())
209 path(std::initializer_list<value_type> il,
210 std::unique_ptr<norm> p = std::unique_ptr<norm>())
217 return *
this =
path(pth);
228 return *
this =
path(il);
239 using base::container_type::rbegin;
241 using base::container_type::rend;
243 using base::container_type::crbegin;
245 using base::container_type::crend;
249 using base::max_size;
261 using base::pop_back;
263 using base::push_back;
276 return typeid(get_norm()).before(
typeid(pth.
get_norm()))
277 &&
static_cast<const base&
>(*this) <
static_cast<const base&
>(pth);
283 return typeid(get_norm()) ==
typeid(pth.
get_norm())
284 && static_cast<const base&>(*
this) ==
static_cast<const base&
>(pth);
290 auto& nm(get_norm());
293 return nm.is_self(s);
307 return is_absolute() ? front() :
value_type();
313 return !empty() && get_norm().is_root(front());
319 return !is_absolute();
325 auto& nm(get_norm());
327 for(
auto i(this->begin()); i != this->end();)
329 auto j(std::adjacent_find(i, this->end(),
331 return !nm.is_self(x) && !nm.is_parent(x)
347 p_norm.swap(pth.p_norm);
351 static std::unique_ptr<norm>
354 return p ? std::move(p) : make_unique<default_norm>();
363 template<
class _tSeqCon,
class _tNorm>
370 template<
class _tSeqCon,
class _tNorm>
377 template<
class _tSeqCon,
class _tNorm>
384 template<
class _tSeqCon,
class _tNorm>
391 template<
class _tSeqCon,
class _tNorm>
398 template<
class _tSeqCon,
class _tNorm>
410 template<
class _tSeqCon,
class _tNorm>
421 template<
class _tSeqCon,
class _tNorm>
432 template<
class _tSeqCon,
class _tNorm>
433 typename _tSeqCon::value_type
435 const typename _tSeqCon::value_type& seperator = &
to_array<
438 static_assert(is_object<typename _tSeqCon::value_type>::value,
439 "Invalid type found.");
445 typename _tSeqCon::value_type res(*i);
447 while(++i != pth.end())
459 template<
class _tSeqCon,
class _tNorm>
460 typename _tSeqCon::value_type
462 _tSeqCon::value_type>::
value_type delimiter =
'/')
464 static_assert(is_object<typename _tSeqCon::value_type>::value,
465 "Invalid type found.");
466 typename _tSeqCon::value_type res;
468 for(
const auto&
s : pth)
void assign(_tCon &c, _tParams &&...args)
插入参数指定的元素到容器。
virtual bool is_compatible_with(const path_norm &) const
bool operator>=(const path< _tSeqCon, _tNorm > &x, const path< _tSeqCon, _tNorm > &y)
typename container_type::const_reference const_reference
static auto first(const _tIterator &i) -> decltype((i->first))
bool operator!=(nullptr_t lhs, const _type &rhs)
path(_tIn first, _tIn last, std::unique_ptr< norm > p=std::unique_ptr< norm >())
path(base &&b, std::unique_ptr< norm > p=std::unique_ptr< norm >())
yconstfn const string _tParams && args
typename conditional< _bCond, _type, _type2 >::type conditional_t
path(std::initializer_list< value_type > il, std::unique_ptr< norm > p=std::unique_ptr< norm >())
_tSeqCon::value_type to_string_d(const path< _tSeqCon, _tNorm > &pth, typename string_traits< typename _tSeqCon::value_type >::value_type delimiter= '/')
取分隔符结尾的字符串表示。
std::array< _type, _vN > to_array(const _tSrc &src)
取指定参数转换为 std::array 对象。
path & operator=(std::initializer_list< value_type > il)
bool is_root(const value_type &str) override
std::basic_string< _tChar, _tAlloc > value_type
virtual ~path_norm()=default
bool equals(const path &pth) const
path(std::unique_ptr< norm > p=std::unique_ptr< norm >())
typename base::container_type::const_reverse_iterator const_reverse_iterator
typename container_type::size_type size_type
typename container_type::const_iterator const_iterator
std::unique_ptr< norm > p_norm
typename container_type::difference_type difference_type
#define yforward(_expr)
根据参数类型使用 std::forward 传递对应参数。
path & operator=(const path &pth)
bool is_parent(const value_type &str) override
bool operator>(const path< _tSeqCon, _tNorm > &x, const path< _tSeqCon, _tNorm > &y)
typename container_type::value_type value_type
满足容器要求。
void normalize(path< _tSeqCon, _tNorm > &pth)
正规化。
path & operator=(path &&pth)
void swap(any &x, any &y)
交换对象。
bool before(const path &pth) const
remove_rcv_t< decltype(std::declval< string_type >()[0])> value_type
file_path_norm * clone() const override
static std::unique_ptr< norm > unique_norm(std::unique_ptr< norm > &p)
#define ynothrow
YSLib 无异常抛出保证:若支持 noexcept 关键字, 指定特定的 noexcept 异常规范。
path(std::unique_ptr< norm > p, _tParams &&...args)
typename container_type::iterator iterator
#define yconstraint
约束:接口语义。
void swap(path< _tSeqCon, _tNorm > &x, path< _tSeqCon, _tNorm > &y)
交换。
value_type get_root() const
typename base::container_type::reverse_iterator reverse_iterator
typename container_type::reference reference
virtual bool is_self(const value_type &)=0
_tSeqCon::value_type to_string(const path< _tSeqCon, _tNorm > &pth, const typename _tSeqCon::value_type &seperator=&to_array< typename string_traits< typename _tSeqCon::value_type >::value_type >("/")[0])
取字符串表示。
virtual bool is_delimiter(const value_type &)=0
virtual bool is_root(const value_type &)=0
bool is_delimiter(const value_type &str) override
virtual bool is_parent(const value_type &)=0
bool is_self(const value_type &str) override
ystdex::conditional_t< std::is_default_constructible< norm >::value, norm, file_path_norm< value_type >> default_norm
void erase_all_if(_tRange &c, _fPred pred)
删除指定序列范围中满足条件的元素。
path(size_type n, std::unique_ptr< norm > p=std::unique_ptr< norm >())
virtual path_norm * clone() const override=0
path(size_type n, value_type root, std::unique_ptr< norm > p=std::unique_ptr< norm >())
bool operator==(nullptr_t lhs, const _type &rhs)