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)) : BasicSmallString(BasicSmallString::fromQString(qString))
{} {}
template<typename Type, BasicSmallString(const QByteArray &qByteArray)
typename = std::enable_if_t<std::is_same<std::decay_t<Type>, std::string>::value> : BasicSmallString(qByteArray.constData(), qByteArray.size())
>
BasicSmallString(Type &&string)
: BasicSmallString(string.data(), string.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, template<typename BeginIterator,
typename EndIterator, typename EndIterator,
typename = std::enable_if_t<std::is_same<BeginIterator, EndIterator>::value> typename = std::enable_if_t<std::is_same<BeginIterator, EndIterator>::value>

View File

@@ -34,6 +34,18 @@
namespace Utils { 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 class SmallStringView
{ {
public: 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_pointer(string.data()),
m_size(string.size()) m_size(string.size())
{ {