diff --git a/include/sqlpp11/result_row.h b/include/sqlpp11/result_row.h index 81015528..05d5d71a 100644 --- a/include/sqlpp11/result_row.h +++ b/include/sqlpp11/result_row.h @@ -27,138 +27,132 @@ #ifndef SQLPP_RESULT_ROW_H #define SQLPP_RESULT_ROW_H +#include #include #include #include -#include +#include namespace sqlpp { namespace detail { - template struct index_t {}; // this is just for overloading - - template + template struct result_row_impl; - template - struct result_row_impl: - public NamedExpr::_name_t::template _member_t>, - public result_row_impl + template + struct result_field: + public NamedExpr::_name_t::template _member_t> { using _field = typename NamedExpr::_name_t::template _member_t>; - using _rest = result_row_impl; - static constexpr size_t _last_index = _rest::_last_index; - result_row_impl() = default; - result_row_impl(const char_result_row_t& char_result_row_t): - _field({{char_result_row_t.data[index], char_result_row_t.len[index]}}), - _rest(char_result_row_t) + result_field() = default; + result_field(const char_result_row_t& char_result_row_t): + _field({{char_result_row_t.data[index], char_result_row_t.len[index]}}) { } - result_row_impl& operator=(const char_result_row_t& char_result_row_t) + result_field& operator=(const char_result_row_t& char_result_row_t) { _field::operator()().assign(char_result_row_t.data[index], char_result_row_t.len[index]); - _rest::operator=(char_result_row_t); return *this; } void validate() { _field::operator()().validate(); - _rest::validate(); } void invalidate() { _field::operator()().invalidate(); - _rest::invalidate(); } template void _bind(Target& target) { _field::operator()()._bind(target, index); - _rest::_bind(target); } }; - template - struct result_row_impl>, Rest...>: - public AliasProvider::_name_t::template _member_t>, // level prevents identical closures to be present twice in the inheritance tree - public result_row_impl + template + struct result_field>>: + public AliasProvider::_name_t::template _member_t, NamedExprs...>> { - using _multi_field = typename AliasProvider::_name_t::template _member_t>; - using _rest = result_row_impl; - static constexpr size_t _last_index = _rest::_last_index; + using _multi_field = typename AliasProvider::_name_t::template _member_t, NamedExprs...>>; - result_row_impl() = default; - result_row_impl(const char_result_row_t& char_result_row_t): - _multi_field({char_result_row_t}), - _rest(char_result_row_t) + result_field() = default; + result_field(const char_result_row_t& char_result_row_t): + _multi_field({char_result_row_t}) {} - result_row_impl& operator=(const char_result_row_t& char_result_row_t) + result_field& operator=(const char_result_row_t& char_result_row_t) { _multi_field::operator()() = char_result_row_t; - _rest::operator=(char_result_row_t); return *this; } void validate() { _multi_field::operator()().validate(); - _rest::validate(); } void invalidate() { _multi_field::operator()().invalidate(); - _rest::invalidate(); } template void _bind(Target& target) { _multi_field::operator()()._bind(target); - _rest::_bind(target); } }; - template - struct result_row_impl + template + struct result_row_impl, NamedExprs...>: + public result_field... { - static constexpr size_t _last_index = index; + static constexpr std::size_t _last_index = LastIndex; result_row_impl() = default; - result_row_impl(const char_result_row_t& char_result_row_t) + result_row_impl(const char_result_row_t& char_result_row): + result_field(char_result_row)... { } - result_row_impl& operator=(const char_result_row_t& char_result_row_t) + result_row_impl& operator=(const char_result_row_t& char_result_row) { + using swallow = int[]; + (void) swallow{(result_field::operator=(char_result_row), 0)...}; return *this; } void validate() { + using swallow = int[]; + (void) swallow{(result_field::validate(), 0)...}; } void invalidate() { + using swallow = int[]; + (void) swallow{(result_field::invalidate(), 0)...}; } template void _bind(Target& target) { + using swallow = int[]; + (void) swallow{(result_field::_bind(target), 0)...}; } }; + } - template - struct result_row_t: public detail::result_row_impl<0, 0, Db, NamedExpr...> + template + struct result_row_t: public detail::result_row_impl, NamedExprs...> { - using _impl = detail::result_row_impl<0, 0, Db, NamedExpr...>; + using _impl = detail::result_row_impl, NamedExprs...>; bool _is_valid; static constexpr size_t _last_static_index = _impl::_last_index; @@ -221,10 +215,10 @@ namespace sqlpp } }; - template - struct dynamic_result_row_t: public detail::result_row_impl<0, 0, Db, NamedExpr...> + template + struct dynamic_result_row_t: public detail::result_row_impl, NamedExprs...> { - using _impl = detail::result_row_impl<0, 0, Db, NamedExpr...>; + using _impl = detail::result_row_impl, NamedExprs...>; using _field_type = detail::text::_result_entry_t; static constexpr size_t _last_static_index = _impl::_last_index;