Make result methods templates of their statement, not their statement's policies

This commit is contained in:
rbock
2014-10-27 07:31:37 +01:00
parent f107a45ba5
commit 23d0bc91a1
6 changed files with 22 additions and 16 deletions
+2 -2
View File
@@ -46,10 +46,10 @@ namespace sqlpp
using _traits = make_traits<no_value_t, tag::is_return_value>;
struct _name_t {};
template<typename Policies>
template<typename Statement>
struct _result_methods_t
{
using _statement_t = derived_statement_t<Policies>;
using _statement_t = Statement;
const _statement_t& _get_statement() const
{
+1 -1
View File
@@ -40,7 +40,7 @@ namespace sqlpp
struct _name_t {};
template<typename Policies>
template<typename Statement>
struct _result_methods_t
{};
};
+2 -2
View File
@@ -46,10 +46,10 @@ namespace sqlpp
using _traits = make_traits<no_value_t, tag::is_return_value>;
struct _name_t {};
template<typename Policies>
template<typename Statement>
struct _result_methods_t
{
using _statement_t = derived_statement_t<Policies>;
using _statement_t = Statement;
const _statement_t& _get_statement() const
{
+3 -3
View File
@@ -235,10 +235,10 @@ namespace sqlpp
};
// Result methods
template<typename Policies>
template<typename Statement>
struct _result_methods_t
{
using _statement_t = derived_statement_t<Policies>;
using _statement_t = Statement;
const _statement_t& _get_statement() const
{
@@ -277,7 +277,7 @@ namespace sqlpp
template<typename AliasProvider>
_alias_t<AliasProvider> as(const AliasProvider& aliasProvider) const
{
static_assert(Policies::_can_be_used_as_table::value, "statement cannot be used as table, e.g. due to missing tables");
static_assert(_statement_t::_can_be_used_as_table(), "statement cannot be used as table, e.g. due to missing tables");
static_assert(detail::none_t<is_multi_column_t<Columns>::value...>::value, "cannot use multi-columns in sub selects");
return _table_t<AliasProvider>(_get_statement()).as(aliasProvider);
}
+12 -6
View File
@@ -79,18 +79,19 @@ namespace sqlpp
using _result_type_provider = detail::get_last_if<is_return_value_t, noop, Policies...>;
struct _result_methods_t: public _result_type_provider::template _result_methods_t<statement_policies_t>
struct _result_methods_t: public _result_type_provider::template _result_methods_t<_statement_t>
{};
// A select can be used as a pseudo table if
// - at least one column is selected
// - the select is complete (leaks no tables)
using _can_be_used_as_table = typename std::conditional<
is_select_column_list_t<_result_type_provider>::value and _required_tables::size::value == 0,
std::true_type,
std::false_type
>::type;
static constexpr bool _can_be_used_as_table()
{
return is_select_column_list_t<_result_type_provider>::value and _required_tables::size::value == 0
? true
: false;
}
using _value_type = typename std::conditional<
detail::none_t<is_missing_t<Policies>::value...>::value,
@@ -173,6 +174,11 @@ namespace sqlpp
return _get_static_no_of_parameters();
}
static constexpr bool _can_be_used_as_table()
{
return _policies_t::_can_be_used_as_table();
}
static void _check_consistency()
{
static_assert(not required_tables_of<_policies_t>::size::value, "one sub expression requires tables which are otherwise not known in the statement");
+2 -2
View File
@@ -46,10 +46,10 @@ namespace sqlpp
using _traits = make_traits<no_value_t, tag::is_return_value>;
struct _name_t {};
template<typename Policies>
template<typename Statement>
struct _result_methods_t
{
using _statement_t = derived_statement_t<Policies>;
using _statement_t = Statement;
const _statement_t& _get_statement() const
{