Utils: Introduce flexible constructor for SmallString and SmallStringView

If a class has a data method that returns a char pointer it can be 
used to construct a SmallString and a SmallStringView.

Change-Id: I02dcba50babb3074b58998e5f907799e84361ed7
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Marco Bubke
2018-01-17 11:49:06 +01:00
parent 05b86568d9
commit b3bed4c306
2 changed files with 24 additions and 6 deletions

View File

@@ -126,13 +126,17 @@ public:
: BasicSmallString(BasicSmallString::fromQString(qString))
{}
template<typename Type,
typename = std::enable_if_t<std::is_same<std::decay_t<Type>, std::string>::value>
>
BasicSmallString(Type &&string)
: BasicSmallString(string.data(), string.size())
BasicSmallString(const QByteArray &qByteArray)
: BasicSmallString(qByteArray.constData(), qByteArray.size())
{}
template<typename String,
typename Utils::enable_if_has_char_data_pointer<String> = 0>
BasicSmallString(const String &string)
: BasicSmallString(string.data(), string.size())
{
}
template<typename BeginIterator,
typename EndIterator,
typename = std::enable_if_t<std::is_same<BeginIterator, EndIterator>::value>

View File

@@ -34,6 +34,18 @@
namespace Utils {
template <typename String>
using enable_if_has_char_data_pointer = typename std::enable_if_t<
std::is_same<
std::remove_const_t<
std::remove_pointer_t<
std::result_of_t<
decltype(&String::data)(String)
>
>
>, char>::value
, int>;
class SmallStringView
{
public:
@@ -67,7 +79,9 @@ public:
{
}
SmallStringView(const std::string &string) noexcept
template<typename String,
typename Utils::enable_if_has_char_data_pointer<String> = 0>
SmallStringView(const String &string) noexcept
: m_pointer(string.data()),
m_size(string.size())
{