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) {
return Parser::ParserStateMachineType::noResult();
}
auto_delete_r<int, int> fdDeleter(fd, close);
auto fdclose = defer(fd, close);
char buf[4096];
ssize_t nread;
ssize_t nproc;

View File

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

View File

@ -54,33 +54,26 @@ public:
}
};
template<typename T, typename R>
class auto_delete_r {
private:
T obj_;
R (*deleter_)(T);
public:
auto_delete_r(T obj, R (*deleter)(T)):obj_(obj), deleter_(deleter) {}
template<typename T, typename F>
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 Container>
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<typename T, typename F>
Defer<T, F> defer(T&& t, F f)
{
return Defer<T, F>(std::forward<T>(t), std::forward<F>(f));
}
template<typename InputIterator, typename DelimiterType>
std::string strjoin(InputIterator first, InputIterator last,