Skip to content

Latest commit

 

History

History
67 lines (53 loc) · 3 KB

lexically_relative.md

File metadata and controls

67 lines (53 loc) · 3 KB

lexically_relative

  • filesystem[meta header]
  • std::filesystem[meta namespace]
  • path[meta class]
  • function[meta id-type]
  • cpp17[meta cpp]
path lexically_relative(const path& base) const;

概要

文字列レベルで相対パスに変換する。

この関数は、*thisが保持するパス文字列を、パスbaseからの相対パスに変換する。ただし、この関数ではファイルシステムを介さず文字列レベルで相対パスへの変換をするため、相対パスを解決できない場合がある。相対パスが解決できなかった場合は、空のパスが返る。ファイルシステムを介した相対パスへの変換を行う場合は、std::filesystem::relative()関数を使用すること。

効果

  1. 以下のいずれかの条件に一致する場合、相対パスの解決ができず、空のパスが返る:
  2. 以下の式で、*thisbaseが異なる最初の位置を見つける:
  3. a == end()かつb == base.end()の場合、path(".")が返る
  4. イテレータ範囲[b, base.end())の非"." (ドットx1) かつ非".." (ドットx2) の数から、同範囲内の ".." の数を引いたものをnとする
  5. n < 0であれば、空のパスが返る
  6. 新たなpath型オブジェクトpをデフォルト構築し、
  7. p /= path("..")をn回を適用する
  8. イテレータ範囲[a, end())の各要素xを、式p /= xで加算する

備考

  • この関数は、*thisbaseのどちらに対してもパスの正規化を行わない。必要であれば、どちらか、もしくは両方にlexically_normal()メンバ関数を適用すること

#include <cassert>
#include <filesystem>

namespace fs = std::filesystem;

int main()
{
  assert(fs::path("/a/d").lexically_relative("/a/b/c") == "../../d");
  assert(fs::path("/a/b/c").lexically_relative("/a/d") == "../b/c");
  assert(fs::path("a/b/c").lexically_relative("a") == "b/c");
  assert(fs::path("a/b/c").lexically_relative("a/b/c/x/y") == "../..");
  assert(fs::path("a/b/c").lexically_relative("a/b/c") == ".");
  assert(fs::path("a/b").lexically_relative("c/d") == "../../a/b");
}
  • lexically_relative[color ff0000]

出力

バージョン

言語

  • C++17

処理系