Skip to content

Commit 0584adb

Browse files
authored
Fix std::array support by improving get_back_inserter template resolution, closes #323 (#324)
- Remove unused Container template parameter from get_back_inserter<std::array> specialization - Remove explicit template parameters from get_back_inserter calls to allow proper template argument deduction - Fix const qualifier issue in swap_keys_and_values by using OutVal instead of InKey These changes ensure std::array containers work correctly with all FunctionalPlus functions that use get_back_inserter, including transform, generate, filter, and other container operations. Fixes compilation errors with std::array in: - rotate_left function - transform operations - swap_keys_and_values function
1 parent ad19ebb commit 0584adb

File tree

11 files changed

+62
-62
lines changed

11 files changed

+62
-62
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required(VERSION 3.14)
22

3-
project(FunctionalPlus VERSION 0.2.25)
3+
project(FunctionalPlus VERSION 0.2.26)
44

55
# ---- Warning guard ----
66

INSTALL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ Just add a *conanfile.txt* with FunctionalPlus as a requirement and chose the ge
154154

155155
```
156156
[requires]
157-
functionalplus/0.2.25
157+
functionalplus/0.2.26
158158
159159
[generators]
160160
cmake

include/fplus/container_common.hpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ namespace internal {
200200
};
201201
#endif
202202

203-
template <typename Container, typename Y, std::size_t N>
203+
template <typename Y, std::size_t N>
204204
array_back_insert_iterator<Y, N> get_back_inserter(std::array<Y, N>& ys)
205205
{
206206
return array_back_insert_iterator<Y, N>(ys);
@@ -313,7 +313,7 @@ ContainerOut convert_elems(const ContainerIn& xs)
313313
"Elements not convertible.");
314314
ContainerOut ys;
315315
internal::prepare_container(ys, size_of_cont(xs));
316-
auto it = internal::get_back_inserter<ContainerOut>(ys);
316+
auto it = internal::get_back_inserter(ys);
317317
// using 'for (const auto& x ...)' is even for ints as fast as
318318
// using 'for (int x ...)' (GCC, O3), so there is no need to
319319
// check if the type is fundamental and then dispatch accordingly.
@@ -338,7 +338,7 @@ ContainerOut convert_container(const ContainerIn& xs)
338338
"Source and dest container must have the same value_type");
339339
ContainerOut ys;
340340
internal::prepare_container(ys, size_of_cont(xs));
341-
auto itOut = internal::get_back_inserter<ContainerOut>(ys);
341+
auto itOut = internal::get_back_inserter(ys);
342342
std::copy(std::begin(xs), std::end(xs), itOut);
343343
return ys;
344344
}
@@ -357,7 +357,7 @@ ContainerOut convert_container_and_elems(const ContainerIn& xs)
357357
typedef typename ContainerOut::value_type DestElem;
358358
ContainerOut ys;
359359
internal::prepare_container(ys, size_of_cont(xs));
360-
auto it = internal::get_back_inserter<ContainerOut>(ys);
360+
auto it = internal::get_back_inserter(ys);
361361
for (const auto& x : xs) {
362362
*it = convert<DestElem>(x);
363363
}
@@ -610,7 +610,7 @@ namespace internal {
610610
decltype(*std::begin(xs))>();
611611
ContainerOut ys;
612612
internal::prepare_container(ys, size_of_cont(xs));
613-
auto it = internal::get_back_inserter<ContainerOut>(ys);
613+
auto it = internal::get_back_inserter(ys);
614614
std::transform(std::begin(xs), std::end(xs), it, f);
615615
return ys;
616616
}
@@ -654,7 +654,7 @@ ContainerOut transform_convert(F f, const ContainerIn& xs)
654654
internal::trigger_static_asserts<internal::unary_function_tag, F, typename ContainerIn::value_type>();
655655
ContainerOut ys;
656656
internal::prepare_container(ys, size_of_cont(xs));
657-
auto it = internal::get_back_inserter<ContainerOut>(ys);
657+
auto it = internal::get_back_inserter(ys);
658658
std::transform(std::begin(xs), std::end(xs), it, f);
659659
return ys;
660660
}
@@ -1246,7 +1246,7 @@ Container interweave(const Container& xs, const Container& ys)
12461246
{
12471247
Container result;
12481248
internal::prepare_container(result, size_of_cont(xs) + size_of_cont(ys));
1249-
auto it = internal::get_back_inserter<Container>(result);
1249+
auto it = internal::get_back_inserter(result);
12501250
auto it_xs = std::begin(xs);
12511251
auto it_ys = std::begin(ys);
12521252
while (it_xs != std::end(xs) || it_ys != std::end(ys)) {
@@ -1274,8 +1274,8 @@ std::pair<Container, Container> unweave(const Container& xs)
12741274
else
12751275
internal::prepare_container(result.first, size_of_cont(xs) / 2 + 1);
12761276
internal::prepare_container(result.second, size_of_cont(xs) / 2);
1277-
auto it_even = internal::get_back_inserter<Container>(result.first);
1278-
auto it_odd = internal::get_back_inserter<Container>(result.second);
1277+
auto it_even = internal::get_back_inserter(result.first);
1278+
auto it_odd = internal::get_back_inserter(result.second);
12791279
std::size_t counter = 0;
12801280
for (const auto& x : xs) {
12811281
if (counter % 2 == 0)
@@ -1969,7 +1969,7 @@ ContainerOut numbers_step(const T start, const T end, const T step)
19691969
}
19701970
std::size_t size = static_cast<std::size_t>((end - start) / step);
19711971
internal::prepare_container(result, size);
1972-
auto it = internal::get_back_inserter<ContainerOut>(result);
1972+
auto it = internal::get_back_inserter(result);
19731973
for (T x = start; x < end; x += step)
19741974
*it = x;
19751975
return result;

include/fplus/extrapolate.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ Container extrapolate_replicate(std::size_t count_begin, std::size_t count_end,
104104
Container ys;
105105
const auto xs_size = size_of_cont(xs);
106106
internal::prepare_container(ys, xs_size + count_begin + count_end);
107-
auto it = internal::get_back_inserter<Container>(ys);
107+
auto it = internal::get_back_inserter(ys);
108108
const signed int idx_end = static_cast<signed int>(xs_size + count_end);
109109
const signed int idx_start = -static_cast<signed int>(count_begin);
110110
for (signed int idx = idx_start; idx < idx_end; ++idx) {
@@ -129,7 +129,7 @@ Container extrapolate_wrap(std::size_t count_begin, std::size_t count_end,
129129
Container ys;
130130
const auto xs_size = size_of_cont(xs);
131131
internal::prepare_container(ys, xs_size + count_begin + count_end);
132-
auto it = internal::get_back_inserter<Container>(ys);
132+
auto it = internal::get_back_inserter(ys);
133133
const signed int idx_end = static_cast<signed int>(xs_size + count_end);
134134
const signed int idx_start = -static_cast<signed int>(count_begin);
135135
for (signed int idx = idx_start; idx < idx_end; ++idx) {

include/fplus/filter.hpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace internal {
3232
{
3333
internal::check_unary_predicate_for_container<Pred, Container>();
3434
Container result;
35-
auto it = internal::get_back_inserter<Container>(result);
35+
auto it = internal::get_back_inserter(result);
3636
std::copy_if(std::begin(xs), std::end(xs), it, pred);
3737
return result;
3838
}
@@ -102,7 +102,7 @@ Container keep_if_with_idx(Pred pred, const Container& xs)
102102
{
103103
internal::check_index_with_type_predicate_for_container<Pred, Container>();
104104
Container ys;
105-
auto it = internal::get_back_inserter<Container>(ys);
105+
auto it = internal::get_back_inserter(ys);
106106
std::size_t idx = 0;
107107
for (const auto& x : xs) {
108108
if (internal::invoke(pred, idx++, x))
@@ -190,7 +190,7 @@ Container keep_idxs(const ContainerIdxs& idxs_to_keep, const Container& xs)
190190
auto idxs_left = convert_container<std::list<std::size_t>>(
191191
unique(sort(idxs_to_keep)));
192192
Container ys;
193-
auto it = internal::get_back_inserter<Container>(ys);
193+
auto it = internal::get_back_inserter(ys);
194194
std::size_t idx = 0;
195195
for (const auto& x : xs) {
196196
if (!idxs_left.empty() && idxs_left.front() == idx) {
@@ -214,7 +214,7 @@ Container drop_idxs(const ContainerIdxs& idxs_to_drop, const Container& xs)
214214
auto idxs_left = convert_container<std::list<std::size_t>>(
215215
unique(sort(idxs_to_drop)));
216216
Container ys;
217-
auto it = internal::get_back_inserter<Container>(ys);
217+
auto it = internal::get_back_inserter(ys);
218218
std::size_t idx = 0;
219219
for (const auto& x : xs) {
220220
if (idxs_left.empty() || idxs_left.front() != idx) {
@@ -253,7 +253,7 @@ ContainerOut justs(const ContainerIn& xs)
253253
auto justsInMaybes = keep_if(is_just<T>, xs);
254254
ContainerOut ys;
255255
internal::prepare_container(ys, fplus::size_of_cont(justsInMaybes));
256-
auto itOut = internal::get_back_inserter<ContainerOut>(ys);
256+
auto itOut = internal::get_back_inserter(ys);
257257
std::transform(std::begin(justsInMaybes), std::end(justsInMaybes),
258258
itOut, unsafe_get_just<T>);
259259
return ys;
@@ -274,7 +274,7 @@ ContainerOut oks(const ContainerIn& xs)
274274
auto oksInResults = keep_if(is_ok<Ok, Error>, xs);
275275
ContainerOut ys;
276276
internal::prepare_container(ys, fplus::size_of_cont(oksInResults));
277-
auto itOut = internal::get_back_inserter<ContainerOut>(ys);
277+
auto itOut = internal::get_back_inserter(ys);
278278
std::transform(std::begin(oksInResults), std::end(oksInResults),
279279
itOut, unsafe_get_ok<Ok, Error>);
280280
return ys;
@@ -295,7 +295,7 @@ ContainerOut errors(const ContainerIn& xs)
295295
auto errorsInResults = keep_if(is_error<Ok, Error>, xs);
296296
ContainerOut ys;
297297
internal::prepare_container(ys, fplus::size_of_cont(errorsInResults));
298-
auto itOut = internal::get_back_inserter<ContainerOut>(ys);
298+
auto itOut = internal::get_back_inserter(ys);
299299
std::transform(std::begin(errorsInResults), std::end(errorsInResults),
300300
itOut, unsafe_get_error<Ok, Error>);
301301
return ys;
@@ -410,7 +410,7 @@ Container adjacent_keep_snd_if(BinaryPredicate p, const Container& xs)
410410
}
411411
internal::check_binary_predicate_for_container<BinaryPredicate, Container>();
412412
Container result;
413-
auto it = internal::get_back_inserter<Container>(result);
413+
auto it = internal::get_back_inserter(result);
414414
auto it_in = std::begin(xs);
415415
*it = *it_in;
416416
while (internal::add_to_iterator(it_in) != std::end(xs)) {
@@ -439,7 +439,7 @@ Container adjacent_drop_fst_if(BinaryPredicate p, const Container& xs)
439439
}
440440
internal::check_binary_predicate_for_container<BinaryPredicate, Container>();
441441
Container result;
442-
auto it = internal::get_back_inserter<Container>(result);
442+
auto it = internal::get_back_inserter(result);
443443
auto it_in = std::begin(xs);
444444
while (internal::add_to_iterator(it_in) != std::end(xs)) {
445445
if (!internal::invoke(p, *it_in, *internal::add_to_iterator(it_in))) {

include/fplus/generate.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ ContainerOut generate(F f, std::size_t amount)
2424
internal::trigger_static_asserts<internal::nullary_function_tag, F>();
2525
ContainerOut ys;
2626
internal::prepare_container(ys, amount);
27-
auto it = internal::get_back_inserter<ContainerOut>(ys);
27+
auto it = internal::get_back_inserter(ys);
2828
for (std::size_t i = 0; i < amount; ++i) {
2929
*it = internal::invoke(f);
3030
}
@@ -44,7 +44,7 @@ ContainerOut generate_by_idx(F f, std::size_t amount)
4444

4545
ContainerOut ys;
4646
internal::prepare_container(ys, amount);
47-
auto it = internal::get_back_inserter<ContainerOut>(ys);
47+
auto it = internal::get_back_inserter(ys);
4848
for (std::size_t i = 0; i < amount; ++i) {
4949
*it = internal::invoke(f, i);
5050
}

include/fplus/maps.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ template <typename MapIn,
193193
MapOut swap_keys_and_values(const MapIn& dict)
194194
{
195195
auto inAsPairs = map_to_pairs(dict);
196-
auto outAsPairs = transform(swap_pair_elems<InKey, InVal>, inAsPairs);
196+
auto outAsPairs = transform(swap_pair_elems<OutVal, InVal>, inAsPairs);
197197
return pairs_to_map<MapOut>(outAsPairs);
198198
}
199199

include/fplus/split.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ Container stride(std::size_t step, const Container& xs)
663663
{
664664
assert(step > 0);
665665
Container ys;
666-
auto it = internal::get_back_inserter<Container>(ys);
666+
auto it = internal::get_back_inserter(ys);
667667
auto it_in = std::begin(xs);
668668
std::size_t i = 0;
669669
const auto xs_size = size_of_cont(xs);

include/fplus/transform.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ ContainerOut transform_with_idx(F f, const ContainerIn& xs)
4040
internal::trigger_static_asserts<internal::binary_function_tag, F>();
4141
ContainerOut ys;
4242
internal::prepare_container(ys, size_of_cont(xs));
43-
auto it = internal::get_back_inserter<ContainerOut>(ys);
43+
auto it = internal::get_back_inserter(ys);
4444
std::size_t idx = 0;
4545
for (const auto& x : xs) {
4646
*it = internal::invoke(f, idx++, x);
@@ -127,7 +127,7 @@ ContainerOut interleave(const ContainerIn& xss)
127127
ContainerOut result;
128128
const std::size_t length = sum(transform(size_of_cont<inner_t>, xss));
129129
internal::prepare_container(result, length);
130-
auto it_out = internal::get_back_inserter<ContainerOut>(result);
130+
auto it_out = internal::get_back_inserter(result);
131131
bool still_appending = true;
132132
while (still_appending) {
133133
still_appending = false;
@@ -256,7 +256,7 @@ auto apply_functions(const FunctionContainer& functions, const FIn& x)
256256

257257
ContainerOut ys;
258258
internal::prepare_container(ys, size_of_cont(functions));
259-
auto it = internal::get_back_inserter<ContainerOut>(ys);
259+
auto it = internal::get_back_inserter(ys);
260260
for (const auto& f : functions) {
261261
*it = internal::invoke(f, x);
262262
}
@@ -307,7 +307,7 @@ auto transform_parallelly(F f, const ContainerIn& xs)
307307

308308
ContainerOut ys;
309309
internal::prepare_container(ys, size_of_cont(xs));
310-
auto it = internal::get_back_inserter<ContainerOut>(ys);
310+
auto it = internal::get_back_inserter(ys);
311311
for (auto& handle : handles) {
312312
*it = handle.get();
313313
}

0 commit comments

Comments
 (0)