Rewrite auto_deleter_r with defer function template

pull/287/head
Tatsuhiro Tsujikawa 2014-09-16 23:49:50 +09:00
parent fa5998ba85
commit d8cde1f499
3 changed files with 17 additions and 24 deletions

View File

@ -97,7 +97,7 @@ typename Parser::ResultType parseFile(Parser& parser,
if(fd == -1) { if(fd == -1) {
return Parser::ParserStateMachineType::noResult(); return Parser::ParserStateMachineType::noResult();
} }
auto_delete_r<int, int> fdDeleter(fd, close); auto fdclose = defer(fd, close);
char buf[4096]; char buf[4096];
ssize_t nread; ssize_t nread;
ssize_t nproc; ssize_t nproc;

View File

@ -53,7 +53,7 @@ bool parseFile(const std::string& filename, ParserStateMachine* psm)
return false; return false;
} }
} }
auto_delete_r<int, int> fdDeleter(fd, close); auto fdclose = defer(fd, close);
XmlParser ps(psm); XmlParser ps(psm);
char buf[4096]; char buf[4096];
ssize_t nread; ssize_t nread;

View File

@ -54,33 +54,26 @@ public:
} }
}; };
template<typename T, typename R> template<typename T, typename F>
class auto_delete_r { struct Defer {
private: Defer(T t, F f)
T obj_; : t(t), f(std::move(f))
R (*deleter_)(T); {}
public:
auto_delete_r(T obj, R (*deleter)(T)):obj_(obj), deleter_(deleter) {}
~auto_delete_r() ~Defer()
{ {
(void)deleter_(obj_); f(t);
} }
T t;
F f;
}; };
template<class Container> template<typename T, typename F>
class auto_delete_container { Defer<T, F> defer(T&& t, F f)
private: {
Container* c_; return Defer<T, F>(std::forward<T>(t), std::forward<F>(f));
public: }
auto_delete_container(Container* c):c_(c) {}
~auto_delete_container()
{
std::for_each(c_->begin(), c_->end(), Deleter());
delete c_;
}
};
template<typename InputIterator, typename DelimiterType> template<typename InputIterator, typename DelimiterType>
std::string strjoin(InputIterator first, InputIterator last, std::string strjoin(InputIterator first, InputIterator last,