// file : odb/query.hxx // copyright : Copyright (c) 2009-2015 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file #ifndef ODB_QUERY_HXX #define ODB_QUERY_HXX #include #include #include namespace odb { // Table alias for type T and tag Tag. // // The alias_traits interface consists of two things: the table_name // static variable containing the name and, in case of a derived type // in a polymorphic hierarchy, the base_traits typedef. Note that the // same interface is exposed by object_traits, which is used when // we need straight tables instead of aliases. // // template struct alias_traits; template struct query_columns_base; template struct query_columns; template struct pointer_query_columns; // Object pointer syntax wrapper. // template struct query_pointer { query_pointer () { // For some reason GCC needs this dummy c-tor if we make a static // data member of this type const. } T* operator-> () const { return 0; // All members in T are static. } }; // Query parameter decay traits. // template struct decay_traits { typedef const T& type; static type instance (); }; template struct decay_traits { typedef const T* type; // Use the pointer comparability as a proxy for data comparability. // Note that it is stricter than using element comparability (i.e., // one can compare int to char but not int* to char*). // static type instance (); }; // VC9 cannot handle certain cases of non-type arguments with default // values in template functions (e.g., database::query()). As a result, // we have to use the impl trick below instead of simply having kind // as a second template argument with a default value. // template struct query_selector_impl; template struct query_selector_impl { typedef typename object_traits_impl::query_base_type base_type; typedef query_columns > columns_type; }; template struct query_selector_impl { typedef typename view_traits_impl::query_base_type base_type; typedef typename view_traits_impl::query_columns columns_type; }; template struct query_selector: query_selector_impl::kind> { }; template ::base_type> class query; namespace core { using odb::query; } } #include #endif // ODB_QUERY_HXX