diff --git a/include/nana/c++defines.hpp b/include/nana/c++defines.hpp index e7860b80..ef5d8e9f 100644 --- a/include/nana/c++defines.hpp +++ b/include/nana/c++defines.hpp @@ -220,14 +220,14 @@ #endif #undef _nana_std_has_string_view -#undef _nana_std_has_returnable_emplace_back +#undef _nana_std_has_emplace_return_type #if ((defined(_MSC_VER) && (_MSC_VER >= 1912) && defined(_MSVC_LANG) && _MSVC_LANG >= 201703)) || \ ((__cplusplus >= 201703L) && \ (defined(__clang__) && (__clang_major__ * 100 + __clang_minor__ >= 400) || \ (!defined(__clang__) && defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 701))) \ ) # define _nana_std_has_string_view -# define _nana_std_has_returnable_emplace_back +# define _nana_std_has_emplace_return_type #endif diff --git a/source/basic_types.cpp b/source/basic_types.cpp index 69c6fa78..dafe8574 100644 --- a/source/basic_types.cpp +++ b/source/basic_types.cpp @@ -186,10 +186,12 @@ namespace nana throw std::invalid_argument(excpt_what); std::vector rgb; - +#ifdef _nana_std_has_emplace_return_type + auto const is_real = (rgb.emplace_back(i->str()).back() == '%'); +#else rgb.emplace_back(i->str()); - const bool is_real = (rgb.back().back() == '%'); +#endif pat.assign(is_real ? "(\\d*\\.)?\\d+\\%" : "\\d+"); for (++i; i != end; ++i) @@ -275,9 +277,13 @@ namespace nana { std::vector rgb; +#ifdef _nana_std_has_emplace_return_type + auto const is_real = (rgb.emplace_back(std::move(str)).back() == '%'); +#else rgb.emplace_back(std::move(str)); const bool is_real = (rgb.back().back() == '%'); +#endif for (int i = 0; i < 2; ++i) { diff --git a/source/gui/detail/window_manager.cpp b/source/gui/detail/window_manager.cpp index 785f45be..9d8ebd65 100644 --- a/source/gui/detail/window_manager.cpp +++ b/source/gui/detail/window_manager.cpp @@ -85,8 +85,12 @@ namespace nana } } +#ifdef _nana_std_has_emplace_return_type + auto & rep = impl_->base.emplace_back(); +#else impl_->base.emplace_back(); auto & rep = impl_->base.back(); +#endif rep.handle = wd; rep.keys.emplace_back(key); @@ -242,8 +246,12 @@ namespace detail return kv.second; } +#ifdef _nana_std_has_emplace_return_type + return table_.emplace_back(key).second; +#else table_.emplace_back(key); return table_.back().second; +#endif } iterator find(const Key& key) diff --git a/source/gui/place.cpp b/source/gui/place.cpp index 5b22491e..9b278111 100644 --- a/source/gui/place.cpp +++ b/source/gui/place.cpp @@ -742,8 +742,14 @@ namespace nana void _m_add_agent(const detail::place_agent& ag) override { +#ifdef _nana_std_has_emplace_return_type + this->operator<<( + widgets_.emplace_back(ag.create(place_ptr_->window_handle()))->handle() + ); +#else widgets_.emplace_back(ag.create(place_ptr_->window_handle())); this->operator<<(widgets_.back()->handle()); +#endif } public: division* attached{ nullptr }; diff --git a/source/gui/place_parts.hpp b/source/gui/place_parts.hpp index ca2ea8d7..2105dd02 100644 --- a/source/gui/place_parts.hpp +++ b/source/gui/place_parts.hpp @@ -436,10 +436,13 @@ namespace nana caption_.caption(wdg->caption()); } - panels_.emplace_back(); auto wdg_ptr = wdg.get(); +#ifdef _nana_std_has_emplace_return_type + panels_.emplace_back().widget_ptr = std::move(wdg); +#else + panels_.emplace_back(); panels_.back().widget_ptr.swap(wdg); - +#endif for (auto & pn : panels_) { if (pn.widget_ptr) diff --git a/source/gui/widgets/group.cpp b/source/gui/widgets/group.cpp index 8be557ef..6d697a62 100644 --- a/source/gui/widgets/group.cpp +++ b/source/gui/widgets/group.cpp @@ -136,8 +136,12 @@ namespace nana{ { _THROW_IF_EMPTY() +#ifdef _nana_std_has_emplace_return_type + auto & opt = impl_->options.emplace_back(new checkbox{ handle() }); +#else impl_->options.emplace_back(new checkbox(handle())); auto & opt = impl_->options.back(); +#endif opt->transparent(true); opt->caption(std::move(text)); impl_->place_content[field_options] << *opt; diff --git a/source/gui/widgets/label.cpp b/source/gui/widgets/label.cpp index 53ab80ae..013b5605 100644 --- a/source/gui/widgets/label.cpp +++ b/source/gui/widgets/label.cpp @@ -226,8 +226,12 @@ namespace nana { if(fbp->target.size() || fbp->url.size()) { +#ifdef _nana_std_has_emplace_return_type + auto & tr = traceable_.emplace_back(); +#else traceable_.emplace_back(); auto & tr = traceable_.back(); +#endif tr.r.x = x; tr.r.y = y; tr.r.dimension(sz); @@ -398,7 +402,7 @@ namespace nana //make a visual line for existing vsline elements if (text_pos) { -#ifdef _nana_std_has_returnable_emplace_back +#ifdef _nana_std_has_emplace_return_type auto & vsline = rs.vslines.emplace_back(); #else rs.vslines.emplace_back(); @@ -449,7 +453,7 @@ namespace nana if (text_begin + sub_text_len < data->text().size()) { //make a new visual line -#ifdef _nana_std_has_returnable_emplace_back +#ifdef _nana_std_has_emplace_return_type auto & vsline = rs.vslines.emplace_back(); #else rs.vslines.emplace_back(); @@ -483,7 +487,7 @@ namespace nana if (!vsline_elements.empty()) { -#ifdef _nana_std_has_returnable_emplace_back +#ifdef _nana_std_has_emplace_return_type auto & vsline = rs.vslines.emplace_back(); #else rs.vslines.emplace_back(); @@ -515,14 +519,14 @@ namespace nana #endif text_px = 0; - for (std::size_t i = 0; i < text.size(); ++i) + for (unsigned i = 0; i < text.size(); ++i) { if (text_px + pxbuf[i] > limited_width_px) return i; text_px += pxbuf[i]; } - return text.size(); + return static_cast(text.size()); } bool _m_foreach_visual_line(graph_reference graph, render_status& rs) @@ -542,7 +546,7 @@ namespace nana } ++rs.index; //next line index - rs.pos.y += vsline.extent_height_px; + rs.pos.y += static_cast(vsline.extent_height_px); if (rs.pos.y > bottom) return false; diff --git a/source/gui/widgets/listbox.cpp b/source/gui/widgets/listbox.cpp index f25ac277..489f6611 100644 --- a/source/gui/widgets/listbox.cpp +++ b/source/gui/widgets/listbox.cpp @@ -312,8 +312,12 @@ namespace nana size_type create(essence* ess, native_string_type&& text, unsigned pixels) { +#ifdef _nana_std_has_emplace_return_type + return cont_.emplace_back(ess, std::move(text), pixels, static_cast(cont_.size())).index; +#else cont_.emplace_back(ess, std::move(text), pixels, static_cast(cont_.size())); return cont_.back().index; +#endif } void clear() @@ -1023,9 +1027,15 @@ namespace nana } } +#ifdef _nana_std_has_emplace_return_type + auto & last_cat = categories_.emplace_back(); + last_cat.key_ptr = ptr; + return &last_cat; +#else categories_.emplace_back(); categories_.back().key_ptr = ptr; return &(categories_.back()); +#endif } /// Inserts a new category at position specified by pos @@ -1033,8 +1043,12 @@ namespace nana { if (::nana::npos == pos) { +#ifdef _nana_std_has_emplace_return_type + return &categories_.emplace_back(std::move(text)); +#else categories_.emplace_back(std::move(text)); return &categories_.back(); +#endif } return &(*categories_.emplace(this->get(pos), std::move(text))); @@ -2622,8 +2636,12 @@ namespace nana oresolver& oresolver::operator<<(std::nullptr_t) { +#ifdef _nana_std_has_emplace_return_type + cells_.emplace_back().text.assign(1, wchar_t{}); +#else cells_.emplace_back(); cells_.back().text.assign(1, wchar_t(0)); //means invalid cell +#endif return *this; } diff --git a/source/gui/widgets/menubar.cpp b/source/gui/widgets/menubar.cpp index 3c211ba6..94d7c6c2 100644 --- a/source/gui/widgets/menubar.cpp +++ b/source/gui/widgets/menubar.cpp @@ -89,11 +89,18 @@ namespace nana if (shortkey && shortkey < 0x61) shortkey += (0x61 - 0x41); + +#ifdef _nana_std_has_emplace_return_type + auto & last = items.emplace_back(new item_type{std::move(transformed_text), shortkey, shortkey_pos}); + API::refresh_window(*widget_ptr); + return last->menu_obj; +#else items.emplace_back(new item_type{ std::move(transformed_text), shortkey, shortkey_pos }); API::refresh_window(*widget_ptr); return this->items.back()->menu_obj; +#endif } bool cancel() diff --git a/source/gui/widgets/skeletons/text_editor.cpp b/source/gui/widgets/skeletons/text_editor.cpp index 0510acd9..ca070ace 100644 --- a/source/gui/widgets/skeletons/text_editor.cpp +++ b/source/gui/widgets/skeletons/text_editor.cpp @@ -1009,8 +1009,12 @@ namespace nana{ namespace widgets auto ki = keywords.schemes.find(ds.scheme); if ((ki != keywords.schemes.end()) && ki->second) { +#ifdef _nana_std_has_emplace_return_type + auto & last = entities.emplace_back(); +#else entities.emplace_back(); auto & last = entities.back(); +#endif last.begin = c_str + pos; last.end = last.begin + ds.text.size(); last.scheme = ki->second.get(); diff --git a/source/gui/widgets/tabbar.cpp b/source/gui/widgets/tabbar.cpp index f0a972c9..8970089b 100644 --- a/source/gui/widgets/tabbar.cpp +++ b/source/gui/widgets/tabbar.cpp @@ -750,8 +750,8 @@ namespace nana { if((pos == npos) || (pos >= list_.size())) { + pos = list_.size(); this->list_.emplace_back(); - pos = list_.size() - 1; } else list_.emplace(iterator_at(pos)); diff --git a/source/unicode_bidi.cpp b/source/unicode_bidi.cpp index 3591d6ef..32ca0541 100644 --- a/source/unicode_bidi.cpp +++ b/source/unicode_bidi.cpp @@ -1,4 +1,5 @@ #include +#include namespace nana { @@ -611,8 +612,12 @@ namespace nana void unicode_bidi::_m_push_entity(const char_type * begin, const char_type *end, unsigned level, bidi_char bidi_char_type) { +#ifdef _nana_std_has_emplace_return_type + auto & e = levels_.emplace_back(); +#else levels_.emplace_back(); auto & e = levels_.back(); +#endif e.begin = begin; e.end = end; e.level = level;