20 #ifndef __TPIE_PIPELINING_PIPE_CONTAINER_H__
21 #define __TPIE_PIPELINING_PIPE_CONTAINER_H__
23 #include <type_traits>
28 namespace pipelining {
31 T & move_if_movable(
typename std::remove_reference<T>::type & t,
32 typename std::enable_if<!std::is_move_constructible<T>::value>::type* = 0) {
37 T && move_if_movable(
typename std::remove_reference<T>::type & t,
38 typename std::enable_if<std::is_move_constructible<T>::value>::type* = 0) {
39 return static_cast<T&&
>(t);
43 T & move_if_movable_rvalue(
typename std::remove_reference<T>::type & t,
44 typename std::enable_if<
45 !std::is_move_constructible<T>::value ||
46 !std::is_rvalue_reference<T>::value
52 T && move_if_movable_rvalue(
typename std::remove_reference<T>::type & t,
53 typename std::enable_if<
54 std::is_move_constructible<T>::value &&
55 std::is_rvalue_reference<T>::value
57 return static_cast<T&&
>(t);
61 template <
typename ... TT>
64 template <
typename T,
typename ... TT>
69 template <
typename T2,
typename ... TT2>
71 : container<TT...>(std::forward<TT2>(tt)...)
72 , v(move_if_movable_rvalue<T2&&>(t)) {}
74 container(container && o)
75 : container<TT...>(std::forward<container<TT...> >(o))
76 , v(move_if_movable<T>(o.v)) {}
82 template <
int i,
typename T,
typename ...TT>
84 typedef typename get_impl<i-1, TT...>::type type;
89 template <
typename T,
typename ...TT>
92 static type &
get(
container<T, TT...> & cc) {
return cc.v;}
93 static const type &
get(
const container<T, TT...> & cc) {
return cc.v;}
98 template <
int i,
typename ...T>
103 template <
int i,
typename ...T>
104 const typename bits::get_impl<i, T...>::type &
get(
const container<T...> & c) {
105 return bits::get_impl<i, T...>::get(c);
111 template <
typename F,
typename ... T1,
typename ... T2>
113 return F(std::move(o)..., move_if_movable<T1>(get<S>(t))...);
116 template <
typename F,
typename ... T1,
typename ... T2>
118 return F(std::move(o)..., get<S>(t)...);
122 template<
int N,
int ...S>
133 template <
typename F,
typename ... T1,
typename ... T2>
135 return bits::dispatch_gen<
sizeof...(T1)>::type::template run_move<F>(cont, std::move(a)...);
138 template <
typename F,
typename ... T1,
typename ... T2>
139 F container_construct_copy(container<T1...> & cont, T2 && ... a) {
140 return bits::dispatch_gen<
sizeof...(T1)>::type::template run_copy<F>(cont, std::move(a)...);
145 const char * what()
const noexcept
override {
return "bad any_noncopyable copy";}
154 virtual const std::type_info & type()
const {
160 template <typename T, bool can_copy = std::is_copy_constructible<T>::value>
165 const std::type_info & type()
const override {
166 return typeid(value);
174 template <
typename T>
179 const std::type_info & type()
const override {
180 return typeid(value);
193 const char * what()
const noexcept
override {
return "bad any_noncopyable cast";}
198 template <
typename T>
200 cont = std::unique_ptr<bits::any_noncopyable_cont_base>(
210 template <
typename T>
212 cont = std::unique_ptr<bits::any_noncopyable_cont_base>(
217 explicit operator bool() {
return (
bool)cont;}
219 void reset() {cont.reset();}
225 template <
typename T>
228 template <
typename T>
233 const std::type_info & type()
const {
234 if (!cont)
return typeid(void);
235 auto val = cont.get();
242 std::unique_ptr<bits::any_noncopyable_cont_base> cont;
245 template <
typename T>
248 auto val = a.cont.get();
253 template <
typename T>
254 T & any_cast(any_noncopyable & a) {
255 if (!a.cont)
throw bad_any_noncopyable_cast();
256 auto val = a.cont.get();
257 if (
typeid(*val) !=
typeid(bits::any_noncopyable_cont<T>))
throw bad_any_noncopyable_cast();
258 return static_cast<bits::any_noncopyable_cont<T>*
>(val)->value;
261 inline void swap(any_noncopyable & l, any_noncopyable & r) {std::swap(l.cont, r.cont);}
265 #endif //__TPIE_PIPELINING_PIPE_CONTAINER_H__