1c352fa74SLouis Dionne // -*- C++ -*-
2c352fa74SLouis Dionne //===----------------------------------------------------------------------===//
3c352fa74SLouis Dionne //
4c352fa74SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5c352fa74SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
6c352fa74SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7c352fa74SLouis Dionne //
8c352fa74SLouis Dionne //===----------------------------------------------------------------------===//
9c352fa74SLouis Dionne
10c352fa74SLouis Dionne #ifndef TEST_STD_INPUT_OUTPUT_FILESYSTEMS_CLASS_PATH_PATH_HELPER_H
11c352fa74SLouis Dionne #define TEST_STD_INPUT_OUTPUT_FILESYSTEMS_CLASS_PATH_PATH_HELPER_H
12c352fa74SLouis Dionne
13c352fa74SLouis Dionne #include <cstddef>
14c352fa74SLouis Dionne #include <iterator>
15c352fa74SLouis Dionne
16*ac8c9f1eSLouis Dionne #include <filesystem>
17c352fa74SLouis Dionne #include "make_string.h"
18*ac8c9f1eSLouis Dionne namespace fs = std::filesystem;
19c352fa74SLouis Dionne
20c352fa74SLouis Dionne // Testing the allocation behavior of the code_cvt functions requires
21c352fa74SLouis Dionne // *knowing* that the allocation was not done by "path::__str_".
22c352fa74SLouis Dionne // This hack forces path to allocate enough memory.
PathReserve(fs::path & p,std::size_t N)23c352fa74SLouis Dionne inline void PathReserve(fs::path& p, std::size_t N) {
24c352fa74SLouis Dionne auto const& native_ref = p.native();
25c352fa74SLouis Dionne const_cast<fs::path::string_type&>(native_ref).reserve(N);
26c352fa74SLouis Dionne }
27c352fa74SLouis Dionne
PathEq(fs::path const & LHS,fs::path const & RHS)28c352fa74SLouis Dionne inline bool PathEq(fs::path const& LHS, fs::path const& RHS) {
29c352fa74SLouis Dionne return LHS.native() == RHS.native();
30c352fa74SLouis Dionne }
31c352fa74SLouis Dionne
PathEqIgnoreSep(fs::path LHS,fs::path RHS)32c352fa74SLouis Dionne inline bool PathEqIgnoreSep(fs::path LHS, fs::path RHS) {
33c352fa74SLouis Dionne LHS.make_preferred();
34c352fa74SLouis Dionne RHS.make_preferred();
35c352fa74SLouis Dionne return LHS.native() == RHS.native();
36c352fa74SLouis Dionne }
37c352fa74SLouis Dionne
38c352fa74SLouis Dionne template <class Iter>
IterEnd(Iter B)39c352fa74SLouis Dionne Iter IterEnd(Iter B) {
40c352fa74SLouis Dionne using VT = typename std::iterator_traits<Iter>::value_type;
41c352fa74SLouis Dionne for (; *B != VT{}; ++B)
42c352fa74SLouis Dionne ;
43c352fa74SLouis Dionne return B;
44c352fa74SLouis Dionne }
45c352fa74SLouis Dionne
46c352fa74SLouis Dionne template <class CharT>
StrEnd(CharT const * P)47c352fa74SLouis Dionne const CharT* StrEnd(CharT const* P) {
48c352fa74SLouis Dionne return IterEnd(P);
49c352fa74SLouis Dionne }
50c352fa74SLouis Dionne
51c352fa74SLouis Dionne template <class CharT>
StrLen(CharT const * P)52c352fa74SLouis Dionne std::size_t StrLen(CharT const* P) {
53c352fa74SLouis Dionne return StrEnd(P) - P;
54c352fa74SLouis Dionne }
55c352fa74SLouis Dionne
56c352fa74SLouis Dionne const MultiStringType PathList[] = {
57c352fa74SLouis Dionne MKSTR(""),
58c352fa74SLouis Dionne MKSTR(" "),
59c352fa74SLouis Dionne MKSTR("//"),
60c352fa74SLouis Dionne MKSTR("."),
61c352fa74SLouis Dionne MKSTR(".."),
62c352fa74SLouis Dionne MKSTR("foo"),
63c352fa74SLouis Dionne MKSTR("/"),
64c352fa74SLouis Dionne MKSTR("/foo"),
65c352fa74SLouis Dionne MKSTR("foo/"),
66c352fa74SLouis Dionne MKSTR("/foo/"),
67c352fa74SLouis Dionne MKSTR("foo/bar"),
68c352fa74SLouis Dionne MKSTR("/foo/bar"),
69c352fa74SLouis Dionne MKSTR("//net"),
70c352fa74SLouis Dionne MKSTR("//net/foo"),
71c352fa74SLouis Dionne MKSTR("///foo///"),
72c352fa74SLouis Dionne MKSTR("///foo///bar"),
73c352fa74SLouis Dionne MKSTR("/."),
74c352fa74SLouis Dionne MKSTR("./"),
75c352fa74SLouis Dionne MKSTR("/.."),
76c352fa74SLouis Dionne MKSTR("../"),
77c352fa74SLouis Dionne MKSTR("foo/."),
78c352fa74SLouis Dionne MKSTR("foo/.."),
79c352fa74SLouis Dionne MKSTR("foo/./"),
80c352fa74SLouis Dionne MKSTR("foo/./bar"),
81c352fa74SLouis Dionne MKSTR("foo/../"),
82c352fa74SLouis Dionne MKSTR("foo/../bar"),
83c352fa74SLouis Dionne MKSTR("c:"),
84c352fa74SLouis Dionne MKSTR("c:/"),
85c352fa74SLouis Dionne MKSTR("c:foo"),
86c352fa74SLouis Dionne MKSTR("c:/foo"),
87c352fa74SLouis Dionne MKSTR("c:foo/"),
88c352fa74SLouis Dionne MKSTR("c:/foo/"),
89c352fa74SLouis Dionne MKSTR("c:/foo/bar"),
90c352fa74SLouis Dionne MKSTR("prn:"),
91c352fa74SLouis Dionne MKSTR("c:\\"),
92c352fa74SLouis Dionne MKSTR("c:\\foo"),
93c352fa74SLouis Dionne MKSTR("c:foo\\"),
94c352fa74SLouis Dionne MKSTR("c:\\foo\\"),
95c352fa74SLouis Dionne MKSTR("c:\\foo/"),
96c352fa74SLouis Dionne MKSTR("c:/foo\\bar"),
97c352fa74SLouis Dionne MKSTR("//"),
98c352fa74SLouis Dionne MKSTR("/finally/we/need/one/really/really/really/really/really/really/really/long/string")
99c352fa74SLouis Dionne };
100c352fa74SLouis Dionne const unsigned PathListSize = sizeof(PathList) / sizeof(MultiStringType);
101c352fa74SLouis Dionne
102c352fa74SLouis Dionne #endif // TEST_STD_INPUT_OUTPUT_FILESYSTEMS_CLASS_PATH_PATH_HELPER_H
103