Skip to content

Commit 7db5901

Browse files
Update alternating insertion to handle containers and iterators
1 parent a335dd4 commit 7db5901

File tree

2 files changed

+67
-16
lines changed

2 files changed

+67
-16
lines changed

cpl/inc/container.h

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,29 @@ constexpr bool is_container = _Is_container<T>::value;
3333

3434
#define CPL_IS_CONTAINER(T) static_assert(is_container<T>, "Templated parameter is not a valid container.")
3535

36-
template <class FwdIt1, class FwdIt2, class OutIt>
37-
OutIt alternating_insertion(FwdIt1 first1, FwdIt1 last1, FwdIt2 first2, FwdIt2 last2, OutIt result) {
36+
template <class... Args>
37+
auto alternating_insertion(Args&&... args) {
38+
// 3-arg -> Treat arguments as containers, e.g. (input1, input2, output)
39+
// 5-arg -> Treat arguments as iterators, e.g. (first1, last1, first2, last2, result)
40+
auto [first1, last1, first2, last2, result] = [](Args&&... args) {
41+
if constexpr (sizeof...(args) == 3) {
42+
const auto&& [in1, in2, out] = std::forward_as_tuple(args...);
43+
return std::forward_as_tuple(in1.begin(), in1.end(), in2.begin(), in2.end(), out.begin());
44+
} else if constexpr (sizeof...(args) == 5) {
45+
return std::forward_as_tuple(args...);
46+
} else {
47+
static_assert(false, "Invalid number of arguments");
48+
}
49+
}(std::forward<Args>(args)...);
50+
3851
while (first1 != last1 && first2 != last2) {
39-
*result++ = *first1++;
40-
*result++ = *first2++;
52+
*result = *first1;
53+
++result;
54+
++first1;
55+
56+
*result = *first2;
57+
++result;
58+
++first2;
4159
}
4260

4361
if (first1 != last1) {
@@ -49,17 +67,6 @@ OutIt alternating_insertion(FwdIt1 first1, FwdIt1 last1, FwdIt2 first2, FwdIt2 l
4967
return result;
5068
}
5169

52-
template <class InCont1, class InCont2, class OutCont>
53-
[[nodiscard]] OutCont alternating_insertion(const InCont1& input1, const InCont2& input2, OutCont output) {
54-
#if CPL
55-
CPL_IS_CONTAINER(InCont1);
56-
CPL_IS_CONTAINER(InCont2);
57-
CPL_IS_CONTAINER(OutCont);
58-
#endif // CPL
59-
return alternating_insertion(
60-
input1.begin(), input1.end(), input2.begin(), input2.end(), std::back_inserter(output));
61-
}
62-
6370
template <class FwdIt, class Ty = typename std::iterator_traits<FwdIt>::value_type>
6471
[[nodiscard]] std::vector<std::pair<Ty, uint16_t>> run_length_encoding(FwdIt first, FwdIt last) {
6572
std::vector<std::pair<Ty, uint16_t>> encoding;

tests/cpl/container_alternating_insertion/test.cpp

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
int main() {
99
using namespace std;
1010
using namespace cpl;
11+
12+
// Args by iterator
1113
{
1214
vector<int> first_input{};
1315
vector<int> second_input{};
1416
vector<int> expected_output{};
15-
vector<int> output_vector(first_input.size() + second_input.size());
17+
vector<int> output_vector(0);
1618
alternating_insertion(
1719
first_input.begin(), first_input.end(), second_input.begin(), second_input.end(), output_vector.begin());
1820
assert(output_vector == expected_output);
@@ -54,5 +56,47 @@ int main() {
5456
assert(output_vector == expected_output);
5557
}
5658

59+
// Args by container
60+
{
61+
vector<int> first_input{};
62+
vector<int> second_input{};
63+
vector<int> expected_output{};
64+
vector<int> output_vector(first_input.size() + second_input.size());
65+
alternating_insertion(first_input, second_input, output_vector);
66+
assert(output_vector == expected_output);
67+
}
68+
{
69+
vector<int> first_input{1};
70+
vector<int> second_input{};
71+
vector<int> expected_output{1};
72+
vector<int> output_vector(first_input.size() + second_input.size());
73+
alternating_insertion(first_input, second_input, output_vector);
74+
assert(output_vector == expected_output);
75+
}
76+
{
77+
vector<int> first_input{1, 2};
78+
vector<int> second_input{};
79+
vector<int> expected_output{1, 2};
80+
vector<int> output_vector(first_input.size() + second_input.size());
81+
alternating_insertion(first_input, second_input, output_vector);
82+
assert(output_vector == expected_output);
83+
}
84+
{
85+
vector<int> first_input{1, 2};
86+
vector<int> second_input{3};
87+
vector<int> expected_output{1, 3, 2};
88+
vector<int> output_vector(first_input.size() + second_input.size());
89+
alternating_insertion(first_input, second_input, output_vector);
90+
assert(output_vector == expected_output);
91+
}
92+
{
93+
vector<int> first_input{1};
94+
vector<int> second_input{2, 3, 4, 5};
95+
vector<int> expected_output{1, 2, 3, 4, 5};
96+
vector<int> output_vector(first_input.size() + second_input.size());
97+
alternating_insertion(first_input, second_input, output_vector);
98+
assert(output_vector == expected_output);
99+
}
100+
57101
return 0;
58102
}

0 commit comments

Comments
 (0)