LeechCraft
0.6.70-18808-g3467692359
Modular cross-platform feature rich live environment.
Toggle main menu visibility
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
16
namespace
LC::Util::oral
17
{
18
struct
CharEnumTypeName
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
{
29
Fst
first
;
30
Snd
second
;
31
};
32
33
template
<
typename
Enum, NttpPair<Enum,
char
>... Chars>
34
requires
std::is_enum_v<Enum>
35
struct
ConvertEnum
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>
68
requires
Converter<T, Base, ToBaseType>
&&
Converter<Base, T, FromBaseType>
69
struct
ConvertVia
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>
85
struct
AsDataStream
86
{
87
T
Val_
;
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
;
101
AsDataStream
(
AsDataStream
&&) =
default
;
102
103
AsDataStream
&
operator=
(
const
AsDataStream
&) =
default
;
104
AsDataStream
&
operator=
(
AsDataStream
&&) =
default
;
105
106
template
<
typename
... Args>
107
AsDataStream
(Args&&... args)
108
:
Val_
{ std::forward<Args> (args)... }
109
{
110
}
111
112
template
<
typename
U>
113
AsDataStream
&
operator=
(U&& val)
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>
140
struct
ConvertT
<
AsDataStream
<T>>
141
:
ConvertVia
<
142
AsDataStream<T>,
143
QByteArray,
144
&AsDataStream<T>::ToByteArray,
145
&AsDataStream<T>::FromByteArray
146
> {};
147
}
LC::Util::oral::Converter
Definition
utilitytypes.h:65
LC::Util::oral
Definition
migrate.h:15
LC::Util::oral::Convert
constexpr auto Convert
Definition
oral.h:231
LC::Util::Snd
constexpr auto Snd
Definition
prelude.h:220
LC::Util::Fst
constexpr auto Fst
Definition
prelude.h:218
oral.h
LC::Util::oral::AsDataStream
Definition
utilitytypes.h:86
LC::Util::oral::AsDataStream::AsDataStream
AsDataStream(const AsDataStream &)=default
LC::Util::oral::AsDataStream::FromByteArray
static AsDataStream FromByteArray(const QByteArray &ba)
Definition
utilitytypes.h:129
LC::Util::oral::AsDataStream::AsDataStream
AsDataStream(AsDataStream &&)=default
LC::Util::oral::AsDataStream::Val_
T Val_
Definition
utilitytypes.h:87
LC::Util::oral::AsDataStream::AsDataStream
AsDataStream()=default
LC::Util::oral::AsDataStream::ToByteArray
QByteArray ToByteArray() const
Definition
utilitytypes.h:119
LC::Util::oral::AsDataStream::AsDataStream
AsDataStream(Args &&... args)
Definition
utilitytypes.h:107
LC::Util::oral::AsDataStream::operator=
AsDataStream & operator=(const AsDataStream &)=default
LC::Util::oral::CharEnumTypeName
Definition
utilitytypes.h:19
LC::Util::oral::CharEnumTypeName::operator()
constexpr auto operator()() const noexcept
Definition
utilitytypes.h:20
LC::Util::oral::ConvertEnum
Definition
utilitytypes.h:36
LC::Util::oral::ConvertEnum::operator()
QVariant operator()(Enum val) const
Definition
utilitytypes.h:39
LC::Util::oral::ConvertT
Definition
oral.h:236
LC::Util::oral::ConvertVia
Definition
utilitytypes.h:70
LC::Util::oral::ConvertVia::operator()
static QVariant operator()(const T &t) noexcept(noexcept(std::invoke(ToBaseType, t)))
Definition
utilitytypes.h:73
LC::Util::oral::ConvertVia::BaseType
Base BaseType
Definition
utilitytypes.h:71
LC::Util::oral::NttpPair
Definition
utilitytypes.h:28
LC::Util::oral::NttpPair::second
Snd second
Definition
utilitytypes.h:30
LC::Util::oral::NttpPair::first
Fst first
Definition
utilitytypes.h:29
src
util
db
oral
utilitytypes.h
Generated by
1.17.0