Guitar
joinpath.h
Go to the documentation of this file.
1 
2 #ifndef JOINPATH_H
3 #define JOINPATH_H
4 
5 #include <string>
6 #include <vector>
7 
8 class JoinPath {
9 public:
10 
11  template <typename T> static void trimquot(T const **begin, T const **end)
12  {
13  if (*begin + 1 < *end && (*begin)[0] == '"' && (*end)[-1] == '"') {
14  (*begin)++;
15  (*end)--;
16  }
17  }
18 
19  template <typename T, typename U> static void joinpath_(T const *left, T const *right, U *vec)
20  {
21  size_t llen = 0;
22  size_t rlen = 0;
23  if (left) {
24  T const *leftend = left + std::char_traits<T>::length(left);
25  trimquot(&left, &leftend);
26  while (left < leftend && (leftend[-1] == '/' || leftend[-1] == '\\')) {
27  leftend--;
28  }
29  llen = leftend - left;
30  }
31  if (right) {
32  T const *rightend = right + std::char_traits<T>::length(right);
33  trimquot(&right, &rightend);
34  while (right < rightend && (right[0] == '/' || right[0] == '\\')) {
35  right++;
36  }
37  rlen = rightend - right;
38  }
39  vec->resize(llen + 1 + rlen);
40  if (llen > 0) {
41  std::char_traits<T>::copy(&vec->at(0), left, llen);
42  }
43  vec->at(llen) = '/';
44  if (rlen > 0) {
45  std::char_traits<T>::copy(&vec->at(llen + 1), right, rlen);
46  }
47  }
48 
49  static std::string joinpath(char const *left, char const *right)
50  {
51  std::vector<char> vec;
52  joinpath_(left, right, &vec);
53  return std::string(vec.begin(), vec.end());
54  }
55 
56  static std::string joinpath(std::string const &left, std::string const &right)
57  {
58  return joinpath(left.c_str(), right.c_str());
59  }
60 
61 };
62 
63 static inline std::string joinpath(char const *left, char const *right)
64 {
65  return JoinPath::joinpath(left, right);
66 }
67 
68 static inline std::string joinpath(std::string const &left, std::string const &right)
69 {
70  return JoinPath::joinpath(left, right);
71 }
72 
73 static inline std::string operator / (std::string const &left, std::string const &right)
74 {
75  return joinpath(left, right);
76 }
77 
78 #ifdef QT_VERSION
79 // #include <QString>
80 static inline QString qjoinpath(char16_t const *left, char16_t const *right)
81 {
82  std::vector<char16_t> vec;
83  JoinPath::joinpath_(left, right, &vec);
84  if (vec.empty()) return QString();
85  return QString::fromUtf16(&vec[0], vec.size());
86 }
87 
88 inline QString joinpath(QString const &left, QString const &right)
89 {
90  return qjoinpath((char16_t const *)left.utf16(), (char16_t const *)right.utf16());
91 }
92 
93 static inline QString operator / (QString const &left, QString const &right)
94 {
95  return joinpath(left, right);
96 }
97 #endif
98 
99 #endif
Definition: joinpath.h:8
static void joinpath_(T const *left, T const *right, U *vec)
Definition: joinpath.h:19
static std::string joinpath(std::string const &left, std::string const &right)
Definition: joinpath.h:56
static void trimquot(T const **begin, T const **end)
Definition: joinpath.h:11
static std::string joinpath(char const *left, char const *right)
Definition: joinpath.h:49
static std::string joinpath(char const *left, char const *right)
Definition: joinpath.h:63
static std::string operator/(std::string const &left, std::string const &right)
Definition: joinpath.h:73