diff --git a/src/GenericParser.h b/src/GenericParser.h index 60f4e86d..780a3feb 100644 --- a/src/GenericParser.h +++ b/src/GenericParser.h @@ -97,7 +97,7 @@ typename Parser::ResultType parseFile(Parser& parser, if(fd == -1) { return Parser::ParserStateMachineType::noResult(); } - auto_delete_r fdDeleter(fd, close); + auto fdclose = defer(fd, close); char buf[4096]; ssize_t nread; ssize_t nproc; diff --git a/src/XmlParser.cc b/src/XmlParser.cc index bf46592c..289d04bb 100644 --- a/src/XmlParser.cc +++ b/src/XmlParser.cc @@ -53,7 +53,7 @@ bool parseFile(const std::string& filename, ParserStateMachine* psm) return false; } } - auto_delete_r fdDeleter(fd, close); + auto fdclose = defer(fd, close); XmlParser ps(psm); char buf[4096]; ssize_t nread; diff --git a/src/a2functional.h b/src/a2functional.h index 28a49001..ce419f41 100644 --- a/src/a2functional.h +++ b/src/a2functional.h @@ -54,33 +54,26 @@ public: } }; -template -class auto_delete_r { -private: - T obj_; - R (*deleter_)(T); -public: - auto_delete_r(T obj, R (*deleter)(T)):obj_(obj), deleter_(deleter) {} +template +struct Defer { + Defer(T t, F f) + : t(t), f(std::move(f)) + {} - ~auto_delete_r() + ~Defer() { - (void)deleter_(obj_); + f(t); } + + T t; + F f; }; -template -class auto_delete_container { -private: - Container* c_; -public: - auto_delete_container(Container* c):c_(c) {} - - ~auto_delete_container() - { - std::for_each(c_->begin(), c_->end(), Deleter()); - delete c_; - } -}; +template +Defer defer(T&& t, F f) +{ + return Defer(std::forward(t), std::forward(f)); +} template std::string strjoin(InputIterator first, InputIterator last,