diff options
author | Daniel Wilhelm <daniel@wili.li> | 2015-10-02 14:55:46 +0200 |
---|---|---|
committer | Daniel Wilhelm <daniel@wili.li> | 2015-10-02 14:55:46 +0200 |
commit | b32d1e948b32a8f7607ebc30f10dda903426f63c (patch) | |
tree | 7fa78f18308671970198981b650e237bcd84957e /zen/string_traits.h | |
parent | 7.0 (diff) | |
download | FreeFileSync-b32d1e948b32a8f7607ebc30f10dda903426f63c.tar.gz FreeFileSync-b32d1e948b32a8f7607ebc30f10dda903426f63c.tar.bz2 FreeFileSync-b32d1e948b32a8f7607ebc30f10dda903426f63c.zip |
7.1
Diffstat (limited to 'zen/string_traits.h')
-rw-r--r-- | zen/string_traits.h | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/zen/string_traits.h b/zen/string_traits.h index 8c4775f4..12a7f87c 100644 --- a/zen/string_traits.h +++ b/zen/string_traits.h @@ -173,10 +173,8 @@ size_t cStringLength(const C* str) //naive implementation seems somewhat faster ++len; return len; } -} - -template <class S, typename = typename EnableIf<implementation::StringTraits<S>::isStringClass>::Type> inline +template <class S, typename = typename EnableIf<StringTraits<S>::isStringClass>::Type> inline const typename GetCharType<S>::Type* strBegin(const S& str) //SFINAE: T must be a "string" { return str.c_str(); @@ -190,18 +188,35 @@ inline const char* strBegin(const StringRef<char >& ref) { return ref.data( inline const wchar_t* strBegin(const StringRef<wchar_t>& ref) { return ref.data(); } -template <class S, typename = typename EnableIf<implementation::StringTraits<S>::isStringClass>::Type> inline +template <class S, typename = typename EnableIf<StringTraits<S>::isStringClass>::Type> inline size_t strLength(const S& str) //SFINAE: T must be a "string" { return str.length(); } -inline size_t strLength(const char* str) { return implementation::cStringLength(str); } -inline size_t strLength(const wchar_t* str) { return implementation::cStringLength(str); } +inline size_t strLength(const char* str) { return cStringLength(str); } +inline size_t strLength(const wchar_t* str) { return cStringLength(str); } inline size_t strLength(char) { return 1; } inline size_t strLength(wchar_t) { return 1; } inline size_t strLength(const StringRef<char >& ref) { return ref.length(); } inline size_t strLength(const StringRef<wchar_t>& ref) { return ref.length(); } } + +template <class S> inline +auto strBegin(S&& str) -> const typename GetCharType<S>::Type* +{ + static_assert(IsStringLike<S>::value, ""); + return implementation::strBegin(std::forward<S>(str)); +} + + +template <class S> inline +size_t strLength(S&& str) +{ + static_assert(IsStringLike<S>::value, ""); + return implementation::strLength(std::forward<S>(str)); +} +} + #endif //STRING_TRAITS_HEADER_813274321443234 |