Skip to content

Commit 6fb9f0b

Browse files
committed
1
1 parent 040a170 commit 6fb9f0b

File tree

8 files changed

+489
-3
lines changed

8 files changed

+489
-3
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,8 @@ Description
266266
| `ranges::shift_right` | ![][c23no] | |
267267
| `ranges::sample` | ![][c20no] | |
268268
| `ranges::shuffle` | ![][c20no] | |
269-
| `ranges::unique` | ![][c20no] | |
270-
| `ranges::unique_copy` | ![][c20no] | |
269+
| `ranges::unique` | ![][c20ok] | |
270+
| `ranges::unique_copy` | ![][c20ok] | |
271271
| `ranges::is_partitioned` | ![][c20no] | |
272272
| `ranges::partition` | ![][c20no] | |
273273
| `ranges::partition_copy` | ![][c20no] | |
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
//
2+
// Created by yonggyulee on 09/05/2025
3+
//
4+
5+
#ifndef PREVIEW_ALGORITHM_RANGES_MOVE_H_
6+
#define PREVIEW_ALGORITHM_RANGES_MOVE_H_
7+
8+
#include <type_traits>
9+
#include <utility>
10+
11+
#include "preview/config.h"
12+
#include "preview/__algorithm/ranges/in_out_result.h"
13+
#include "preview/__core/inline_variable.h"
14+
#include "preview/__iterator/indirectly_movable.h"
15+
#include "preview/__iterator/input_iterator.h"
16+
#include "preview/__iterator/iter_move.h"
17+
#include "preview/__iterator/sentinel_for.h"
18+
#include "preview/__iterator/weakly_incrementable.h"
19+
#include "preview/__ranges/begin.h"
20+
#include "preview/__ranges/borrowed_iterator_t.h"
21+
#include "preview/__ranges/end.h"
22+
#include "preview/__ranges/input_range.h"
23+
#include "preview/__ranges/iterator_t.h"
24+
#include "preview/__type_traits/conjunction.h"
25+
#include "preview/__utility/cxx20_rel_ops.h"
26+
27+
namespace preview {
28+
namespace ranges {
29+
30+
template<typename I, typename O>
31+
using move_result = in_out_result<I, O>;
32+
33+
namespace detail {
34+
35+
struct move_niebloid {
36+
template<typename I, typename S, typename O, std::enable_if_t<conjunction_v<
37+
input_iterator<I>,
38+
sentinel_for<S, I>,
39+
weakly_incrementable<O>,
40+
// requires
41+
indirectly_movable<I, O>
42+
>, int> = 0>
43+
constexpr move_result<I, O> operator()(I first, S last, O result) const {
44+
#if !PREVIEW_CONFORM_CXX20_STANDARD
45+
using namespace preview::rel_ops;
46+
#endif
47+
for (; first != last; ++first, (void)++result) {
48+
*result = ranges::iter_move(first);
49+
}
50+
return {std::move(first), std::move(result)};
51+
}
52+
53+
template<typename R, typename O, std::enable_if_t<conjunction_v<
54+
input_range<R>,
55+
weakly_incrementable<O>,
56+
// requires
57+
indirectly_movable<iterator_t<R>, O>
58+
>, int> = 0>
59+
constexpr move_result<borrowed_iterator_t<R>, O> operator()(R&& r, O result) const {
60+
return (*this)(ranges::begin(r), ranges::end(r), std::move(result));
61+
}
62+
};
63+
64+
} // namespace detail
65+
66+
PREVIEW_INLINE_VARIABLE constexpr detail::move_niebloid move{};
67+
68+
} // namespace ranges
69+
} // namespace preview
70+
71+
#endif // PREVIEW_ALGORITHM_RANGES_MOVE_H_
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
//
2+
// Created by yonggyulee on 09/05/2025
3+
//
4+
5+
#ifndef PREVIEW_ALGORITHM_RANGES_MOVE_BACKWARD_H_
6+
#define PREVIEW_ALGORITHM_RANGES_MOVE_BACKWARD_H_
7+
8+
#include <type_traits>
9+
#include <utility>
10+
11+
#include "preview/config.h"
12+
#include "preview/__algorithm/ranges/in_out_result.h"
13+
#include "preview/__core/inline_variable.h"
14+
#include "preview/__iterator/bidirectional_iterator.h"
15+
#include "preview/__iterator/indirectly_movable.h"
16+
#include "preview/__iterator/iter_move.h"
17+
#include "preview/__iterator/sentinel_for.h"
18+
#include "preview/__iterator/weakly_incrementable.h"
19+
#include "preview/__ranges/begin.h"
20+
#include "preview/__ranges/bidirectional_range.h"
21+
#include "preview/__ranges/borrowed_iterator_t.h"
22+
#include "preview/__ranges/end.h"
23+
#include "preview/__ranges/iterator_t.h"
24+
#include "preview/__type_traits/conjunction.h"
25+
#include "preview/__utility/cxx20_rel_ops.h"
26+
27+
namespace preview {
28+
namespace ranges {
29+
30+
template<typename I, typename O>
31+
using move_backward_result = in_out_result<I, O>;
32+
33+
namespace detail {
34+
35+
struct move_backward_niebloid {
36+
template<typename I1, typename S1, typename I2, std::enable_if_t<conjunction_v<
37+
bidirectional_iterator<I1>,
38+
sentinel_for<S1, I1>,
39+
bidirectional_iterator<I2>,
40+
// requires
41+
indirectly_movable<I1, I2>
42+
>, int> = 0>
43+
constexpr move_backward_result<I1, I2> operator()(I1 first, S1 last, I2 result) const {
44+
#if !PREVIEW_CONFORM_CXX20_STANDARD
45+
using namespace preview::rel_ops;
46+
#endif
47+
48+
while (first != last) {
49+
*--result = ranges::iter_move(--last);
50+
}
51+
return {std::move(first), std::move(result)};
52+
}
53+
54+
template<typename R, typename I, std::enable_if_t<conjunction_v<
55+
bidirectional_range<R>,
56+
bidirectional_iterator<I>,
57+
// requires
58+
indirectly_movable<iterator_t<R>, I>
59+
>, int> = 0>
60+
constexpr move_backward_result<borrowed_iterator_t<R>, I> operator()(R&& r, I result) const {
61+
return (*this)(ranges::begin(r), ranges::end(r), std::move(result));
62+
}
63+
};
64+
65+
} // namespace detail
66+
67+
PREVIEW_INLINE_VARIABLE constexpr detail::move_backward_niebloid move_backward{};
68+
69+
} // namespace ranges
70+
} // namespace preview
71+
72+
#endif // PREVIEW_ALGORITHM_RANGES_MOVE_BACKWARD_H_
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
//
2+
// Created by yonggyulee on 03/02/2025
3+
//
4+
5+
#ifndef PREVIEW_ALGORITHM_RANGES_UNIQUE_H_
6+
#define PREVIEW_ALGORITHM_RANGES_UNIQUE_H_
7+
8+
#include <type_traits>
9+
10+
#include "preview/__algorithm/ranges/adjacent_find.h"
11+
#include "preview/config.h"
12+
#include "preview/__core/inline_variable.h"
13+
#include "preview/__functional/equal_to.h"
14+
#include "preview/__functional/identity.h"
15+
#include "preview/__functional/invoke.h"
16+
#include "preview/__functional/wrap_functor.h"
17+
#include "preview/__iterator/indirect_equivalence_relation.h"
18+
#include "preview/__iterator/iter_move.h"
19+
#include "preview/__iterator/permutable.h"
20+
#include "preview/__iterator/projected.h"
21+
#include "preview/__iterator/sentinel_for.h"
22+
#include "preview/__ranges/begin.h"
23+
#include "preview/__ranges/borrowed_subrange_t.h"
24+
#include "preview/__ranges/end.h"
25+
#include "preview/__ranges/forward_range.h"
26+
#include "preview/__ranges/iterator_t.h"
27+
#include "preview/__utility/cxx20_rel_ops.h"
28+
29+
namespace preview {
30+
namespace ranges {
31+
namespace detail {
32+
33+
struct unique_niebloid {
34+
private:
35+
template<typename I, typename Proj, typename Compare, bool = projectable<I, Proj>::value /* false */>
36+
struct projected_indirect_equivalence_relation : std::false_type {};
37+
template<typename I, typename Proj, typename Compare>
38+
struct projected_indirect_equivalence_relation<I, Proj, Compare, true>
39+
: indirect_equivalence_relation<Compare, projected<I, Proj>> {};
40+
41+
public:
42+
template<typename I, typename S, class Proj = identity, typename Compare = ranges::equal_to, std::enable_if_t<conjunction_v<
43+
permutable<I>,
44+
sentinel_for<S, I>,
45+
projected_indirect_equivalence_relation<I, Proj, Compare>
46+
>, int> = 0>
47+
constexpr ranges::subrange<I> operator()(I first, S last, Compare comp = {}, Proj proj = {}) const {
48+
#if !PREVIEW_CONFORM_CXX20_STANDARD
49+
using namespace preview::rel_ops;
50+
#endif
51+
52+
first = ranges::adjacent_find(first, last, preview::wrap_functor(comp), preview::wrap_functor(proj));
53+
if (first == last)
54+
return {first, first};
55+
56+
I i{first};
57+
++first;
58+
while (++first != last)
59+
if (!preview::invoke(comp, preview::invoke(proj, *i), preview::invoke(proj, *first)))
60+
*++i = ranges::iter_move(first);
61+
62+
return {++i, first};
63+
}
64+
65+
template<typename R, typename Proj = identity, typename Compare = ranges::equal_to, std::enable_if_t<conjunction_v<
66+
forward_range<R>,
67+
permutable<iterator_t<R>>,
68+
projected_indirect_equivalence_relation<iterator_t<R>, Proj, Compare>
69+
>, int> = 0>
70+
constexpr ranges::borrowed_subrange_t<R> operator()(R&& r, Compare comp = {}, Proj proj = {}) const {
71+
return (*this)(ranges::begin(r), ranges::end(r), preview::wrap_functor(comp), preview::wrap_functor(proj));
72+
}
73+
};
74+
75+
} // namespace detail
76+
77+
PREVIEW_INLINE_VARIABLE constexpr detail::unique_niebloid unique{};
78+
79+
} // namespace ranges
80+
} // namespace preview
81+
82+
#endif // PREVIEW_ALGORITHM_RANGES_UNIQUE_H_

0 commit comments

Comments
 (0)