Scroom 0.14-49-gb7ae7a6d
Loading...
Searching...
No Matches
context.hh
Go to the documentation of this file.
1/*
2 * Scroom - Generic viewer for 2D data
3 * Copyright (C) 2009-2026 Kees-Jan Dijkzeul
4 *
5 * SPDX-License-Identifier: LGPL-2.1
6 */
7
8#pragma once
9
10#include <any>
11#include <exception>
12#include <functional>
13#include <memory>
14#include <optional>
15#include <string>
16#include <typeinfo>
17#include <utility>
18
19#include <scroom/interface.hh>
20
21namespace Scroom::Utils
22{
23 class Context : public Interface
24 {
25 public:
26 using Ptr = std::shared_ptr<Context>;
27 using ConstPtr = std::shared_ptr<const Context>;
28
29 class name_exists : public std::exception
30 {
31 };
32
33 class name_not_found : public std::exception
34 {
35 };
36
37 static Ptr create();
38
39 virtual void set(std::string name, std::any value) = 0;
40 [[nodiscard]] virtual const std::any& get(std::string name) const = 0;
41 [[nodiscard]] virtual std::any try_get(std::string name) const = 0;
42 };
43
45 {
46 public:
47 using Ptr = std::shared_ptr<RecursiveContext>;
48
49 static Ptr create();
50
51 virtual void add(const Context::ConstPtr& child) = 0;
52 };
53
54 template <typename T>
55 [[nodiscard]] T get(const Context::ConstPtr& context, std::string name)
56 {
57 const std::any& result = context->get(std::move(name));
58 try
59 {
60 return std::any_cast<T>(result);
61 }
62 catch(std::bad_any_cast&)
63 {
64 using F = std::function<T()>;
65 return std::any_cast<F>(result)();
66 }
67 }
68
69 template <typename T>
70 [[nodiscard]] T get(const Context::ConstPtr& context)
71 {
72 return get<T>(context, typeid(T).name());
73 }
74
75 template <typename T>
76 [[nodiscard]] std::optional<T> try_get(const Context::ConstPtr& context, std::string name)
77 {
78 try
79 {
80 return get<T>(context, std::move(name));
81 }
83 {
84 return std::nullopt;
85 }
86 }
87
88 template <typename T>
89 [[nodiscard]] std::optional<T> try_get(const Context::ConstPtr& context)
90 {
91 return try_get<T>(context, typeid(T).name());
92 }
93
94 template <typename T, typename Callable>
95 [[nodiscard]] auto get_or(const Context::ConstPtr& context, std::string name, const Callable& default_value)
96 -> std::enable_if_t<std::is_same_v<T, std::remove_reference_t<decltype(default_value())>>, T>
97 {
98 try
99 {
100 return get<T>(context, std::move(name));
101 }
103 {
104 return default_value();
105 }
106 }
107
108 template <typename T, typename Callable>
109 [[nodiscard]] auto get_or(const Context::ConstPtr& context, const Callable& default_value)
110 -> std::enable_if_t<std::is_same_v<T, std::remove_reference_t<decltype(default_value())>>, T>
111 {
112 return get_or<T>(context, typeid(T).name(), default_value);
113 }
114
115 template <typename T>
116 [[nodiscard]] T get_or(const Context::ConstPtr& context, std::string name, T default_value)
117 {
118 return get_or<T>(context, std::move(name), [&default_value] { return std::move(default_value); });
119 }
120
121 template <typename T>
122 [[nodiscard]] T get_or(const Context::ConstPtr& context, T default_value)
123 {
124 return get_or<T>(context, typeid(T).name(), [&default_value] { return std::move(default_value); });
125 }
126
127 template <typename T>
128 void set(const Context::Ptr& context, std::string name, T value)
129 {
130 context->set(std::move(name), std::any(std::move(value)));
131 }
132
133 template <typename T>
134 void set(const Context::Ptr& context, T value)
135 {
136 set(context, typeid(value).name(), std::move(value));
137 }
138
139 template <typename Callable>
140 void setFactory(const Context::Ptr& context, std::string name, Callable value)
141 {
142 using T = std::remove_reference_t<decltype(value())>;
143 set(context, std::move(name), std::function<T()>(std::move(value)));
144 }
145
146 template <typename Callable>
147 void setFactory(const Context::Ptr& context, Callable value)
148 {
149 using T = std::remove_reference_t<decltype(value())>;
150 setFactory(context, typeid(T).name(), std::move(value));
151 }
152
153} // namespace Scroom::Utils
const uint8_t value
Definition blob-tests.cc:114
Definition interface.hh:11
Definition context.hh:30
Definition context.hh:24
virtual std::any try_get(std::string name) const =0
std::shared_ptr< const Context > ConstPtr
Definition context.hh:27
static Ptr create()
Definition context.cc:15
virtual void set(std::string name, std::any value)=0
virtual const std::any & get(std::string name) const =0
std::shared_ptr< Context > Ptr
Definition context.hh:26
Definition context.hh:45
static Ptr create()
Definition context.cc:16
virtual void add(const Context::ConstPtr &child)=0
std::shared_ptr< RecursiveContext > Ptr
Definition context.hh:47
Definition tweak-view.hh:22
std::optional< T > try_get(const Context::ConstPtr &context, std::string name)
Definition context.hh:76
T get(const Context::ConstPtr &context, std::string name)
Definition context.hh:55
void set(const Context::Ptr &context, std::string name, T value)
Definition context.hh:128
auto get_or(const Context::ConstPtr &context, std::string name, const Callable &default_value) -> std::enable_if_t< std::is_same_v< T, std::remove_reference_t< decltype(default_value())> >, T >
Definition context.hh:95
void setFactory(const Context::Ptr &context, std::string name, Callable value)
Definition context.hh:140
SampleIterator< const uint8_t > result
Definition sampleiterator-tests.cc:94