LeechCraft 0.6.70-18808-g3467692359
Modular cross-platform feature rich live environment.
Loading...
Searching...
No Matches
utilitytypes.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 <utility>
12#include <QDataStream>
13#include <QByteArray>
14#include "oral.h"
15
16namespace LC::Util::oral
17{
19 {
20 constexpr auto operator() () const noexcept
21 {
22 return "VARCHAR(1)"_ct;
23 }
24 };
25
26 template<typename Fst, typename Snd>
27 struct NttpPair
28 {
31 };
32
33 template<typename Enum, NttpPair<Enum, char>... Chars>
34 requires std::is_enum_v<Enum>
36 {
37 static_assert (sizeof... (Chars) > 0);
38
39 QVariant operator() (Enum val) const
40 {
41 for (const auto& [e, ch] : { Chars... })
42 if (e == val)
43 return QString { QChar { ch } };
44
45 throw std::runtime_error { "invalid enum value " + std::to_string (static_cast<int> (val)) };
46 }
47
48 Enum operator() (const QVariant& var) const
49 {
50 if (const auto& str = var.toString ();
51 str.size () == 1)
52 {
53 const auto ch = str.at (0).toLatin1 ();
54 for (const auto& [k, v] : { Chars... })
55 if (v == ch)
56 return k;
57 }
58
59 qWarning () << "invalid stored value:" << var;
60 return Chars... [0].first;
61 }
62 };
63
64 template<typename From, typename To, auto Cvt>
65 concept Converter = requires (const From& from) { { std::invoke (Cvt, from) } -> std::same_as<To>; };
66
67 template<typename T, typename Base, auto ToBaseType, auto FromBaseType>
70 {
71 using BaseType = Base;
72
73 static QVariant operator() (const T& t) noexcept (noexcept (std::invoke (ToBaseType, t)))
74 {
75 return Convert<BaseType> (std::invoke (ToBaseType, t));
76 }
77
78 static T operator() (const QVariant& var) noexcept (noexcept (std::invoke (FromBaseType, std::declval<const BaseType&> ())))
79 {
80 return std::invoke (FromBaseType, Convert<BaseType> (var));
81 }
82 };
83
84 template<typename T>
86 {
88
89 operator T () const &
90 {
91 return Val_;
92 }
93
94 operator T&& () &&
95 {
96 return std::move (Val_);
97 }
98
99 AsDataStream () = default;
100 AsDataStream (const AsDataStream&) = default;
102
105
106 template<typename... Args>
107 AsDataStream (Args&&... args)
108 : Val_ { std::forward<Args> (args)... }
109 {
110 }
111
112 template<typename U>
114 {
115 Val_ = std::forward<U> (val);
116 return *this;
117 }
118
119 QByteArray ToByteArray () const
120 {
121 QByteArray ba;
122 {
123 QDataStream out { &ba, QIODevice::WriteOnly };
124 out << Val_;
125 }
126 return ba;
127 }
128
129 static AsDataStream FromByteArray (const QByteArray& ba)
130 {
131 QDataStream in { ba };
132
133 AsDataStream res;
134 in >> res.Val_;
135 return res;
136 }
137 };
138
139 template<typename T>
141 : ConvertVia<
142 AsDataStream<T>,
143 QByteArray,
144 &AsDataStream<T>::ToByteArray,
145 &AsDataStream<T>::FromByteArray
146 > {};
147}
constexpr auto Convert
Definition oral.h:231
constexpr auto Snd
Definition prelude.h:220
constexpr auto Fst
Definition prelude.h:218
AsDataStream(const AsDataStream &)=default
static AsDataStream FromByteArray(const QByteArray &ba)
AsDataStream(AsDataStream &&)=default
QByteArray ToByteArray() const
AsDataStream(Args &&... args)
AsDataStream & operator=(const AsDataStream &)=default
constexpr auto operator()() const noexcept
QVariant operator()(Enum val) const
static QVariant operator()(const T &t) noexcept(noexcept(std::invoke(ToBaseType, t)))