LeechCraft  0.6.70-18450-gabe19ee3b0
Modular cross-platform feature rich live environment.
qtutil.h
Go to the documentation of this file.
1 /**********************************************************************
2  * LeechCraft - modular cross-platform feature rich internet client.
3  * Copyright (C) 2006-2014 Georg Rudoy
4  *
5  * Distributed under the Boost Software License, Version 1.0.
6  * (See accompanying file LICENSE or copy at https://www.boost.org/LICENSE_1_0.txt)
7  **********************************************************************/
8 
9 #pragma once
10 
11 #include "sllconfig.h"
12 #include <memory>
13 #include <utility>
14 #include <QLatin1String>
15 #include <QVariant>
16 #include "ctstring.h"
17 #include "typegetter.h"
18 
19 class QObject;
20 
21 namespace LC::Util
22 {
49  template<typename Assoc>
50  auto Stlize (Assoc&& assoc) noexcept
51  {
52  struct Range
53  {
54  Assoc Assoc_;
55 
56  auto begin () const { return Assoc_.keyValueBegin (); }
57  auto end () const { return Assoc_.keyValueEnd (); }
58  };
59 
60  return Range { std::forward<Assoc> (assoc) };
61  }
62 
63  template<typename Assoc>
64  auto StlizeKeys (Assoc&& assoc) noexcept
65  {
66  struct Range
67  {
68  Assoc Assoc_;
69 
70  auto begin () const { return Assoc_.keyBegin (); }
71  auto end () const { return Assoc_.keyEnd (); }
72  };
73 
74  return Range { std::forward<Assoc> (assoc) };
75  }
76 
89  inline QByteArray AsByteArray (std::string_view view) noexcept
90  {
91  return QByteArray::fromRawData (view.data (), static_cast<int> (view.size ()));
92  }
93 
104  inline QByteArray ToByteArray (std::string_view view) noexcept
105  {
106  return { view.data (), static_cast<int> (view.size ()) };
107  }
108 
114  inline std::string_view AsStringView (const QByteArray& arr) noexcept
115  {
116  return { arr.constData (), static_cast<size_t> (arr.size ()) };
117  }
118 
119  template<typename T, typename S>
120  std::pair<T, T> BreakAt (const T& str, S c) noexcept
121  {
122  const auto pos = str.indexOf (c);
123  if (pos == -1)
124  return { str, {} };
125 
126  return { str.left (pos), str.mid (pos + 1) };
127  }
128 
129  template<typename T>
130  void ReleaseInto (std::unique_ptr<T>&& ptr, QObject& parent)
131  {
132  ptr.release ()->setParent (&parent);
133  }
134 
135  inline QString UnsafeFromView (QStringView sv)
136  {
137  return QString::fromRawData (sv.data (), sv.size ());
138  }
139 
140  struct DetectRetType {};
141 
142  template<typename R = DetectRetType, typename... Fs>
143  auto HandleQVariant (const QVariant& variant, Fs&&... handlers)
144  {
145  using Ret_t = std::conditional_t<
146  std::is_same_v<R, DetectRetType>,
147  std::common_type<RetType_t<Fs>...>,
148  std::type_identity<R>
149  >::type;
150  return [&]<typename Head, typename... Rest> (this auto self, Head&& head, Rest&&... rest) -> Ret_t
151  {
152  if constexpr (!sizeof... (Rest))
153  return std::forward<Head> (head) ();
154  else
155  {
156  using HeadArg = std::decay_t<ArgType_t<Head, 0>>;
157  if (const auto val = get_if<HeadArg> (&variant))
158  return std::forward<Head> (head) (*val);
159  return self (std::forward<Rest> (rest)...);
160  }
161  } (std::forward<Fs> (handlers)...);
162 
163  }
164 }
165 
166 namespace LC
167 {
168  constexpr QLatin1String operator""_ql (const char *str, std::size_t size) noexcept
169  {
170  return QLatin1String { str, static_cast<int> (size) };
171  }
172 
173  constexpr QStringView operator""_qsv (const char16_t *str, std::size_t size) noexcept
174  {
175  return QStringView { str, static_cast<qsizetype> (size) };
176  }
177 
178  inline QByteArray operator""_qba (const char *str, std::size_t size) noexcept
179  {
180  return QByteArray { QByteArrayData { nullptr, const_cast<char*> (str), static_cast<qsizetype> (size) } };
181  }
182 
183  template<Util::CtString S>
184  QString operator""_qs () noexcept
185  {
186  return Util::ToString<S> ();
187  }
188 }
auto HandleQVariant(const QVariant &variant, Fs &&... handlers)
Definition: qtutil.h:143
QByteArray ToByteArray() noexcept
Definition: ctstring.h:146
std::string_view AsStringView(const QByteArray &arr) noexcept
Create a std::string_view referring the data within a QByteArray.
Definition: qtutil.h:114
auto Stlize(Assoc &&assoc) noexcept
Converts an Qt&#39;s associative sequence assoc to an STL-like iteratable range.
Definition: qtutil.h:50
auto StlizeKeys(Assoc &&assoc) noexcept
Definition: qtutil.h:64
std::pair< T, T > BreakAt(const T &str, S c) noexcept
Definition: qtutil.h:120
void ReleaseInto(std::unique_ptr< T > &&ptr, QObject &parent)
Definition: qtutil.h:130
QByteArray AsByteArray(std::string_view view) noexcept
Convert the view into a QByteArray without copying.
Definition: qtutil.h:89
auto Tup2 &&tup2 noexcept
Definition: ctstringutils.h:68
QString UnsafeFromView(QStringView sv)
Definition: qtutil.h:135