20 #ifndef __TPIE_PIPELINING_PIPE_CONTAINER_H__
21 #define __TPIE_PIPELINING_PIPE_CONTAINER_H__
23 #include <type_traits>
30 T & move_if_movable(
typename std::remove_reference<T>::type & t,
31 typename std::enable_if<!std::is_move_constructible<T>::value>::type* = 0) {
36 T && move_if_movable(
typename std::remove_reference<T>::type & t,
37 typename std::enable_if<std::is_move_constructible<T>::value>::type* = 0) {
38 return static_cast<T&&
>(t);
42 T & move_if_movable_rvalue(
typename std::remove_reference<T>::type & t,
43 typename std::enable_if<
44 !std::is_move_constructible<T>::value ||
45 !std::is_rvalue_reference<T>::value
51 T && move_if_movable_rvalue(
typename std::remove_reference<T>::type & t,
52 typename std::enable_if<
53 std::is_move_constructible<T>::value &&
54 std::is_rvalue_reference<T>::value
56 return static_cast<T&&
>(t);
60 template <
typename ... TT>
63 template <
typename T,
typename ... TT>
68 template <
typename T2,
typename ... TT2>
70 :
container<TT...>(std::forward<TT2>(tt)...)
71 , v(move_if_movable_rvalue<T2&&>(t)) {}
75 , v(move_if_movable<T>(o.v)) {}
81 template <
int i,
typename T,
typename ...TT>
83 typedef typename get_impl<i-1, TT...>::type type;
88 template <
typename T,
typename ...TT>
97 template <
int i,
typename ...T>
102 template <
int i,
typename ...T>
103 const typename bits::get_impl<i, T...>::type & get(
const container<T...> & c) {
104 return bits::get_impl<i, T...>::get(c);
110 template <
typename F,
typename ... T1,
typename ... T2>
112 return F(std::move(o)..., move_if_movable<T1>(get<S>(t))...);
115 template <
typename F,
typename ... T1,
typename ... T2>
117 return F(std::move(o)..., get<S>(t)...);
121 template<
int N,
int ...S>
132 template <
typename F,
typename ... T1,
typename ... T2>
134 return bits::dispatch_gen<
sizeof...(T1)>::type::template run_move<F>(cont, std::move(a)...);
137 template <
typename F,
typename ... T1,
typename ... T2>
138 F container_construct_copy(container<T1...> & cont, T2 && ... a) {
139 return bits::dispatch_gen<
sizeof...(T1)>::type::template run_copy<F>(cont, std::move(a)...);
144 const char * what()
const noexcept
override {
return "bad any_noncopyable copy";}
153 virtual const std::type_info & type()
const {
159 template <typename T, bool can_copy = std::is_copy_constructible<T>::value>
164 const std::type_info & type()
const override {
165 return typeid(value);
173 template <
typename T>
178 const std::type_info & type()
const override {
179 return typeid(value);
192 const char * what()
const noexcept
override {
return "bad any_noncopyable cast";}
197 template <
typename T>
199 cont = std::unique_ptr<bits::any_noncopyable_cont_base>(
209 template <
typename T>
211 cont = std::unique_ptr<bits::any_noncopyable_cont_base>(
216 explicit operator bool() {
return (
bool)cont;}
218 void reset() {cont.reset();}
224 template <
typename T>
227 template <
typename T>
232 const std::type_info & type()
const {
233 if (!cont)
return typeid(void);
234 auto val = cont.get();
241 std::unique_ptr<bits::any_noncopyable_cont_base> cont;
244 template <
typename T>
247 auto val = a.cont.get();
252 template <
typename T>
253 T & any_cast(any_noncopyable & a) {
254 if (!a.cont)
throw bad_any_noncopyable_cast();
255 auto val = a.cont.get();
256 if (
typeid(*val) !=
typeid(bits::any_noncopyable_cont<T>))
throw bad_any_noncopyable_cast();
257 return static_cast<bits::any_noncopyable_cont<T>*
>(val)->value;
260 inline void swap(any_noncopyable & l, any_noncopyable & r) {std::swap(l.cont, r.cont);}
263 #endif //__TPIE_PIPELINING_PIPE_CONTAINER_H__