Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <optional>
- #include <fcntl.h>
- #include <unistd.h>
- namespace {
- #define return_on_error value_wrapper() ?: ({ return std::nullopt; 0; })
- struct value_wrapper {
- explicit operator bool() noexcept { return val >= 0; }
- operator int() noexcept { return (int)val; }
- operator long() noexcept { return val; }
- long val;
- };
- value_wrapper operator |(int val, value_wrapper wrapper) noexcept {
- wrapper.val = val;
- return wrapper;
- }
- value_wrapper operator |(long val, value_wrapper wrapper) noexcept {
- wrapper.val = val;
- return wrapper;
- }
- }
- template <typename Fn>
- struct on_scope_exit {
- on_scope_exit(Fn &&fn) noexcept: _fn(std::move(fn)) {}
- ~on_scope_exit() noexcept { this->_fn(); }
- private:
- Fn _fn;
- };
- std::optional<char> demo() {
- int fd = open(__FILE__, O_RDONLY) | return_on_error;
- on_scope_exit closefd([=]() { close(fd); });
- char c;
- read(fd, &c, 1) | return_on_error;
- return c;
- }
- std::optional<char> control() {
- int fd = open(__FILE__, O_RDONLY);
- if (fd < 0) return std::nullopt;
- on_scope_exit closefd([=]() { close(fd); });
- char c;
- int ret = read(fd, &c, 1);
- if (ret < 0) return std::nullopt;
- return c;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement