55#ifndef CPPSPEC_DESCRIPTION_HPP
66#define CPPSPEC_DESCRIPTION_HPP
77#include < queue>
8- #include < unordered_map>
98#include " it.hpp"
109
1110namespace CppSpec {
@@ -23,7 +22,7 @@ class Description : public Runnable {
2322 std::deque<rule_block_t > after_alls;
2423 std::deque<rule_block_t > before_eaches;
2524 std::deque<rule_block_t > after_eaches;
26- std::unordered_map<std::string, Runnable *> lets;
25+ std::unordered_set<LetBase *> lets;
2726
2827 Description (){};
2928 Description (std::string descr) : descr(descr){};
@@ -69,11 +68,11 @@ class Description : public Runnable {
6968 void exec_after_eaches ();
7069
7170 template <typename T>
72- auto make_let (std::string name, T body) -> Let<decltype(body())>;
73- void add_let (std::string name, Runnable &body);
74- virtual Result run (Formatters::BaseFormatter &printer) override ;
71+ auto let (T body) -> Let<decltype(body())>;
7572 void reset_lets ();
76- Runnable *find_let (std::string);
73+
74+ virtual Result run (Formatters::BaseFormatter &printer) override ;
75+
7776 virtual std::string get_descr () { return descr; }
7877 virtual const std::string get_descr () const { return descr; }
7978 virtual std::string get_subject_type () { return " " ; }
@@ -156,12 +155,10 @@ void Description::exec_after_eaches() {
156155 * @return a new Let object
157156 */
158157template <typename T>
159- auto Description::make_let (std::string name, T body) -> Let<decltype(body())> {
160- return Let<decltype (body ())>(*this , name, body);
161- }
162-
163- void Description::add_let (std::string name, Runnable &body) {
164- lets.insert ({name, &body});
158+ auto Description::let (T body) -> Let<decltype(body())> {
159+ Let<decltype (body ())> let (body);
160+ lets.insert (&let);
161+ return let;
165162}
166163
167164Result Description::run (Formatters::BaseFormatter &printer) {
@@ -174,55 +171,16 @@ Result Description::run(Formatters::BaseFormatter &printer) {
174171}
175172
176173void Description::reset_lets () {
177- for (auto &pair : lets) {
178- auto base = static_cast <LetBase *>(pair.second ); // downcast.
179- base->reset ();
180- }
181-
182- if (has_parent ()) {
183- auto parent = static_cast <Description *>(get_parent ());
184- parent->reset_lets ();
185- }
186- }
187-
188- Runnable *Description::find_let (std::string name) {
189- auto got = lets.find (name);
190-
191- if (got == lets.end ()) {
192- if (this ->has_parent ()) {
193- auto parent = static_cast <Description *>(get_parent ());
194- return parent->find_let (name);
195- } else { // this should never, *ever* happen.
196- throw (std::out_of_range (" Could not find let '" + name + " '" ));
197- }
198- } else {
199- return got->second ;
200- }
201- }
202-
203- template <class T >
204- Expectations::Expectation<T> ItExpBase::expect (Let<T> let) {
205- auto parent = static_cast <Description *>(this ->get_parent ());
206- Let<T> *actual_let = static_cast <Let<T> *>(parent->find_let (let.get_name ()));
207- T res = actual_let->get_result ();
208- Expectations::Expectation<T> expectation (*this , res);
209- return expectation;
174+ for (auto &let : lets) let->reset ();
175+ if (this ->has_parent ()) this ->get_parent_as <Description *>()->reset_lets ();
210176}
211177
212178Result ItD::run (Formatters::BaseFormatter &printer) {
213- // if (!this->needs_descr() && printer.mode == BaseFormatter::Mode::verbose) {
214- // printer.format(*this);
215- // }
216-
217179 body (*this );
218-
219180 printer.format (*this );
220-
221- auto parent = static_cast <Description *>(this ->get_parent ());
222- parent->reset_lets ();
223-
181+ this ->get_parent_as <Description *>()->reset_lets ();
224182 return this ->get_status () ? Result::success : Result::failure;
225183}
226184
227- } // ::CppSpec
228- #endif // CPPSPEC_DESCRIPTION_HPP
185+ } // ::CppSpec
186+ #endif // CPPSPEC_DESCRIPTION_HPP
0 commit comments