@@ -25,88 +25,57 @@ namespace detail
2525
2626 template <typename InputIterator, typename OutputIterator>
2727 auto move (InputIterator first, InputIterator last, OutputIterator result)
28- -> detail::enable_if_t<
29- not cppsort::detail::has_iter_move_v<InputIterator>,
30- OutputIterator
31- >
28+ -> OutputIterator
3229 {
33- return std::move (first, last, result);
34- }
35-
36- template <typename InputIterator, typename OutputIterator>
37- auto move (InputIterator first, InputIterator last, OutputIterator result)
38- -> detail::enable_if_t<
39- cppsort::detail::has_iter_move_v<InputIterator>,
40- OutputIterator
41- >
42- {
43- for (; first != last; ++first, (void ) ++result) {
44- using utility::iter_move;
45- *result = iter_move (first);
30+ if constexpr (cppsort::detail::has_iter_move_v<InputIterator>) {
31+ for (; first != last; ++first, (void ) ++result) {
32+ using utility::iter_move;
33+ *result = iter_move (first);
34+ }
35+ return result;
36+ } else {
37+ return std::move (first, last, result);
4638 }
47- return result;
4839 }
4940
5041 // //////////////////////////////////////////////////////////
5142 // move_backward
5243
5344 template <typename InputIterator, typename OutputIterator>
5445 auto move_backward (InputIterator first, InputIterator last, OutputIterator result)
55- -> detail::enable_if_t<
56- not cppsort::detail::has_iter_move_v<InputIterator>,
57- OutputIterator
58- >
59- {
60- return std::move_backward (first, last, result);
61- }
62-
63- template <typename InputIterator, typename OutputIterator>
64- auto move_backward (InputIterator first, InputIterator last, OutputIterator result)
65- -> detail::enable_if_t<
66- cppsort::detail::has_iter_move_v<InputIterator>,
67- OutputIterator
68- >
46+ -> OutputIterator
6947 {
70- while (first != last) {
71- using utility::iter_move;
72- *--result = iter_move (--last);
48+ if constexpr (cppsort::detail::has_iter_move_v<InputIterator>) {
49+ while (first != last) {
50+ using utility::iter_move;
51+ *--result = iter_move (--last);
52+ }
53+ return result;
54+ } else {
55+ return std::move_backward (first, last, result);
7356 }
74- return result;
7557 }
7658
7759 // //////////////////////////////////////////////////////////
7860 // uninitialized_move
7961
80- template <typename InputIterator, typename T>
81- auto uninitialized_move_impl (std::true_type, InputIterator first, InputIterator last,
82- T* result, destruct_n<T>&)
83- -> T*
84- {
85- return detail::move (first, last, result);
86- }
87-
88- template <typename InputIterator, typename T>
89- auto uninitialized_move_impl (std::false_type, InputIterator first, InputIterator last,
90- T* result, destruct_n<T>& destroyer)
91- -> T*
92- {
93- for (; first != last; ++first, (void ) ++result, ++destroyer) {
94- using utility::iter_move;
95- ::new (static_cast <void *>(result)) T (iter_move (first));
96- }
97- return result;
98- }
99-
10062 template <typename InputIterator, typename T>
10163 auto uninitialized_move (InputIterator first, InputIterator last, T* result, destruct_n<T>& destroyer)
10264 -> T*
10365 {
104- using truth_type = std::bool_constant<
66+ constexpr bool is_trivial_enough =
10567 std::is_trivial<value_type_t <InputIterator>>::value &&
106- std::is_trivial<T>::value
107- >;
108- return uninitialized_move_impl (truth_type{}, std::move (first), std::move (last),
109- std::move (result), destroyer);
68+ std::is_trivial<T>::value;
69+
70+ if (is_trivial_enough) {
71+ return detail::move (first, last, result);
72+ } else {
73+ for (; first != last; ++first, (void ) ++result, ++destroyer) {
74+ using utility::iter_move;
75+ ::new (static_cast <void *>(result)) T (iter_move (first));
76+ }
77+ return result;
78+ }
11079 }
11180}}
11281
0 commit comments