aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Krjuchkov <denis@crazydev.net>2013-12-05 04:47:07 +0600
committerDenis Krjuchkov <denis@crazydev.net>2013-12-05 12:35:21 +0600
commit289fdcc52b34e3ac4ff08355c47cb0e8bac6f737 (patch)
treef9bc2e834f675050ab02e53c94c30e5ea673c6f0
parent83e6e3e31f2ebf8d7777cdf7e4131996ab94c4a4 (diff)
downloadmpd-289fdcc52b34e3ac4ff08355c47cb0e8bac6f737.tar.gz
mpd-289fdcc52b34e3ac4ff08355c47cb0e8bac6f737.tar.xz
mpd-289fdcc52b34e3ac4ff08355c47cb0e8bac6f737.zip
fs/Traits: implement GetBase/GetParent/Build using templates
-rw-r--r--src/fs/Traits.cxx85
-rw-r--r--src/fs/Traits.hxx25
2 files changed, 88 insertions, 22 deletions
diff --git a/src/fs/Traits.cxx b/src/fs/Traits.cxx
index 7dd8d20b6..934a9e2d0 100644
--- a/src/fs/Traits.cxx
+++ b/src/fs/Traits.cxx
@@ -22,24 +22,25 @@
#include <string.h>
-PathTraitsFS::string
-PathTraitsFS::Build(PathTraitsFS::const_pointer a, size_t a_size,
- PathTraitsFS::const_pointer b, size_t b_size)
+template<typename Traits>
+typename Traits::string
+BuildPathImpl(typename Traits::const_pointer a, size_t a_size,
+ typename Traits::const_pointer b, size_t b_size)
{
assert(a != nullptr);
assert(b != nullptr);
if (a_size == 0)
- return string(b, b_size);
+ return typename Traits::string(b, b_size);
if (b_size == 0)
- return string(a, a_size);
+ return typename Traits::string(a, a_size);
- string result(a, a_size);
+ typename Traits::string result(a, a_size);
- if (!IsSeparator(a[a_size - 1]))
- result.push_back(SEPARATOR);
+ if (!Traits::IsSeparator(a[a_size - 1]))
+ result.push_back(Traits::SEPARATOR);
- if (IsSeparator(b[0]))
+ if (Traits::IsSeparator(b[0]))
result.append(b + 1, b_size - 1);
else
result.append(b, b_size);
@@ -47,26 +48,66 @@ PathTraitsFS::Build(PathTraitsFS::const_pointer a, size_t a_size,
return result;
}
-PathTraitsUTF8::const_pointer
-PathTraitsUTF8::GetBase(PathTraitsUTF8::const_pointer p)
+template<typename Traits>
+typename Traits::const_pointer
+GetBasePathImpl(typename Traits::const_pointer p)
{
assert(p != nullptr);
- const char *slash = strrchr(p, SEPARATOR);
- return slash != nullptr
- ? slash + 1
+ typename Traits::const_pointer sep = Traits::FindLastSeparator(p);
+ return sep != nullptr
+ ? sep + 1
: p;
}
-PathTraitsUTF8::string
-PathTraitsUTF8::GetParent(PathTraitsUTF8::const_pointer p)
+template<typename Traits>
+typename Traits::string
+GetParentPathImpl(typename Traits::const_pointer p)
{
assert(p != nullptr);
- const char *slash = strrchr(p, SEPARATOR);
- if (slash == nullptr)
- return std::string(".");
- if (slash == p)
- return std::string(p, p + 1);
- return std::string(p, slash);
+ typename Traits::const_pointer sep = Traits::FindLastSeparator(p);
+ if (sep == nullptr)
+ return typename Traits::string(".");
+ if (sep == p)
+ return typename Traits::string(p, p + 1);
+ return typename Traits::string(p, sep);
+}
+
+PathTraitsFS::string
+PathTraitsFS::Build(PathTraitsFS::const_pointer a, size_t a_size,
+ PathTraitsFS::const_pointer b, size_t b_size)
+{
+ return BuildPathImpl<PathTraitsFS>(a, a_size, b, b_size);
+}
+
+PathTraitsFS::const_pointer
+PathTraitsFS::GetBase(PathTraitsFS::const_pointer p)
+{
+ return GetBasePathImpl<PathTraitsFS>(p);
+}
+
+PathTraitsFS::string
+PathTraitsFS::GetParent(PathTraitsFS::const_pointer p)
+{
+ return GetParentPathImpl<PathTraitsFS>(p);
+}
+
+PathTraitsUTF8::string
+PathTraitsUTF8::Build(PathTraitsUTF8::const_pointer a, size_t a_size,
+ PathTraitsUTF8::const_pointer b, size_t b_size)
+{
+ return BuildPathImpl<PathTraitsUTF8>(a, a_size, b, b_size);
+}
+
+PathTraitsUTF8::const_pointer
+PathTraitsUTF8::GetBase(PathTraitsUTF8::const_pointer p)
+{
+ return GetBasePathImpl<PathTraitsUTF8>(p);
+}
+
+PathTraitsUTF8::string
+PathTraitsUTF8::GetParent(PathTraitsUTF8::const_pointer p)
+{
+ return GetParentPathImpl<PathTraitsUTF8>(p);
}
diff --git a/src/fs/Traits.hxx b/src/fs/Traits.hxx
index 5ba82549e..bd65f53bf 100644
--- a/src/fs/Traits.hxx
+++ b/src/fs/Traits.hxx
@@ -84,6 +84,21 @@ struct PathTraitsFS {
}
/**
+ * Determine the "base" file name of the given native path.
+ * The return value points inside the given string.
+ */
+ gcc_pure gcc_nonnull_all
+ static const_pointer GetBase(const_pointer p);
+
+ /**
+ * Determine the "parent" file name of the given native path.
+ * As a special case, returns the string "." if there is no
+ * separator in the given input string.
+ */
+ gcc_pure gcc_nonnull_all
+ static string GetParent(const_pointer p);
+
+ /**
* Constructs the path from the given components.
* If either of the components is empty string,
* remaining component is returned unchanged.
@@ -139,6 +154,16 @@ struct PathTraitsUTF8 {
*/
gcc_pure gcc_nonnull_all
static string GetParent(const_pointer p);
+
+ /**
+ * Constructs the path from the given components.
+ * If either of the components is empty string,
+ * remaining component is returned unchanged.
+ * If both components are empty strings, empty string is returned.
+ */
+ gcc_pure gcc_nonnull_all
+ static string Build(const_pointer a, size_t a_size,
+ const_pointer b, size_t b_size);
};
#endif