aboutsummaryrefslogtreecommitdiff
path: root/odb/query.hxx
blob: e654adee31b9b3785d788ca5b05dd36e46c9c56c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// file      : odb/query.hxx
// copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC
// license   : GNU GPL v2; see accompanying LICENSE file

#ifndef ODB_QUERY_HXX
#define ODB_QUERY_HXX

#include <odb/pre.hxx>

#include <odb/traits.hxx>

namespace odb
{
  // Table alias for type T and alias tag Tag. The dummy third template
  // argument is used to make the C++ compiler weed out duplicates.
  //
  // 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 <typename T, typename Tag, bool dummy = true>
  struct alias_traits;

  template <typename T>
  struct query_columns_base;

  template <typename T, typename Alias>
  struct query_columns;

  template <typename T, typename Alias>
  struct pointer_query_columns;

  // Object pointer syntax wrapper.
  //
  template <typename T>
  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.
    }
  };

  // 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 <typename T, class_kind kind>
  struct query_selector_impl;

  template <typename T>
  struct query_selector_impl<T, class_object>
  {
    typedef typename object_traits<T>::query_base_type base_type;
    typedef typename object_traits<T>::query_type type;
  };

  template <typename T>
  struct query_selector_impl<T, class_view>
  {
    typedef typename view_traits<T>::query_base_type base_type;
    typedef typename view_traits<T>::query_type type;
  };

  template <typename T>
  struct query_selector: query_selector_impl<T, class_traits<T>::kind>
  {
  };

  template <typename T, typename Q = typename query_selector<T>::base_type>
  class query;

  namespace core
  {
    using odb::query;
  }
}

#include <odb/post.hxx>

#endif // ODB_QUERY_HXX