From 21065ec0369626061345922208e67d03d5a33d39 Mon Sep 17 00:00:00 2001 From: gabi Date: Sat, 18 Oct 2014 18:35:48 +0300 Subject: [PATCH] proper swap and move operations on swap oss --- example/bench.cpp | 2 +- include/c11log/details/fast_oss.h | 29 ++++++++++++++++++++++++----- include/c11log/details/log_msg.h | 4 ++-- include/c11log/details/stack_buf.h | 21 ++++++++++----------- include/c11log/logger.h | 6 ++++-- 5 files changed, 41 insertions(+), 21 deletions(-) diff --git a/example/bench.cpp b/example/bench.cpp index 94ca7dc3..abbd379a 100644 --- a/example/bench.cpp +++ b/example/bench.cpp @@ -15,7 +15,7 @@ using namespace c11log; using namespace utils; -int main(int argc, char* argv[]) +int main_(int argc, char* argv[]) { const unsigned int howmany = argc <= 1 ? 500000 : atoi(argv[1]); diff --git a/include/c11log/details/fast_oss.h b/include/c11log/details/fast_oss.h index 448a82ad..cb4c8f99 100644 --- a/include/c11log/details/fast_oss.h +++ b/include/c11log/details/fast_oss.h @@ -22,7 +22,6 @@ public: stack_devicebuf() = default; ~stack_devicebuf() = default; - stack_devicebuf& operator=(const stack_devicebuf&) = delete; stack_devicebuf(const stack_devicebuf& other) :std::basic_streambuf(), _stackbuf(other._stackbuf) {} @@ -34,6 +33,12 @@ public: other.clear(); } + stack_devicebuf& operator=(stack_devicebuf&& other) + { + std::swap(_stackbuf, other._stackbuf); + return *this; + } + const stackbuf_t& buf() const { return _stackbuf; @@ -76,8 +81,7 @@ public: fast_oss() :std::ostream(&_dev) {} ~fast_oss() = default; - fast_oss& operator=(const fast_oss& other) = delete; - fast_oss& operator=(const fast_oss&& other) = delete; + fast_oss(const fast_oss& other) :std::basic_ios(), std::ostream(&_dev), _dev(other._dev) {} @@ -87,6 +91,21 @@ public: other.clear(); } + + fast_oss& operator=(fast_oss&& other) + { + swap(*this, other); + return *this; + } + + void swap(fast_oss& first, fast_oss& second) // nothrow + { + using std::swap; + swap(first._dev, second._dev); + } + + + std::string str() { auto buffer = _dev.buf(); @@ -136,8 +155,8 @@ public: auto buffer = oss.buf(); _dev.sputn(buffer.data(), buffer.size()); } - - + + private: stack_devicebuf _dev; }; diff --git a/include/c11log/details/log_msg.h b/include/c11log/details/log_msg.h index bb0d47b5..6faa4a5e 100644 --- a/include/c11log/details/log_msg.h +++ b/include/c11log/details/log_msg.h @@ -38,8 +38,8 @@ struct log_msg swap(l.level, r.level); swap(l.time, r.time); swap(l.tm_time, r.tm_time); - //swap(l.raw, r.raw); - //swap(l.formatted, r.formatted); + swap(l.raw, r.raw); + swap(l.formatted, r.formatted); } diff --git a/include/c11log/details/stack_buf.h b/include/c11log/details/stack_buf.h index d0f01dc5..6ea661ef 100644 --- a/include/c11log/details/stack_buf.h +++ b/include/c11log/details/stack_buf.h @@ -19,9 +19,6 @@ public: static const unsigned short stack_size = STACK_SIZE; stack_buf() :_v(), _stack_size(0) {} ~stack_buf() = default; - - stack_buf& operator=(const stack_buf& other) = delete; - stack_buf(const stack_buf& other):stack_buf(other, delegate_copy_move {}) {} @@ -29,6 +26,16 @@ public: { other.clear(); } + template + stack_buf& operator=(T1&& other) + { + _stack_size = other._stack_size; + if (other.vector_used()) + _v = std::forward(other)._v; + else + std::copy_n(other._stack_array.begin(), other._stack_size, _stack_array.begin()); + return *this; + } void append(const char* buf, std::size_t buf_size) { @@ -62,14 +69,6 @@ public: _v.clear(); } - /* bufpair_t get() const - { - if (vector_used()) - return bufpair_t(_v.data(), _v.size()); - else - return bufpair_t(_stack_array.data(), _stack_size); - }*/ - const char* data() const { if (vector_used()) diff --git a/include/c11log/logger.h b/include/c11log/logger.h index 194f670b..f395cb90 100644 --- a/include/c11log/logger.h +++ b/include/c11log/logger.h @@ -114,8 +114,10 @@ inline c11log::logger::logger(const std::string& logger_name, const It& begin, c template inline c11log::details::line_logger c11log::logger::log(level::level_enum lvl, const Args&... args) { - details::line_logger l(this, lvl, should_log(lvl)); - _variadic_log(l, args...); + bool msg_enabled = should_log(lvl); + details::line_logger l(this, lvl, msg_enabled); + if (msg_enabled) + _variadic_log(l, args...); return l; }