aboutsummaryrefslogtreecommitdiffstats
path: root/src/fs/Traits.cxx
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 /src/fs/Traits.cxx
parent83e6e3e31f2ebf8d7777cdf7e4131996ab94c4a4 (diff)
downloadmpd-289fdcc52b34e3ac4ff08355c47cb0e8bac6f737.tar.gz
mpd-289fdcc52b34e3ac4ff08355c47cb0e8bac6f737.tar.xz
mpd-289fdcc52b34e3ac4ff08355c47cb0e8bac6f737.zip
fs/Traits: implement GetBase/GetParent/Build using templates
Diffstat (limited to 'src/fs/Traits.cxx')
-rw-r--r--src/fs/Traits.cxx85
1 files changed, 63 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);
}