// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #pragma once #include "smallstringvector.h" #include #include #include #include #include namespace Utils { template QDataStream &operator<<(QDataStream &out, const BasicSmallString &string) { if (string.isEmpty()) out << quint32(0); else out.writeBytes(string.data(), qint32(string.size())); return out; } template QDataStream &operator>>(QDataStream &in, BasicSmallString &string) { quint32 size; in >> size; if (size > 0 ) { string.resize(size); char *data = string.data(); in.readRawData(data, int(size)); } return in; } template QDebug &operator<<(QDebug &debug, const BasicSmallString &string) { using QT_PREPEND_NAMESPACE(operator<<); debug.nospace().quote() << QByteArray::fromRawData(string.data(), int(string.size())); return debug; } template std::ostream &operator<<(std::ostream &out, const BasicSmallString &string) { out.write(string.data(), std::streamsize(string.size())); return out; } inline QDebug &operator<<(QDebug &debug, SmallStringView string) { using QT_PREPEND_NAMESPACE(operator<<); debug.nospace().quote() << QByteArray::fromRawData(string.data(), int(string.size())); return debug; } inline std::ostream &operator<<(std::ostream &out, SmallStringView string) { out.write(string.data(), std::streamsize(string.size())); return out; } template QDataStream &operator<<(QDataStream &out, const BasicSmallStringVector &stringVector) { out << quint64(stringVector.size()); for (auto &&string : stringVector) out << string; return out; } template QDataStream &operator>>(QDataStream &in, BasicSmallStringVector &stringVector) { stringVector.clear(); quint64 size; in >> size; stringVector.reserve(size); for (quint64 i = 0; i < size; ++i) { String string; in >> string; stringVector.push_back(std::move(string)); } return in; } template QDebug operator<<(QDebug debug, const BasicSmallStringVector &stringVector) { debug << "StringVector(" << stringVector.join(", ").constData() << ")"; return debug; } template std::ostream &operator<<(std::ostream &out, const BasicSmallStringVector &textVector) { return out << "[" << textVector.join("\", \"") << "]"; } } // namespace Utils namespace std { template<> struct hash { using argument_type = Utils::SmallString; using result_type = std::size_t; result_type operator()(const argument_type& string) const { return qHashBits(string.data(), string.size()); } }; template, typename KeyEqual = equal_to, typename Allocator = allocator>> QDataStream &operator<<(QDataStream &out, const unordered_map &map) { out << quint64(map.size()); for (auto &&entry : map) out << entry.first << entry.second; return out; } template, typename KeyEqual = equal_to, typename Allocator = allocator>> QDataStream &operator>>(QDataStream &in, unordered_map &map) { quint64 size; in >> size; map.reserve(size); for (quint64 i = 0; i < size; ++i) { Key key; Value value; in >> key >> value; map.insert(make_pair(move(key), move(value))); } return in; } template QDataStream &operator<<(QDataStream &out, const vector &vector) { out << quint64(vector.size()); for (auto &&entry : vector) out << entry; return out; } template QDataStream &operator>>(QDataStream &in, vector &vector) { vector.clear(); quint64 size; in >> size; vector.reserve(size); for (quint64 i = 0; i < size; ++i) { Type entry; in >> entry; vector.push_back(move(entry)); } return in; } } // namespace std QT_BEGIN_NAMESPACE template QDebug &operator<<(QDebug &debug, const std::vector &vector) { debug.noquote() << "["; for (auto &&entry : vector) debug.noquote() << entry << ", "; debug.noquote() << "]"; return debug; } QT_END_NAMESPACE