diff --git a/include/burst/range/adaptor/to_vector.hpp b/include/burst/range/adaptor/to_vector.hpp new file mode 100644 index 0000000..d024b53 --- /dev/null +++ b/include/burst/range/adaptor/to_vector.hpp @@ -0,0 +1,40 @@ +#ifndef BURST_RANGE_ADAPTOR_TO_VECTOR_HPP +#define BURST_RANGE_ADAPTOR_TO_VECTOR_HPP + +#include +#include + +namespace burst +{ + struct make_vector_t + { + template + constexpr auto operator () (Xs &&... xs) const + { + return make_vector(std::forward(xs)...); + } + }; + + /*! + \brief + Инструмент для конструирования вектора через конвейер + + \details + Вызов + + \code{.cpp} + range | to_vector + \endcode + + эквивалентен вызову + + \code{.cpp} + make_vector(range) + \endcode + + \see make_vector + */ + constexpr auto to_vector = make_adaptor_trigger(make_vector_t{}); +} // namespace burst + +#endif // BURST_RANGE_ADAPTOR_TO_VECTOR_HPP diff --git a/test/burst/range/adaptor/CMakeLists.txt b/test/burst/range/adaptor/CMakeLists.txt index e75a4c3..b055ea6 100644 --- a/test/burst/range/adaptor/CMakeLists.txt +++ b/test/burst/range/adaptor/CMakeLists.txt @@ -9,5 +9,6 @@ target_sources(burst-unit-tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/symmetric_differenced.cpp ${CMAKE_CURRENT_SOURCE_DIR}/taken_at_most.cpp ${CMAKE_CURRENT_SOURCE_DIR}/taken_exactly.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/to_vector.cpp ${CMAKE_CURRENT_SOURCE_DIR}/united.cpp ) diff --git a/test/burst/range/adaptor/to_vector.cpp b/test/burst/range/adaptor/to_vector.cpp new file mode 100644 index 0000000..c0339b6 --- /dev/null +++ b/test/burst/range/adaptor/to_vector.cpp @@ -0,0 +1,33 @@ +#include + +#include + +#include + +#include +#include +#include + +TEST_SUITE("to_vector") +{ + TEST_CASE("Может работать с rvalue-диапазоном") + { + const auto v = boost::irange(0, 10) | burst::to_vector; + CHECK(v == std::vector{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}); + } + + TEST_CASE("Может работать с lvalue-диапазоном") + { + const auto fl = std::forward_list{'a', 'b', 'c'}; + + const auto v = fl | burst::to_vector; + CHECK(v == std::vector{'a', 'b', 'c'}); + } + + TEST_CASE("Может работать со списком инициализации") + { + auto l = {'a', 'b', 'c'}; + const auto v = l | burst::to_vector; + CHECK(v == std::vector{'a', 'b', 'c'}); + } +}