xref: /llvm-project/libcxx/test/std/input.output/filesystems/class.path/path_helper.h (revision ac8c9f1e39e1a773fd81ce23dbf1c80ea186f226)
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