add variadic parameters for make_factory
This commit is contained in:
parent
d9fb3b3ff9
commit
7ff4762cdb
@ -15,6 +15,8 @@
|
|||||||
#define NANA_PAT_ABSFACTORY_HPP
|
#define NANA_PAT_ABSFACTORY_HPP
|
||||||
#include "cloneable.hpp"
|
#include "cloneable.hpp"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <tuple>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
namespace nana
|
namespace nana
|
||||||
{
|
{
|
||||||
@ -43,21 +45,73 @@ namespace nana
|
|||||||
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
template<typename T, typename Interface>
|
template<typename Useless, std::size_t ...Index>
|
||||||
|
struct pack{
|
||||||
|
using type = pack;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<bool Negative, bool Zero, class IntConst, class Pack>
|
||||||
|
struct make_pack_helper
|
||||||
|
{ // explodes gracefully below 0
|
||||||
|
static_assert(!Negative,
|
||||||
|
"make_integer_sequence<T, N> requires N to be non-negative.");
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Useless, std::size_t ... Vals>
|
||||||
|
struct make_pack_helper<false, true,
|
||||||
|
std::integral_constant<std::size_t, 0>,
|
||||||
|
pack<Useless, Vals...> >
|
||||||
|
: pack<Useless, Vals...>
|
||||||
|
{ // ends recursion at 0
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Useless, std::size_t X, std::size_t... Vals>
|
||||||
|
struct make_pack_helper<false, false,
|
||||||
|
std::integral_constant<std::size_t, X>,
|
||||||
|
pack<Useless, Vals...> >
|
||||||
|
: make_pack_helper<false, X == 1,
|
||||||
|
std::integral_constant<std::size_t, X - 1>,
|
||||||
|
pack<Useless, X - 1, Vals...> >
|
||||||
|
{ // counts down to 0
|
||||||
|
};
|
||||||
|
|
||||||
|
template<std::size_t Size>
|
||||||
|
using make_pack = typename make_pack_helper<Size < 0, Size == 0, std::integral_constant<std::size_t, Size>, pack<int> >::type;
|
||||||
|
|
||||||
|
template<typename T, typename Interface, typename ...Args>
|
||||||
class abs_factory
|
class abs_factory
|
||||||
: public abstract_factory<Interface>
|
: public abstract_factory<Interface>
|
||||||
{
|
{
|
||||||
std::unique_ptr<Interface> create() override
|
std::unique_ptr<Interface> create() override
|
||||||
{
|
{
|
||||||
return std::unique_ptr<Interface>{ new T };
|
constexpr auto Size = std::tuple_size<decltype(args_)>::value;
|
||||||
|
return std::unique_ptr<Interface>{ _m_new(typename make_pack<Size>{}) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<std::size_t ... Index>
|
||||||
|
Interface* _m_new(const pack<int, Index...> &)
|
||||||
|
{
|
||||||
|
return new T(std::get<Index>(args_)...);
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
abs_factory(Args&&... args)
|
||||||
|
: args_(std::forward<Args>(args)...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
abs_factory(const Args&... args)
|
||||||
|
: args_(args...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
std::tuple<Args...> args_;
|
||||||
};
|
};
|
||||||
}//end namespace detail
|
}//end namespace detail
|
||||||
|
|
||||||
template<typename Type>
|
template<typename Type, typename ...Args>
|
||||||
pat::cloneable<abstract_factory<typename Type::factory_interface>> make_factory()
|
pat::cloneable<abstract_factory<typename Type::factory_interface>> make_factory(Args &&... args)
|
||||||
{
|
{
|
||||||
return detail::abs_factory<Type, typename Type::factory_interface>();
|
return detail::abs_factory<Type, typename Type::factory_interface, typename std::decay<Args>::type...>(std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
}//end namespace pat
|
}//end namespace pat
|
||||||
}//end namespace nana
|
}//end namespace nana
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* A Generic Cloneable Pattern Implementation
|
* A Generic Cloneable Pattern Implementation
|
||||||
* Nana C++ Library(http://www.nanapro.org)
|
* Nana C++ Library(http://www.nanapro.org)
|
||||||
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
|
* Copyright(C) 2003-2016 Jinhao(cnjinhao@hotmail.com)
|
||||||
*
|
*
|
||||||
* Distributed under the Boost Software License, Version 1.0.
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
@ -106,8 +106,8 @@ namespace nana{ namespace pat{
|
|||||||
|
|
||||||
template<typename T, typename member_enabled<T>::type* = nullptr>
|
template<typename T, typename member_enabled<T>::type* = nullptr>
|
||||||
cloneable(T&& t)
|
cloneable(T&& t)
|
||||||
: cwrapper_(new detail::cloneable_wrapper<typename std::remove_cv<typename std::remove_reference<T>::type>::type>(std::forward<T>(t)), detail::cloneable_interface_deleter()),
|
: cwrapper_(new detail::cloneable_wrapper<typename std::decay<T>::type>(std::forward<T>(t)), detail::cloneable_interface_deleter()),
|
||||||
fast_ptr_(reinterpret_cast<typename std::remove_cv<typename std::remove_reference<T>::type>::type*>(cwrapper_->get()))
|
fast_ptr_(reinterpret_cast<typename std::decay<T>::type*>(cwrapper_->get()))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
cloneable(const cloneable& r)
|
cloneable(const cloneable& r)
|
||||||
|
@ -2140,8 +2140,6 @@ namespace nana
|
|||||||
enum class item_state{normal, highlighted, pressed, grabbed, floated};
|
enum class item_state{normal, highlighted, pressed, grabbed, floated};
|
||||||
enum class parts{unknown = -1, header, lister, checker};
|
enum class parts{unknown = -1, header, lister, checker};
|
||||||
|
|
||||||
using inline_pane = inline_pane;
|
|
||||||
|
|
||||||
::nana::listbox* listbox_ptr{nullptr};
|
::nana::listbox* listbox_ptr{nullptr};
|
||||||
::nana::listbox::scheme_type* scheme_ptr{nullptr};
|
::nana::listbox::scheme_type* scheme_ptr{nullptr};
|
||||||
::nana::paint::graphics *graph{nullptr};
|
::nana::paint::graphics *graph{nullptr};
|
||||||
@ -3021,7 +3019,7 @@ namespace nana
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void attach(index_type pos, essence::inline_pane* pane)
|
void attach(index_type pos, inline_pane* pane)
|
||||||
{
|
{
|
||||||
for (auto & pn : panes_)
|
for (auto & pn : panes_)
|
||||||
{
|
{
|
||||||
@ -3093,7 +3091,7 @@ namespace nana
|
|||||||
private:
|
private:
|
||||||
essence * const ess_;
|
essence * const ess_;
|
||||||
const std::size_t column_pos_;
|
const std::size_t column_pos_;
|
||||||
std::vector<std::pair<index_type, essence::inline_pane*>> panes_;
|
std::vector<std::pair<index_type, inline_pane*>> panes_;
|
||||||
};
|
};
|
||||||
|
|
||||||
void es_lister::scroll(const index_pair& pos, bool to_bottom)
|
void es_lister::scroll(const index_pair& pos, bool to_bottom)
|
||||||
@ -3956,7 +3954,7 @@ namespace nana
|
|||||||
_m_draw_border(content_r.x, y, show_w);
|
_m_draw_border(content_r.x, y, show_w);
|
||||||
}
|
}
|
||||||
|
|
||||||
essence::inline_pane * _m_get_inline_pane(const category_t& cat, std::size_t column_pos) const
|
inline_pane * _m_get_inline_pane(const category_t& cat, std::size_t column_pos) const
|
||||||
{
|
{
|
||||||
if (column_pos < cat.factories.size())
|
if (column_pos < cat.factories.size())
|
||||||
{
|
{
|
||||||
@ -3969,7 +3967,7 @@ namespace nana
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
essence::inline_pane* _m_find_inline_pane(const index_pair& pos, std::size_t column_pos) const
|
inline_pane* _m_find_inline_pane(const index_pair& pos, std::size_t column_pos) const
|
||||||
{
|
{
|
||||||
auto & cat = *essence_->lister.get(pos.cat);
|
auto & cat = *essence_->lister.get(pos.cat);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user