2
0
mirror of https://github.com/boostorg/mysql.git synced 2026-02-14 00:42:53 +00:00

row_view and row as_vector

This commit is contained in:
Ruben Perez
2022-10-04 22:34:54 +02:00
parent 38cd17d46c
commit b48d0e050a
4 changed files with 73 additions and 0 deletions

View File

@@ -80,6 +80,11 @@ public:
return row_view(fields_.data(), fields_.size());
}
template <class Allocator>
void as_vector(std::vector<field, Allocator>& out) const { out.assign(begin(), end()); }
std::vector<field> as_vector() const { return std::vector<field>(begin(), end()); }
// TODO: hide this
using detail::row_base::clear;
};

View File

@@ -13,6 +13,7 @@
#include <cstddef>
#include <iosfwd>
#include <iterator>
#include <vector>
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 <class Allocator>
void as_vector(std::vector<field, Allocator>& out) const { out.assign(begin(), end()); }
std::vector<field> as_vector() const { return std::vector<field>(begin(), end()); }
// Required by iterators
const row_view* operator->() const noexcept { return this; }

View File

@@ -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<field> vec { field_view("abc") };
row r;
r.as_vector(vec);
BOOST_TEST(vec.empty());
}
BOOST_AUTO_TEST_CASE(non_empty)
{
std::vector<field> 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)

View File

@@ -7,6 +7,7 @@
#include <boost/mysql/row_view.hpp>
#include <boost/mysql/field_view.hpp>
#include <boost/mysql/field.hpp>
#include <boost/mysql/detail/auxiliar/stringize.hpp>
#include <boost/test/tools/context.hpp>
#include <boost/test/unit_test.hpp>
@@ -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<field> vec { field_view("abc") };
row_view v;
v.as_vector(vec);
BOOST_TEST(vec.empty());
}
BOOST_AUTO_TEST_CASE(non_empty)
{
std::vector<field> 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)
{