1 #ifndef YASLI_PROTOCOLS_H_
2 #define YASLI_PROTOCOLS_H_
4 // $Id: yasli_protocols.h 754 2006-10-17 19:59:11Z syntheticpp $
9 #include "yasli_memory.h"
12 namespace yasli_protocols
17 struct safe_move_traits
19 static T *destructive_move(
24 T *tdest = static_cast<T *>(dest);
25 typedef std::less<T *> ls;
26 assert(!ls()(tdest, end) || ls()(tdest, begin - (end - begin)));
27 tdest = /*yasli*/std::uninitialized_copy(begin, end, tdest);
28 if (yasli_nstd::is_class<T>::value)
30 for (; begin != end; ++begin)
37 static T *nondestructive_move(
42 T *d = static_cast<T *>(dest);
43 for (; begin != end; ++begin, ++d)
47 static T *nondestructive_assign_move(
52 if (begin <= dest && dest < end)
55 T *const result = dest;
60 for (; begin != end; ++begin, ++dest)
70 static T *destructive_move(
75 memmove(dest, begin, (end - begin) * sizeof(T));
76 return static_cast<T *>(dest) + (end - begin);
78 static T *nondestructive_move(
83 memmove(dest, begin, (end - begin) * sizeof(T));
84 return static_cast<T *>(dest) + (end - begin);
86 static T *nondestructive_assign_move(
91 yasli_nstd::destroy_range(begin, end);
92 memmove(dest, begin, (end - begin) * sizeof(T));
93 return static_cast<T *>(dest) + (end - begin);
97 // for nonspecialized classes, use safe_move_traits
99 struct move_traits: public
100 yasli_nstd::type_selector<yasli_nstd::is_class<T>::value == 0,
107 struct move_traits<std::complex<T> >:public
108 yasli_nstd::type_selector<sizeof(std::complex<T>) == 2 * sizeof(T),
109 memmove_traits< std::complex<T> >,
110 safe_move_traits< std::complex<T> >
116 #endif // YASLI_PROTOCOLS_H_