Advertisement
zhangsongcui

return_on_error

Dec 23rd, 2019
340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.22 KB | None | 0 0
  1. #include <optional>
  2. #include <fcntl.h>
  3. #include <unistd.h>
  4.  
  5. namespace {
  6. #define return_on_error value_wrapper() ?: ({ return std::nullopt; 0; })
  7.  
  8. struct value_wrapper {
  9.     explicit operator bool() noexcept { return val >= 0; }
  10.     operator int() noexcept { return (int)val; }
  11.     operator long() noexcept { return val; }
  12.     long val;
  13. };
  14. value_wrapper operator |(int val, value_wrapper wrapper) noexcept {
  15.     wrapper.val = val;
  16.     return wrapper;
  17. }
  18. value_wrapper operator |(long val, value_wrapper wrapper) noexcept {
  19.     wrapper.val = val;
  20.     return wrapper;
  21. }
  22. }
  23.  
  24. template <typename Fn>
  25. struct on_scope_exit {
  26.     on_scope_exit(Fn &&fn) noexcept: _fn(std::move(fn)) {}
  27.     ~on_scope_exit() noexcept { this->_fn(); }
  28.  
  29. private:
  30.     Fn _fn;
  31. };
  32.  
  33. std::optional<char> demo() {
  34.     int fd = open(__FILE__, O_RDONLY) | return_on_error;
  35.     on_scope_exit closefd([=]() { close(fd); });
  36.     char c;
  37.     read(fd, &c, 1) | return_on_error;
  38.     return c;
  39. }
  40.  
  41. std::optional<char> control() {
  42.     int fd = open(__FILE__, O_RDONLY);
  43.     if (fd < 0) return std::nullopt;
  44.     on_scope_exit closefd([=]() { close(fd); });
  45.     char c;
  46.     int ret = read(fd, &c, 1);
  47.     if (ret < 0) return std::nullopt;
  48.     return c;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement