From be836b5b480311df1511659337ec62ef1c4befe6 Mon Sep 17 00:00:00 2001 From: Jinhao Date: Sat, 23 Dec 2017 00:10:10 +0800 Subject: [PATCH] apply folding expression and std::optional --- include/nana/c++defines.hpp | 1 + .../widget_content_measurer_interface.hpp | 8 +++-- include/nana/gui/programming_interface.hpp | 2 +- include/nana/internationalization.hpp | 35 +++++++++++++------ include/nana/optional.hpp | 10 +++++- source/gui/programming_interface.cpp | 2 +- source/gui/widgets/button.cpp | 2 +- source/gui/widgets/combox.cpp | 2 +- source/gui/widgets/label.cpp | 2 +- source/gui/widgets/picture.cpp | 2 +- source/internationalization.cpp | 20 ++++++----- 11 files changed, 58 insertions(+), 28 deletions(-) diff --git a/include/nana/c++defines.hpp b/include/nana/c++defines.hpp index fa43923d..80b8e504 100644 --- a/include/nana/c++defines.hpp +++ b/include/nana/c++defines.hpp @@ -204,6 +204,7 @@ # define _nana_cxx_constexpr_if # define _nana_cxx_folding_expression # define _nana_cxx_nested_namespace_definition +# define _nana_std_optional #endif diff --git a/include/nana/gui/detail/widget_content_measurer_interface.hpp b/include/nana/gui/detail/widget_content_measurer_interface.hpp index 4f175493..22184c34 100644 --- a/include/nana/gui/detail/widget_content_measurer_interface.hpp +++ b/include/nana/gui/detail/widget_content_measurer_interface.hpp @@ -14,7 +14,11 @@ #define NANA_WIDGET_CONTENT_MEASURER_INTERFACE_HEADER_INCLUDED #include -#include +#ifdef _nana_std_optional +# include +#else +# include +#endif #include namespace nana @@ -35,7 +39,7 @@ namespace nana * @param limit_width True if limits the width, false if limits the height. * @return the size of content. */ - virtual optional measure(graph_reference graph, unsigned limit_pixels, bool limit_width) const = 0; + virtual ::std::optional measure(graph_reference graph, unsigned limit_pixels, bool limit_width) const = 0; /// Returns the extension to the size of widget from content extent /** diff --git a/include/nana/gui/programming_interface.hpp b/include/nana/gui/programming_interface.hpp index 45ca629c..db7e2ac2 100644 --- a/include/nana/gui/programming_interface.hpp +++ b/include/nana/gui/programming_interface.hpp @@ -461,7 +461,7 @@ namespace API * @return if optional has a value, the first size indicates the content extent, the second size indicates the size of * widget by the content extent. */ - optional> content_extent(window wd, unsigned limited_px, bool limit_width); + std::optional> content_extent(window wd, unsigned limited_px, bool limit_width); }//end namespace API }//end namespace nana diff --git a/include/nana/internationalization.hpp b/include/nana/internationalization.hpp index 4b3e3918..86c31250 100644 --- a/include/nana/internationalization.hpp +++ b/include/nana/internationalization.hpp @@ -34,7 +34,12 @@ namespace nana ::std::string get(std::string msgid_utf8, Args&&... args) const { std::vector arg_strs; + +#ifdef _nana_cxx_folding_expression + (_m_fetch_args(arg_strs, std::forward(args)),...); +#else _m_fetch_args(arg_strs, std::forward(args)...); +#endif auto msgstr = _m_get(std::move(msgid_utf8)); _m_replace_args(msgstr, &arg_strs); @@ -53,25 +58,28 @@ namespace nana std::string _m_get(std::string&& msgid) const; void _m_replace_args(::std::string& str, std::vector<::std::string> * arg_strs) const; - void _m_fetch_args(std::vector&) const; //Termination of _m_fetch_args +#ifndef _nana_cxx_folding_expression + static void _m_fetch_args(std::vector&); //Termination of _m_fetch_args +#endif - void _m_fetch_args(std::vector& v, const char* arg) const; - void _m_fetch_args(std::vector& v, const std::string& arg) const; - void _m_fetch_args(std::vector& v, std::string& arg) const; - void _m_fetch_args(std::vector& v, std::string&& arg) const; - void _m_fetch_args(std::vector& v, const wchar_t* arg) const; - void _m_fetch_args(std::vector& v, const std::wstring& arg) const; - void _m_fetch_args(std::vector& v, std::wstring& arg) const; - void _m_fetch_args(std::vector& v, std::wstring&& arg) const; + static void _m_fetch_args(std::vector& v, const char* arg); + static void _m_fetch_args(std::vector& v, const std::string& arg); + static void _m_fetch_args(std::vector& v, std::string& arg); + static void _m_fetch_args(std::vector& v, std::string&& arg); + static void _m_fetch_args(std::vector& v, const wchar_t* arg); + static void _m_fetch_args(std::vector& v, const std::wstring& arg); + static void _m_fetch_args(std::vector& v, std::wstring& arg); + static void _m_fetch_args(std::vector& v, std::wstring&& arg); template - void _m_fetch_args(std::vector& v, Arg&& arg) const + static void _m_fetch_args(std::vector& v, Arg&& arg) { std::stringstream ss; ss << arg; v.emplace_back(ss.str()); } +#ifndef _nana_cxx_folding_expression template void _m_fetch_args(std::vector& v, const char* arg, Args&&... args) const { @@ -136,6 +144,7 @@ namespace nana v.emplace_back(ss.str()); _m_fetch_args(v, std::forward(args)...); } +#endif };//end class internationalization class i18n_eval @@ -180,7 +189,11 @@ namespace nana i18n_eval(std::string msgid_utf8, Args&&... args) : msgid_(std::move(msgid_utf8)) { +#ifdef _nana_cxx_folding_expression + (_m_fetch_args(std::forward(args)), ...); +#else _m_fetch_args(std::forward(args)...); +#endif } i18n_eval(const i18n_eval&); @@ -193,6 +206,7 @@ namespace nana std::string operator()() const; private: +#ifndef _nana_cxx_folding_expression void _m_fetch_args(){} //Termination of _m_fetch_args template @@ -201,6 +215,7 @@ namespace nana _m_add_args(std::forward(arg)); _m_fetch_args(std::forward(args)...); } +#endif template void _m_add_args(Arg&& arg) diff --git a/include/nana/optional.hpp b/include/nana/optional.hpp index 49b81d88..17b4189e 100644 --- a/include/nana/optional.hpp +++ b/include/nana/optional.hpp @@ -15,8 +15,11 @@ #ifndef NANA_STD_OPTIONAL_HEADER_INCLUDED #define NANA_STD_OPTIONAL_HEADER_INCLUDED -#include #include + +#ifndef _nana_std_optional +#include + namespace nana { namespace detail @@ -361,4 +364,9 @@ namespace nana }; } +namespace std +{ + using nana::optional; +} +#endif //_nana_std_optional #endif diff --git a/source/gui/programming_interface.cpp b/source/gui/programming_interface.cpp index 1e1fdddd..7aed26a3 100644 --- a/source/gui/programming_interface.cpp +++ b/source/gui/programming_interface.cpp @@ -1450,7 +1450,7 @@ namespace API restrict::wd_manager().set_safe_place(reinterpret_cast(wd), std::move(fn)); } - optional> content_extent(window wd, unsigned limited_px, bool limit_width) + std::optional> content_extent(window wd, unsigned limited_px, bool limit_width) { auto iwd = reinterpret_cast(wd); internal_scope_guard lock; diff --git a/source/gui/widgets/button.cpp b/source/gui/widgets/button.cpp index a01d001b..752f084f 100644 --- a/source/gui/widgets/button.cpp +++ b/source/gui/widgets/button.cpp @@ -27,7 +27,7 @@ namespace nana{ namespace drawerbase : trigger_{ t } {} - optional measure(graph_reference graph, unsigned limit_pixels, bool /*limit_width*/) const override + std::optional measure(graph_reference graph, unsigned limit_pixels, bool /*limit_width*/) const override { //Button doesn't provide a support of vfit and hfit if (limit_pixels) diff --git a/source/gui/widgets/combox.cpp b/source/gui/widgets/combox.cpp index 812c6d44..dcaf5c43 100644 --- a/source/gui/widgets/combox.cpp +++ b/source/gui/widgets/combox.cpp @@ -90,7 +90,7 @@ namespace nana : drw_{ drwimpl } {} - optional measure(graph_reference graph, unsigned limit_pixels, bool /*limit_width*/) const override + std::optional measure(graph_reference graph, unsigned limit_pixels, bool /*limit_width*/) const override { //Combox doesn't provide a support of vfit and hfit if (limit_pixels) diff --git a/source/gui/widgets/label.cpp b/source/gui/widgets/label.cpp index 300d0fcc..bf670c12 100644 --- a/source/gui/widgets/label.cpp +++ b/source/gui/widgets/label.cpp @@ -653,7 +653,7 @@ namespace nana : impl_{ impl } {} - optional measure(graph_reference graph, unsigned limit_pixels, bool limit_width) const override + std::optional measure(graph_reference graph, unsigned limit_pixels, bool limit_width) const override { //Label now doesn't support to measure content with a specified height. if (graph && ((0 == limit_pixels) || limit_width)) diff --git a/source/gui/widgets/picture.cpp b/source/gui/widgets/picture.cpp index 356072b9..cba8a75c 100644 --- a/source/gui/widgets/picture.cpp +++ b/source/gui/widgets/picture.cpp @@ -74,7 +74,7 @@ namespace nana : impl_{impl} {} - optional measure(graph_reference /*graph*/, unsigned limit_pixels, bool /*limit_width*/) const override + std::optional measure(graph_reference /*graph*/, unsigned limit_pixels, bool /*limit_width*/) const override { //Picture doesn't provide a support of vfit and hfit if (!limit_pixels) diff --git a/source/internationalization.cpp b/source/internationalization.cpp index 87c92437..4252d73c 100644 --- a/source/internationalization.cpp +++ b/source/internationalization.cpp @@ -414,45 +414,47 @@ namespace nana } } - void internationalization::_m_fetch_args(std::vector&) const +#ifndef _nana_cxx_folding_expression + void internationalization::_m_fetch_args(std::vector&) {} +#endif - void internationalization::_m_fetch_args(std::vector& v, const char* arg) const + void internationalization::_m_fetch_args(std::vector& v, const char* arg) { v.emplace_back(arg); } - void internationalization::_m_fetch_args(std::vector& v, const std::string& arg) const + void internationalization::_m_fetch_args(std::vector& v, const std::string& arg) { v.emplace_back(arg); } - void internationalization::_m_fetch_args(std::vector& v, std::string& arg) const + void internationalization::_m_fetch_args(std::vector& v, std::string& arg) { v.emplace_back(arg); } - void internationalization::_m_fetch_args(std::vector& v, std::string&& arg) const + void internationalization::_m_fetch_args(std::vector& v, std::string&& arg) { v.emplace_back(std::move(arg)); } - void internationalization::_m_fetch_args(std::vector& v, const wchar_t* arg) const + void internationalization::_m_fetch_args(std::vector& v, const wchar_t* arg) { v.emplace_back(to_utf8(arg)); } - void internationalization::_m_fetch_args(std::vector& v, const std::wstring& arg) const + void internationalization::_m_fetch_args(std::vector& v, const std::wstring& arg) { v.emplace_back(to_utf8(arg)); } - void internationalization::_m_fetch_args(std::vector& v, std::wstring& arg) const + void internationalization::_m_fetch_args(std::vector& v, std::wstring& arg) { v.emplace_back(to_utf8(arg)); } - void internationalization::_m_fetch_args(std::vector& v, std::wstring&& arg) const + void internationalization::_m_fetch_args(std::vector& v, std::wstring&& arg) { v.emplace_back(to_utf8(arg)); }