From b48d0e050a348ea8d43fa8d49785a57ae7bb0808 Mon Sep 17 00:00:00 2001 From: Ruben Perez Date: Tue, 4 Oct 2022 22:34:54 +0200 Subject: [PATCH] row_view and row as_vector --- include/boost/mysql/row.hpp | 5 +++++ include/boost/mysql/row_view.hpp | 6 ++++++ test/unit/row.cpp | 30 ++++++++++++++++++++++++++++++ test/unit/row_view.cpp | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+) diff --git a/include/boost/mysql/row.hpp b/include/boost/mysql/row.hpp index 9300554e..253c2fe2 100644 --- a/include/boost/mysql/row.hpp +++ b/include/boost/mysql/row.hpp @@ -80,6 +80,11 @@ public: return row_view(fields_.data(), fields_.size()); } + template + void as_vector(std::vector& out) const { out.assign(begin(), end()); } + + std::vector as_vector() const { return std::vector(begin(), end()); } + // TODO: hide this using detail::row_base::clear; }; diff --git a/include/boost/mysql/row_view.hpp b/include/boost/mysql/row_view.hpp index 6e78810a..64439789 100644 --- a/include/boost/mysql/row_view.hpp +++ b/include/boost/mysql/row_view.hpp @@ -13,6 +13,7 @@ #include #include #include +#include namespace boost { namespace mysql { @@ -40,6 +41,11 @@ public: bool empty() const noexcept { return size_ == 0; } std::size_t size() const noexcept { return size_; } + template + void as_vector(std::vector& out) const { out.assign(begin(), end()); } + + std::vector as_vector() const { return std::vector(begin(), end()); } + // Required by iterators const row_view* operator->() const noexcept { return this; } diff --git a/test/unit/row.cpp b/test/unit/row.cpp index f2dfb931..538e5654 100644 --- a/test/unit/row.cpp +++ b/test/unit/row.cpp @@ -17,6 +17,7 @@ using boost::mysql::row; using boost::mysql::row_view; using boost::mysql::field_view; +using boost::mysql::field; using boost::mysql::make_field_views; using boost::mysql::test::makerow; using boost::mysql::detail::stringize; @@ -437,6 +438,35 @@ BOOST_AUTO_TEST_CASE(non_empty) BOOST_AUTO_TEST_SUITE_END() +BOOST_AUTO_TEST_SUITE(as_vector) +BOOST_AUTO_TEST_CASE(empty) +{ + std::vector vec { field_view("abc") }; + row r; + r.as_vector(vec); + BOOST_TEST(vec.empty()); +} + +BOOST_AUTO_TEST_CASE(non_empty) +{ + std::vector vec { field_view("abc") }; + row r = makerow(42u, "abc"); + r.as_vector(vec); + BOOST_TEST(vec.size() == 2); + BOOST_TEST(vec[0].as_uint64() == 42u); + BOOST_TEST(vec[1].as_string() == "abc"); +} + +BOOST_AUTO_TEST_CASE(return_value) +{ + auto vec = makerow(42u, "abc").as_vector(); + BOOST_TEST(vec.size() == 2); + BOOST_TEST(vec[0].as_uint64() == 42u); + BOOST_TEST(vec[1].as_string() == "abc"); +} +BOOST_AUTO_TEST_SUITE_END() + + // operator== relies on row_view's operator==, so only // a small subset of tests here BOOST_AUTO_TEST_SUITE(operator_equals) diff --git a/test/unit/row_view.cpp b/test/unit/row_view.cpp index 2c3e13a8..adf7c7ef 100644 --- a/test/unit/row_view.cpp +++ b/test/unit/row_view.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -17,6 +18,7 @@ using boost::mysql::row_view; using boost::mysql::field_view; +using boost::mysql::field; using boost::mysql::detail::stringize; using boost::mysql::make_field_views; using boost::mysql::test::make_fv_vector; @@ -163,6 +165,36 @@ BOOST_AUTO_TEST_CASE(multiple_elms) } BOOST_AUTO_TEST_SUITE_END() +BOOST_AUTO_TEST_SUITE(as_vector) +BOOST_AUTO_TEST_CASE(empty) +{ + std::vector vec { field_view("abc") }; + row_view v; + v.as_vector(vec); + BOOST_TEST(vec.empty()); +} + +BOOST_AUTO_TEST_CASE(non_empty) +{ + std::vector vec { field_view("abc") }; + auto fields = make_field_views(42u, "abc"); + row_view v (fields.data(), fields.size()); + v.as_vector(vec); + BOOST_TEST(vec.size() == 2); + BOOST_TEST(vec[0].as_uint64() == 42u); + BOOST_TEST(vec[1].as_string() == "abc"); +} + +BOOST_AUTO_TEST_CASE(return_value) +{ + auto fields = make_field_views(42u, "abc"); + row_view v (fields.data(), fields.size()); + auto vec = v.as_vector(); + BOOST_TEST(vec.size() == 2); + BOOST_TEST(vec[0].as_uint64() == 42u); + BOOST_TEST(vec[1].as_string() == "abc"); +} +BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_CASE(operator_equals) {