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
#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

View File

@ -186,10 +186,12 @@ namespace nana
throw std::invalid_argument(excpt_what);
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());
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<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));
const bool is_real = (rgb.back().back() == '%');
#endif
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();
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)

View File

@ -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 };

View File

@ -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)

View File

@ -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;

View File

@ -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<unsigned>(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<int>(vsline.extent_height_px);
if (rs.pos.y > bottom)
return false;

View File

@ -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<size_type>(cont_.size())).index;
#else
cont_.emplace_back(ess, std::move(text), pixels, static_cast<size_type>(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;
}

View File

@ -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()

View File

@ -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();

View File

@ -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));

View File

@ -1,4 +1,5 @@
#include <nana/unicode_bidi.hpp>
#include <nana/c++defines.hpp>
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;