using C++17 emplace return type

This commit is contained in:
Jinhao 2018-08-27 06:51:20 +08:00
parent fe185e382b
commit 81d667dbd7
12 changed files with 78 additions and 13 deletions

View File

@ -220,14 +220,14 @@
#endif #endif
#undef _nana_std_has_string_view #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)) || \ #if ((defined(_MSC_VER) && (_MSC_VER >= 1912) && defined(_MSVC_LANG) && _MSVC_LANG >= 201703)) || \
((__cplusplus >= 201703L) && \ ((__cplusplus >= 201703L) && \
(defined(__clang__) && (__clang_major__ * 100 + __clang_minor__ >= 400) || \ (defined(__clang__) && (__clang_major__ * 100 + __clang_minor__ >= 400) || \
(!defined(__clang__) && defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 701))) \ (!defined(__clang__) && defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 701))) \
) )
# define _nana_std_has_string_view # define _nana_std_has_string_view
# define _nana_std_has_returnable_emplace_back # define _nana_std_has_emplace_return_type
#endif #endif

View File

@ -186,10 +186,12 @@ namespace nana
throw std::invalid_argument(excpt_what); throw std::invalid_argument(excpt_what);
std::vector<std::string> rgb; std::vector<std::string> rgb;
#ifdef _nana_std_has_emplace_return_type
auto const is_real = (rgb.emplace_back(i->str()).back() == '%');
#else
rgb.emplace_back(i->str()); rgb.emplace_back(i->str());
const bool is_real = (rgb.back().back() == '%'); const bool is_real = (rgb.back().back() == '%');
#endif
pat.assign(is_real ? "(\\d*\\.)?\\d+\\%" : "\\d+"); pat.assign(is_real ? "(\\d*\\.)?\\d+\\%" : "\\d+");
for (++i; i != end; ++i) for (++i; i != end; ++i)
@ -275,9 +277,13 @@ namespace nana
{ {
std::vector<std::string> rgb; std::vector<std::string> 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)); rgb.emplace_back(std::move(str));
const bool is_real = (rgb.back().back() == '%'); const bool is_real = (rgb.back().back() == '%');
#endif
for (int i = 0; i < 2; ++i) for (int i = 0; i < 2; ++i)
{ {

View File

@ -85,8 +85,12 @@ namespace nana
} }
} }
#ifdef _nana_std_has_emplace_return_type
auto & rep = impl_->base.emplace_back();
#else
impl_->base.emplace_back(); impl_->base.emplace_back();
auto & rep = impl_->base.back(); auto & rep = impl_->base.back();
#endif
rep.handle = wd; rep.handle = wd;
rep.keys.emplace_back(key); rep.keys.emplace_back(key);
@ -242,8 +246,12 @@ namespace detail
return kv.second; return kv.second;
} }
#ifdef _nana_std_has_emplace_return_type
return table_.emplace_back(key).second;
#else
table_.emplace_back(key); table_.emplace_back(key);
return table_.back().second; return table_.back().second;
#endif
} }
iterator find(const Key& key) iterator find(const Key& key)

View File

@ -742,8 +742,14 @@ namespace nana
void _m_add_agent(const detail::place_agent& ag) override 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())); widgets_.emplace_back(ag.create(place_ptr_->window_handle()));
this->operator<<(widgets_.back()->handle()); this->operator<<(widgets_.back()->handle());
#endif
} }
public: public:
division* attached{ nullptr }; division* attached{ nullptr };

View File

@ -436,10 +436,13 @@ namespace nana
caption_.caption(wdg->caption()); caption_.caption(wdg->caption());
} }
panels_.emplace_back();
auto wdg_ptr = wdg.get(); 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); panels_.back().widget_ptr.swap(wdg);
#endif
for (auto & pn : panels_) for (auto & pn : panels_)
{ {
if (pn.widget_ptr) if (pn.widget_ptr)

View File

@ -136,8 +136,12 @@ namespace nana{
{ {
_THROW_IF_EMPTY() _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())); impl_->options.emplace_back(new checkbox(handle()));
auto & opt = impl_->options.back(); auto & opt = impl_->options.back();
#endif
opt->transparent(true); opt->transparent(true);
opt->caption(std::move(text)); opt->caption(std::move(text));
impl_->place_content[field_options] << *opt; impl_->place_content[field_options] << *opt;

View File

@ -226,8 +226,12 @@ namespace nana
{ {
if(fbp->target.size() || fbp->url.size()) if(fbp->target.size() || fbp->url.size())
{ {
#ifdef _nana_std_has_emplace_return_type
auto & tr = traceable_.emplace_back();
#else
traceable_.emplace_back(); traceable_.emplace_back();
auto & tr = traceable_.back(); auto & tr = traceable_.back();
#endif
tr.r.x = x; tr.r.x = x;
tr.r.y = y; tr.r.y = y;
tr.r.dimension(sz); tr.r.dimension(sz);
@ -398,7 +402,7 @@ namespace nana
//make a visual line for existing vsline elements //make a visual line for existing vsline elements
if (text_pos) if (text_pos)
{ {
#ifdef _nana_std_has_returnable_emplace_back #ifdef _nana_std_has_emplace_return_type
auto & vsline = rs.vslines.emplace_back(); auto & vsline = rs.vslines.emplace_back();
#else #else
rs.vslines.emplace_back(); rs.vslines.emplace_back();
@ -449,7 +453,7 @@ namespace nana
if (text_begin + sub_text_len < data->text().size()) if (text_begin + sub_text_len < data->text().size())
{ {
//make a new visual line //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(); auto & vsline = rs.vslines.emplace_back();
#else #else
rs.vslines.emplace_back(); rs.vslines.emplace_back();
@ -483,7 +487,7 @@ namespace nana
if (!vsline_elements.empty()) if (!vsline_elements.empty())
{ {
#ifdef _nana_std_has_returnable_emplace_back #ifdef _nana_std_has_emplace_return_type
auto & vsline = rs.vslines.emplace_back(); auto & vsline = rs.vslines.emplace_back();
#else #else
rs.vslines.emplace_back(); rs.vslines.emplace_back();
@ -515,14 +519,14 @@ namespace nana
#endif #endif
text_px = 0; 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) if (text_px + pxbuf[i] > limited_width_px)
return i; return i;
text_px += pxbuf[i]; text_px += pxbuf[i];
} }
return text.size(); return static_cast<unsigned>(text.size());
} }
bool _m_foreach_visual_line(graph_reference graph, render_status& rs) bool _m_foreach_visual_line(graph_reference graph, render_status& rs)
@ -542,7 +546,7 @@ namespace nana
} }
++rs.index; //next line index ++rs.index; //next line index
rs.pos.y += vsline.extent_height_px; rs.pos.y += static_cast<int>(vsline.extent_height_px);
if (rs.pos.y > bottom) if (rs.pos.y > bottom)
return false; return false;

View File

@ -312,8 +312,12 @@ namespace nana
size_type create(essence* ess, native_string_type&& text, unsigned pixels) 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<size_type>(cont_.size())).index;
#else
cont_.emplace_back(ess, std::move(text), pixels, static_cast<size_type>(cont_.size())); cont_.emplace_back(ess, std::move(text), pixels, static_cast<size_type>(cont_.size()));
return cont_.back().index; return cont_.back().index;
#endif
} }
void clear() 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_.emplace_back();
categories_.back().key_ptr = ptr; categories_.back().key_ptr = ptr;
return &(categories_.back()); return &(categories_.back());
#endif
} }
/// Inserts a new category at position specified by pos /// Inserts a new category at position specified by pos
@ -1033,8 +1043,12 @@ namespace nana
{ {
if (::nana::npos == pos) 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)); categories_.emplace_back(std::move(text));
return &categories_.back(); return &categories_.back();
#endif
} }
return &(*categories_.emplace(this->get(pos), std::move(text))); return &(*categories_.emplace(this->get(pos), std::move(text)));
@ -2622,8 +2636,12 @@ namespace nana
oresolver& oresolver::operator<<(std::nullptr_t) 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_.emplace_back();
cells_.back().text.assign(1, wchar_t(0)); //means invalid cell cells_.back().text.assign(1, wchar_t(0)); //means invalid cell
#endif
return *this; return *this;
} }

View File

@ -89,11 +89,18 @@ namespace nana
if (shortkey && shortkey < 0x61) if (shortkey && shortkey < 0x61)
shortkey += (0x61 - 0x41); 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 }); items.emplace_back(new item_type{ std::move(transformed_text), shortkey, shortkey_pos });
API::refresh_window(*widget_ptr); API::refresh_window(*widget_ptr);
return this->items.back()->menu_obj; return this->items.back()->menu_obj;
#endif
} }
bool cancel() bool cancel()

View File

@ -1009,8 +1009,12 @@ namespace nana{ namespace widgets
auto ki = keywords.schemes.find(ds.scheme); auto ki = keywords.schemes.find(ds.scheme);
if ((ki != keywords.schemes.end()) && ki->second) if ((ki != keywords.schemes.end()) && ki->second)
{ {
#ifdef _nana_std_has_emplace_return_type
auto & last = entities.emplace_back();
#else
entities.emplace_back(); entities.emplace_back();
auto & last = entities.back(); auto & last = entities.back();
#endif
last.begin = c_str + pos; last.begin = c_str + pos;
last.end = last.begin + ds.text.size(); last.end = last.begin + ds.text.size();
last.scheme = ki->second.get(); last.scheme = ki->second.get();

View File

@ -750,8 +750,8 @@ namespace nana
{ {
if((pos == npos) || (pos >= list_.size())) if((pos == npos) || (pos >= list_.size()))
{ {
pos = list_.size();
this->list_.emplace_back(); this->list_.emplace_back();
pos = list_.size() - 1;
} }
else else
list_.emplace(iterator_at(pos)); list_.emplace(iterator_at(pos));

View File

@ -1,4 +1,5 @@
#include <nana/unicode_bidi.hpp> #include <nana/unicode_bidi.hpp>
#include <nana/c++defines.hpp>
namespace nana 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) 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(); levels_.emplace_back();
auto & e = levels_.back(); auto & e = levels_.back();
#endif
e.begin = begin; e.begin = begin;
e.end = end; e.end = end;
e.level = level; e.level = level;