Skip to content

Commit

Permalink
refs #139 Пробрасывание контейнера
Browse files Browse the repository at this point in the history
  • Loading branch information
izvolov committed Oct 25, 2020
1 parent 664fcf3 commit 82f62f5
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 0 deletions.
17 changes: 17 additions & 0 deletions include/burst/container/make_sequence_container.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,23 @@ namespace burst
);
}

/*!
\brief
Создать последовательний контейнер из этого же контейнера
\details
Пробрасывает вход на выход.
\code{.cpp}
make_sequence_container<std::list, std::uint32_t>(std::list<std::uint32_t>{1, 2})
\endcode
*/
template <template <typename ...> class SequenceContainer, typename Value, typename... Args>
decltype(auto) make_sequence_container (SequenceContainer<Value, Args...> && container)
{
return std::move(container);
}

//! Создать последовательний контейнер из диапазона с аллокатором и явным указанием типа его значений
/*!
Отличается тем, что тип значений контейнера не выводится из типа значений диапазона, а
Expand Down
33 changes: 33 additions & 0 deletions test/burst/container/make_sequence_container.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <burst/container/make_vector.hpp>
#include <utility/counters.hpp>
#include <utility/io/deque.hpp>
#include <utility/io/forward_list.hpp>
#include <utility/io/list.hpp>
Expand Down Expand Up @@ -245,4 +246,36 @@ TEST_SUITE("make_sequence_container")
::value
));
}

TEST_CASE_TEMPLATE("Пробрасывает rvalue-контейнер как ссылку на rvalue",
make_sequence, SEQUENCE_GENERATORS)
{
using inner_type = decltype(make_sequence::actual({1, 2, 3}));
using outer_type = decltype(make_sequence::apply(std::declval<inner_type&&>()));

CHECK(std::is_same<outer_type, inner_type &&>::value);
}

TEST_CASE_TEMPLATE("При пробрасывании rvalue-контейнера не производит ни копирований, ни "
"переносов", make_sequence, SEQUENCE_GENERATORS)
{
auto copy_count = std::size_t{0};
auto move_count = std::size_t{0};

const auto v =
make_sequence::apply
(
// Создаём контейнер из только что созданного контейнера.
make_sequence::apply
({
utility::copy_move_constructor_counter{copy_count, move_count}
})
);

CHECK(not v.empty());
// Только одно копирование при вызове конструктора изначального контейнера.
CHECK(copy_count == 1);
// Больше никаких копирований и переносов.
CHECK(move_count == 0);
}
}
35 changes: 35 additions & 0 deletions test/utility/counters.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#ifndef BURST_TEST_UTILITY_COUNTERS_HPP
#define BURST_TEST_UTILITY_COUNTERS_HPP

#include <cstddef>

namespace utility
{
struct copy_move_constructor_counter
{
explicit copy_move_constructor_counter (std::size_t & copy_count, std::size_t & move_count):
copy_count(copy_count),
move_count(move_count)
{
}

copy_move_constructor_counter (const copy_move_constructor_counter & that):
copy_count(that.copy_count),
move_count(that.move_count)
{
++copy_count;
}

copy_move_constructor_counter (copy_move_constructor_counter && that):
copy_count(that.copy_count),
move_count(that.move_count)
{
++move_count;
}

std::size_t & copy_count;
std::size_t & move_count;
};
}

#endif // BURST_TEST_UTILITY_COUNTERS_HPP

0 comments on commit 82f62f5

Please sign in to comment.