Line data Source code
1 : ///\file
2 :
3 : /******************************************************************************
4 : The MIT License(MIT)
5 :
6 : Embedded Template Library.
7 : https://github.com/ETLCPP/etl
8 : https://www.etlcpp.com
9 :
10 : Copyright(c) 2025 BMW AG
11 :
12 : Permission is hereby granted, free of charge, to any person obtaining a copy
13 : of this software and associated documentation files(the "Software"), to deal
14 : in the Software without restriction, including without limitation the rights
15 : to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
16 : copies of the Software, and to permit persons to whom the Software is
17 : furnished to do so, subject to the following conditions :
18 :
19 : The above copyright notice and this permission notice shall be included in all
20 : copies or substantial portions of the Software.
21 :
22 : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23 : IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 : FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
25 : AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26 : LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27 : OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28 : SOFTWARE.
29 : ******************************************************************************/
30 :
31 : #ifndef ETL_CLOSURE_INCLUDED
32 : #define ETL_CLOSURE_INCLUDED
33 :
34 : #include <etl/platform.h>
35 : #include <etl/delegate.h>
36 : #include <etl/utility.h>
37 :
38 : namespace etl
39 : {
40 :
41 : //***************************************************************************
42 : template<typename>
43 : class closure;
44 :
45 : template<typename R, typename Arg0>
46 : class closure<R(Arg0)>
47 : {
48 : public:
49 : using fct = etl::delegate<R(Arg0)>;
50 :
51 : closure(fct const& f, Arg0 const arg0)
52 : : m_f(f), m_arg0(arg0)
53 : {
54 : }
55 :
56 : R operator()() const {
57 : return m_f(m_arg0);
58 : }
59 :
60 : private:
61 : fct m_f;
62 : Arg0 m_arg0;
63 : };
64 :
65 : template<typename R, typename Arg0, typename Arg1>
66 : class closure<R(Arg0, Arg1)>
67 : {
68 : public:
69 : using fct = etl::delegate<R(Arg0, Arg1)>;
70 :
71 280 : closure(fct const& f, Arg0 const arg0, Arg1 const arg1)
72 : : m_f(f), m_arg0(arg0), m_arg1(arg1)
73 : {
74 : }
75 :
76 30 : R operator()() const {
77 30 : return m_f(m_arg0, m_arg1);
78 : }
79 :
80 : private:
81 : fct m_f;
82 : Arg0 m_arg0;
83 : Arg1 m_arg1;
84 : };
85 :
86 : template<typename R, typename Arg0, typename Arg1, typename Arg2>
87 : class closure<R(Arg0, Arg1, Arg2)>
88 : {
89 : public:
90 : using fct = etl::delegate<R(Arg0, Arg1, Arg2)>;
91 :
92 9 : closure(fct const& f, Arg0 const arg0, Arg1 const arg1, Arg2 const arg2)
93 : : m_f(f), m_arg0(arg0), m_arg1(arg1), m_arg2(arg2)
94 : {
95 : }
96 :
97 2 : R operator()() const {
98 2 : return m_f(m_arg0, m_arg1, m_arg2);
99 : }
100 :
101 : private:
102 : fct m_f;
103 : Arg0 m_arg0;
104 : Arg1 m_arg1;
105 : Arg2 m_arg2;
106 : };
107 :
108 : template<typename R, typename Arg0, typename Arg1, typename Arg2, typename Arg3>
109 : class closure<R(Arg0, Arg1, Arg2, Arg3)>
110 : {
111 : public:
112 : using fct = etl::delegate<R(Arg0, Arg1, Arg2, Arg3)>;
113 :
114 : closure(fct const& f, Arg0 const arg0, Arg1 const arg1, Arg2 const arg2, Arg3 const arg3)
115 : : m_f(f), m_arg0(arg0), m_arg1(arg1), m_arg2(arg2), m_arg3(arg3)
116 : {
117 : }
118 :
119 : R operator()() const {
120 : return m_f(m_arg0, m_arg1, m_arg2, m_arg3);
121 : }
122 :
123 : private:
124 : fct m_f;
125 : Arg0 m_arg0;
126 : Arg1 m_arg1;
127 : Arg2 m_arg2;
128 : Arg3 m_arg3;
129 : };
130 :
131 : template<typename R, typename Arg0, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
132 : class closure<R(Arg0, Arg1, Arg2, Arg3, Arg4)>
133 : {
134 : public:
135 : using fct = etl::delegate<R(Arg0, Arg1, Arg2, Arg3, Arg4)>;
136 :
137 : closure(fct const& f, Arg0 const arg0, Arg1 const arg1, Arg2 const arg2, Arg3 const arg3, Arg4 const arg4)
138 : : m_f(f), m_arg0(arg0), m_arg1(arg1), m_arg2(arg2), m_arg3(arg3), m_arg4(arg4)
139 : {
140 : }
141 :
142 : R operator()() const {
143 : return m_f(m_arg0, m_arg1, m_arg2, m_arg3, m_arg4);
144 : }
145 :
146 : private:
147 : fct m_f;
148 : Arg0 m_arg0;
149 : Arg1 m_arg1;
150 : Arg2 m_arg2;
151 : Arg3 m_arg3;
152 : Arg4 m_arg4;
153 : };
154 : }
155 :
156 : #endif
|