فهرست منبع

Rewrite auto_deleter_r with defer function template

Tatsuhiro Tsujikawa 11 سال پیش
والد
کامیت
d8cde1f499
3فایلهای تغییر یافته به همراه17 افزوده شده و 24 حذف شده
  1. 1 1
      src/GenericParser.h
  2. 1 1
      src/XmlParser.cc
  3. 15 22
      src/a2functional.h

+ 1 - 1
src/GenericParser.h

@@ -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;

+ 1 - 1
src/XmlParser.cc

@@ -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;

+ 15 - 22
src/a2functional.h

@@ -54,34 +54,27 @@ 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);
   }
-};
 
-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_;
-  }
+  T t;
+  F f;
 };
 
+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,
                     const DelimiterType& delim)