From 56a9647d56ef58203909444bcac923b02d99fe75 Mon Sep 17 00:00:00 2001 From: Jinhao Date: Mon, 2 Jul 2018 04:31:41 +0800 Subject: [PATCH] use std::string_view --- include/nana/deploy.hpp | 3 ++- include/nana/gui/widgets/combox.hpp | 28 +++++++++------------------- include/nana/gui/widgets/listbox.hpp | 7 ++++++- source/deploy.cpp | 11 ++++++++--- source/gui/widgets/combox.cpp | 11 ++++++++++- source/gui/widgets/listbox.cpp | 12 ++++++++++++ 6 files changed, 47 insertions(+), 25 deletions(-) diff --git a/include/nana/deploy.hpp b/include/nana/deploy.hpp index c9d12f88..71ad399d 100644 --- a/include/nana/deploy.hpp +++ b/include/nana/deploy.hpp @@ -65,11 +65,12 @@ namespace nana bool review_utf8(std::string& text); const std::string& to_utf8(const std::string&); - std::string to_utf8(const std::wstring&); #ifdef _nana_std_has_string_view + std::string to_utf8(std::wstring_view sv); std::wstring to_wstring(std::string_view utf8_str); #else + std::string to_utf8(const std::wstring&); std::wstring to_wstring(const std::string& utf8_str); #endif diff --git a/include/nana/gui/widgets/combox.hpp b/include/nana/gui/widgets/combox.hpp index 551c65d3..f6ba12df 100644 --- a/include/nana/gui/widgets/combox.hpp +++ b/include/nana/gui/widgets/combox.hpp @@ -1,7 +1,7 @@ /** * A Combox Implementation * Nana C++ Library(http://www.nanapro.org) - * Copyright(C) 2003-2017 Jinhao(cnjinhao@hotmail.com) + * Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -77,6 +77,7 @@ namespace nana public: item_proxy(drawer_impl*, std::size_t pos); item_proxy& text(const ::std::string&); + ::std::string text() const; item_proxy& select(); bool selected() const; @@ -103,22 +104,19 @@ namespace nana } template - item_proxy& value(const T& t) + item_proxy& value(T&& val) { - *_m_anyobj(true) = t; - return *this; - } - - template - item_proxy& value(T&& t) - { - *_m_anyobj(true) = ::std::move(t); + *_m_anyobj(true) = ::std::forward(val); return *this; } public: /// Behavior of Iterator's value_type +#ifdef _nana_std_has_string_view + bool operator==(::std::string_view) const; +#else bool operator==(const ::std::string&) const; bool operator==(const char*) const; +#endif /// Behavior of Iterator item_proxy & operator=(const item_proxy&); @@ -192,19 +190,11 @@ namespace nana return _m_at_key(std::move(p)); } - template - void erase_key(const Key& kv) - { - typedef typename nana::detail::type_escape::type key_t; - std::unique_ptr p(new nana::key >(kv)); - _m_erase(p.get()); - } - template void erase_key(Key&& kv) { typedef typename nana::detail::type_escape::type key_t; - std::unique_ptr p(new nana::key >(std::move(kv))); + std::unique_ptr p(new nana::key >(std::forward(kv))); _m_erase(p.get()); } diff --git a/include/nana/gui/widgets/listbox.hpp b/include/nana/gui/widgets/listbox.hpp index 21f20856..9a70cc6d 100644 --- a/include/nana/gui/widgets/listbox.hpp +++ b/include/nana/gui/widgets/listbox.hpp @@ -933,15 +933,20 @@ namespace nana template item_proxy & value(T&& t) { - *_m_value(true) = std::forward(t); + *_m_value(true) = ::std::forward(t); return *this; } /// Behavior of Iterator's value_type +#ifdef _nana_std_has_string_view + bool operator==(::std::string_view sv) const; + bool operator==(::std::wstring_view sv) const; +#else bool operator==(const char * s) const; bool operator==(const wchar_t * s) const; bool operator==(const ::std::string& s) const; bool operator==(const ::std::wstring& s) const; +#endif /// Behavior of Iterator item_proxy & operator=(const item_proxy&); diff --git a/source/deploy.cpp b/source/deploy.cpp index 06bbda02..1ae165ef 100644 --- a/source/deploy.cpp +++ b/source/deploy.cpp @@ -175,12 +175,12 @@ namespace nana return str; } - std::string to_utf8(const std::wstring& text) +#ifdef _nana_std_has_string_view + std::string to_utf8(std::wstring_view text) { - return ::nana::charset(text).to_bytes(::nana::unicode::utf8); + return ::nana::charset(std::wstring{text}).to_bytes(::nana::unicode::utf8); } -#ifdef _nana_std_has_string_view std::wstring to_wstring(std::string_view utf8_str) { if (utf8_str.empty()) @@ -189,6 +189,11 @@ namespace nana return ::nana::charset(std::string{ utf8_str.data(), utf8_str.size() }, unicode::utf8); } #else + std::string to_utf8(const std::wstring& text) + { + return ::nana::charset(text).to_bytes(::nana::unicode::utf8); + } + std::wstring to_wstring(const std::string& utf8_str) { return ::nana::charset(utf8_str, ::nana::unicode::utf8); diff --git a/source/gui/widgets/combox.cpp b/source/gui/widgets/combox.cpp index dcaf5c43..a8401d5f 100644 --- a/source/gui/widgets/combox.cpp +++ b/source/gui/widgets/combox.cpp @@ -1,7 +1,7 @@ /* * A Combox Implementation * Nana C++ Library(http://www.nanapro.org) - * Copyright(C) 2003-2017 Jinhao(cnjinhao@hotmail.com) + * Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -823,6 +823,14 @@ namespace nana } /// Behavior of Iterator's value_type +#ifdef _nana_std_has_string_view + bool item_proxy::operator == (::std::string_view s) const + { + if (pos_ == nana::npos) + return false; + return (impl_->at(pos_).item_text == s); + } +#else bool item_proxy::operator == (const ::std::string& s) const { if (pos_ == nana::npos) @@ -836,6 +844,7 @@ namespace nana return false; return (impl_->at(pos_).item_text == s); } +#endif /// Behavior of Iterator diff --git a/source/gui/widgets/listbox.cpp b/source/gui/widgets/listbox.cpp index 3b41311d..230891c2 100644 --- a/source/gui/widgets/listbox.cpp +++ b/source/gui/widgets/listbox.cpp @@ -4825,6 +4825,17 @@ namespace nana } //Behavior of Iterator's value_type +#ifdef _nana_std_has_string_view + bool item_proxy::operator==(std::string_view sv) const + { + return (text(0) == sv); + } + + bool item_proxy::operator==(std::wstring_view sv) const + { + return (text(0) == to_utf8(sv)); + } +#else bool item_proxy::operator==(const char * s) const { return this->operator==(std::string(s)); @@ -4844,6 +4855,7 @@ namespace nana { return (text(0) == to_utf8(s)); } +#endif item_proxy & item_proxy::operator=(const item_proxy& rhs) {