From f58f6d41155008ec097724db2de2aca883e133b0 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Fri, 5 Feb 2016 12:42:22 -0500 Subject: [PATCH] fixes for travis ci / abort support. --- phase1.h | 1 + phase2.h | 5 ++- phase2.rl | 8 +++- unique_resource.h | 95 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 unique_resource.h diff --git a/phase1.h b/phase1.h index 36c29d1..b9ffbe3 100644 --- a/phase1.h +++ b/phase1.h @@ -35,6 +35,7 @@ public: return *this; } + void abort() { reset(); } private: diff --git a/phase2.h b/phase2.h index 4eb049d..f748cac 100644 --- a/phase2.h +++ b/phase2.h @@ -23,6 +23,7 @@ public: virtual void parse_failure() override final; bool continuation() const; + private: friend class phase2; @@ -69,7 +70,9 @@ public: bool continuation() const { return parser ? parser->continuation() : false; } - + + void abort(); + private: void parse(int, std::string &&); diff --git a/phase2.rl b/phase2.rl index 0767fcb..3247738 100644 --- a/phase2.rl +++ b/phase2.rl @@ -252,11 +252,16 @@ void phase2::exec() { } phase2::phase2() { - parser = std::move(phase2_parser::make()); + parser = phase2_parser::make(); //parser->trace(stdout, " ] "); } +void phase2::abort() { + parser = nullptr; + parser = phase2_parser::make(); +} + #pragma mark - phase2_parser void phase2_parser::parse_accept() { @@ -293,3 +298,4 @@ void phase2_parser::syntax_error(int yymajor, std::string &yyminor) { fprintf(stderr, "### MPW Shell - Parse error near %s\n", yymajor ? yyminor.c_str() : "EOF"); error = true; } + diff --git a/unique_resource.h b/unique_resource.h new file mode 100644 index 0000000..9ec9de0 --- /dev/null +++ b/unique_resource.h @@ -0,0 +1,95 @@ +#ifndef __unique_resource_h__ +#define __unique_resource_h__ + +#include + +template +class unique_resource { +public: + typedef T element_type; + typedef D deleter_type; + + unique_resource() = default; + unique_resource(const unique_resource &) = delete; + unique_resource(unique_resource &&rhs) { + swap(rhs); + } + + unique_resource(T t, D d): _pair(t,d), _active(true) + {} + + ~unique_resource() { + reset(); + } + + unique_resource &operator=(const unique_resource &) = delete; + unique_resource &operator=(unique_resource &&rhs) { + if (this != std::addressof(rhs)) { + reset(); + swap(rhs); + } + return *this; + } + + void swap(unique_resource & rhs) { + if (this != std::addressof(rhs)) { + std::swap(_active, rhs._active); + std::swap(_pair, rhs._pair); + } + } + + void reset(T t) { + reset(); + _active = true; + _pair.first = t; + } + + void reset(T t, D d) { + reset(); + _active = true; + _pair = std::make_pair(t, d); + } + + void reset() { + if (_active) { + (*_pair.second)(_pair.first); + _active = false; + } + } + + T release() { + _active = false; + return _pair.first;; + } + + T get() { + return _pair.first; + } + + operator bool() const { + return _active; + } + + D& get_deleter() { + return _pair.second; + } + + const D& get_deleter() const { + return _pair.second; + } + + +private: + std::pair _pair; + bool _active = false; +}; + +#define MAKE_UNIQUE_RESOURCE(T, D) \ + unique_resource(T, D) + +template +unique_resource make_unique_resource(T t, D d) { + return unique_resource(t, d); +} + +#endif