mirror of
https://github.com/rbock/sqlpp11.git
synced 2026-01-04 12:10:43 -06:00
Allow result_t to have a size() function if DbResult has a size() function.
size() must be const, but can be arbitrary type. size() may be wrong after first next has been called
This commit is contained in:
@@ -38,6 +38,31 @@ namespace sqlpp
|
||||
using type = std::input_iterator_tag;
|
||||
};
|
||||
|
||||
namespace detail
|
||||
{
|
||||
template<class DbResult, class = void>
|
||||
struct result_has_size : std::false_type {};
|
||||
|
||||
template<class DbResult>
|
||||
struct result_has_size<DbResult, void_t<decltype(std::declval<DbResult>().size())>>
|
||||
: std::true_type {};
|
||||
|
||||
template<class DbResult>
|
||||
constexpr bool result_has_size_v = result_has_size<DbResult>::value;
|
||||
|
||||
template<class DbResult, class = void>
|
||||
struct result_size_type { using type = void; };
|
||||
|
||||
template<class DbResult>
|
||||
struct result_size_type<DbResult, void_t<decltype(std::declval<DbResult>().size())>>
|
||||
{
|
||||
using type = decltype(std::declval<DbResult>().size());
|
||||
};
|
||||
|
||||
template<class DbResult>
|
||||
using result_size_type_t = typename result_size_type<DbResult>::type;
|
||||
}
|
||||
|
||||
template <typename DbResult, typename ResultRow>
|
||||
class result_t
|
||||
{
|
||||
@@ -139,6 +164,13 @@ namespace sqlpp
|
||||
{
|
||||
_result.next(_result_row);
|
||||
}
|
||||
|
||||
template<class Size = detail::result_size_type_t<DbResult>>
|
||||
Size size() const
|
||||
{
|
||||
static_assert(detail::result_has_size_v<DbResult>, "Underlying connector does not support size()");
|
||||
return _result.size();
|
||||
}
|
||||
};
|
||||
} // namespace sqlpp
|
||||
|
||||
|
||||
Reference in New Issue
Block a user