Krita Source Code Documentation
Loading...
Searching...
No Matches
KisLager.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2023 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#ifndef KISLAGER_H
7#define KISLAGER_H
8
9#include <QtGlobal>
10#include <QVariant>
11#include <type_traits>
12#include "KisMpl.h"
13
14#include <lager/lenses.hpp>
15#include <lager/reader.hpp>
16
17
18namespace kislager {
19
34template <typename Func, typename... Cursors,
35 typename FirstCursor = typename kismpl::first_type_t<std::remove_reference_t<Cursors>...>::value_type,
36 typename T = typename FirstCursor::value_type>
37std::optional<lager::reader<T>> fold_optional_cursors(const Func &func, Cursors&& ...cursors) {
38 auto fold_func = [func] (const auto &lhs, const auto &rhs) {
39 return lager::with(lhs, rhs).map(func);
40 };
41
42 return kismpl::fold_optional(fold_func, cursors...);
43}
44
45namespace lenses {
46template <typename T>
47auto scale = [] (T multiplier) {
48 return lager::lenses::getset(
49 [multiplier] (T value) { return value * multiplier; },
50 [multiplier] (T, T value) { return value / multiplier; }
51 );
52};
53
54constexpr auto scale_int_to_real = [] (qreal multiplier) {
55 return lager::lenses::getset(
56 [multiplier] (int value) { return value * multiplier; },
57 [multiplier] (int, qreal value) { return qRound(value / multiplier); }
58 );
59};
60
61constexpr auto scale_real_to_int = [] (qreal multiplier) {
62 return lager::lenses::getset(
63 [multiplier] (qreal value) { return qRound(value * multiplier); },
64 [multiplier] (qreal, int value) { return value / multiplier; }
65 );
66};
67
68template <typename Src, typename Dst, typename SrcConstRef = std::add_lvalue_reference_t<std::add_const_t<Src>>>
69auto do_static_cast = lager::lenses::getset(
70 [] (SrcConstRef value) { return static_cast<Dst>(value); },
71 [] (Src, Dst value) { return static_cast<Src>(value); }
72 );
73
81template <typename Derived, typename Base,
82 typename = std::enable_if_t<
83 std::is_base_of_v<Base, Derived>>>
84auto to_base2 = lager::lenses::getset(
85 [] (const Derived &value) -> Base { return static_cast<const Base&>(value); },
86 [] (Derived src, const Base &value) { static_cast<Base&>(src) = value; return src; }
87 );
88
97template <typename Base>
98auto to_base = lager::lenses::getset(
99 [] (const auto &value) -> Base { return static_cast<const Base&>(value); },
100 [] (auto src, const Base &value) { static_cast<Base&>(src) = value; return src; }
101 );
102
103template <typename T>
104auto variant_to = lager::lenses::getset(
105 [] (const QVariant &src) {
106 return src.value<T>();
107 },
108 [] (QVariant src, const T &value) {
109 src = QVariant::fromValue<T>(value);
110 return src;
111 }
112);
113
114constexpr auto logical_not = [] {
115 return lager::lenses::getset(
116 [](bool value) -> bool {
117 return !value;
118 },
119 [](bool, bool value) -> bool {
120 return !value;
121 });
122};
123
124} // namespace lenses
125
126} // namespace kislager
127
128
129#endif // KISLAGER_H
float value(const T *src, size_t ch)
auto do_static_cast
Definition KisLager.h:69
constexpr auto logical_not
Definition KisLager.h:114
constexpr auto scale_real_to_int
Definition KisLager.h:61
constexpr auto scale_int_to_real
Definition KisLager.h:54
std::optional< lager::reader< T > > fold_optional_cursors(const Func &func, Cursors &&...cursors)
Definition KisLager.h:37
std::optional< T > fold_optional(Fun &&fun, Args &&...args)
Definition KisMpl.h:137
typename first_type< T... >::type first_type_t
Definition KisMpl.h:101