22 return "VARCHAR(1)"_ct;
26 template<
typename Fst,
typename Snd>
33 template<
typename Enum, NttpPair<Enum,
char>... Chars>
34 requires std::is_enum_v<Enum>
37 static_assert (
sizeof... (Chars) > 0);
41 for (
const auto& [e, ch] : { Chars... })
43 return QString { QChar { ch } };
45 throw std::runtime_error {
"invalid enum value " + std::to_string (
static_cast<int> (val)) };
50 if (
const auto& str = var.toString ();
53 const auto ch = str.at (0).toLatin1 ();
54 for (
const auto& [k, v] : { Chars... })
59 qWarning () <<
"invalid stored value:" << var;
60 return Chars... [0].first;
64 template<
typename From,
typename To, auto Cvt>
65 concept Converter =
requires (
const From& from) { { std::invoke (Cvt, from) } -> std::same_as<To>; };
67 template<
typename T,
typename Base, auto ToBaseType, auto FromBaseType>
73 static QVariant
operator() (
const T& t)
noexcept (
noexcept (std::invoke (ToBaseType, t)))
78 static T
operator() (
const QVariant& var)
noexcept (
noexcept (std::invoke (FromBaseType, std::declval<const BaseType&> ())))
96 return std::move (
Val_);
106 template<
typename... Args>
108 :
Val_ { std::forward<Args> (args)... }
115 Val_ = std::forward<U> (val);
123 QDataStream out { &ba, QIODevice::WriteOnly };
131 QDataStream in { ba };
144 &AsDataStream<T>::ToByteArray,
145 &AsDataStream<T>::FromByteArray
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)))