aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-02-29 17:08:36 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-02-29 17:08:36 +0200
commitd8bfbd451d14b7891b43e88541704f69fe8ccd33 (patch)
tree30f2a4caf92f2fc4ce950281847452cf6bbbad03
parent650bcfa07b968118c7f77a5408ec504e42c5d8a3 (diff)
Support for C++11 containers (array, forward_list, unordered)
-rw-r--r--odb/container-traits.hxx8
-rw-r--r--odb/std-array-traits.hxx72
-rw-r--r--odb/std-forward-list-traits.hxx73
-rw-r--r--odb/std-map-traits.hxx2
-rw-r--r--odb/std-set-traits.hxx2
-rw-r--r--odb/std-unordered-map-traits.hxx132
-rw-r--r--odb/std-unordered-set-traits.hxx124
7 files changed, 411 insertions, 2 deletions
diff --git a/odb/container-traits.hxx b/odb/container-traits.hxx
index c54af06..85cf512 100644
--- a/odb/container-traits.hxx
+++ b/odb/container-traits.hxx
@@ -8,6 +8,7 @@
#include <odb/pre.hxx>
#include <odb/forward.hxx>
+#include <odb/details/config.hxx> // ODB_CXX11
namespace odb
{
@@ -194,4 +195,11 @@ namespace odb
#include <odb/std-list-traits.hxx>
#include <odb/std-vector-traits.hxx>
+#ifdef ODB_CXX11
+# include <odb/std-array-traits.hxx>
+# include <odb/std-forward-list-traits.hxx>
+# include <odb/std-unordered-map-traits.hxx>
+# include <odb/std-unordered-set-traits.hxx>
+#endif
+
#endif // ODB_CONTAINER_TRAITS_HXX
diff --git a/odb/std-array-traits.hxx b/odb/std-array-traits.hxx
new file mode 100644
index 0000000..a6cb5e3
--- /dev/null
+++ b/odb/std-array-traits.hxx
@@ -0,0 +1,72 @@
+// file : odb/std-array-traits.hxx
+// copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_STD_ARRAY_TRAITS_HXX
+#define ODB_STD_ARRAY_TRAITS_HXX
+
+#include <odb/pre.hxx>
+
+#include <array>
+#include <cstddef> // std::size_t
+#include <cassert>
+
+#include <odb/container-traits.hxx>
+
+namespace odb
+{
+ template <typename V, std::size_t N>
+ class access::container_traits<std::array<V, N>>
+ {
+ public:
+ static container_kind const kind = ck_ordered;
+
+ typedef std::array<V, N> container_type;
+
+ typedef V value_type;
+ typedef typename container_type::size_type index_type;
+
+ typedef ordered_functions<index_type, value_type> functions;
+
+ public:
+ static void
+ persist (const container_type& c, const functions& f)
+ {
+ for (index_type i (0); i < N; ++i)
+ f.insert_one (i, c[i]);
+ }
+
+ static void
+ load (container_type& c, bool more, const functions& f)
+ {
+ index_type i (0);
+
+ for (; more && i < N; ++i)
+ {
+ index_type dummy;
+ more = f.load_all (dummy, c[i]);
+ }
+
+ assert (!more && i == N);
+ }
+
+ static void
+ update (const container_type& c, const functions& f)
+ {
+ f.delete_all ();
+
+ for (index_type i (0); i < N; ++i)
+ f.insert_one (i, c[i]);
+ }
+
+ static void
+ erase (const functions& f)
+ {
+ f.delete_all ();
+ }
+ };
+}
+
+#include <odb/post.hxx>
+
+#endif // ODB_STD_ARRAY_TRAITS_HXX
diff --git a/odb/std-forward-list-traits.hxx b/odb/std-forward-list-traits.hxx
new file mode 100644
index 0000000..a86524b
--- /dev/null
+++ b/odb/std-forward-list-traits.hxx
@@ -0,0 +1,73 @@
+// file : odb/std-forward-list-traits.hxx
+// copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_STD_FORWARD_LIST_TRAITS_HXX
+#define ODB_STD_FORWARD_LIST_TRAITS_HXX
+
+#include <odb/pre.hxx>
+
+#include <forward_list>
+
+#include <odb/container-traits.hxx>
+
+namespace odb
+{
+ template <typename V, typename A>
+ class access::container_traits<std::forward_list<V, A>>
+ {
+ public:
+ static container_kind const kind = ck_ordered;
+
+ typedef std::forward_list<V, A> container_type;
+
+ typedef V value_type;
+ typedef typename container_type::size_type index_type;
+
+ typedef ordered_functions<index_type, value_type> functions;
+
+ public:
+ static void
+ persist (const container_type& c, const functions& f)
+ {
+ index_type i (0);
+ for (typename container_type::const_iterator j (c.begin ()),
+ e (c.end ()); j != e; ++j)
+ f.insert_one (i++, *j);
+ }
+
+ static void
+ load (container_type& c, bool more, const functions& f)
+ {
+ c.clear ();
+
+ for (typename container_type::iterator i (c.before_begin ()); more; )
+ {
+ index_type dummy;
+ i = c.insert_after (i, value_type ());
+ more = f.load_all (dummy, *i);
+ }
+ }
+
+ static void
+ update (const container_type& c, const functions& f)
+ {
+ f.delete_all ();
+
+ index_type i (0);
+ for (typename container_type::const_iterator j (c.begin ()),
+ e (c.end ()); j != e; ++j)
+ f.insert_one (i++, *j);
+ }
+
+ static void
+ erase (const functions& f)
+ {
+ f.delete_all ();
+ }
+ };
+}
+
+#include <odb/post.hxx>
+
+#endif // ODB_STD_FORWARD_LIST_TRAITS_HXX
diff --git a/odb/std-map-traits.hxx b/odb/std-map-traits.hxx
index a4b2483..dcaba3f 100644
--- a/odb/std-map-traits.hxx
+++ b/odb/std-map-traits.hxx
@@ -67,7 +67,7 @@ namespace odb
}
};
- // C++-03 does not guarantee insertion order of equal values but C++-0x
+ // C++03 does not guarantee insertion order of equal values but C++11
// changes that. The current implementation in the generated code does
// not guarantee this either.
//
diff --git a/odb/std-set-traits.hxx b/odb/std-set-traits.hxx
index 28aeee3..a4a5923 100644
--- a/odb/std-set-traits.hxx
+++ b/odb/std-set-traits.hxx
@@ -63,7 +63,7 @@ namespace odb
}
};
- // C++-03 does not guarantee insertion order of equal values but C++-0x
+ // C++03 does not guarantee insertion order of equal values but C++11
// changes that. The current implementation in the generated code does
// not guarantee this either.
//
diff --git a/odb/std-unordered-map-traits.hxx b/odb/std-unordered-map-traits.hxx
new file mode 100644
index 0000000..072d345
--- /dev/null
+++ b/odb/std-unordered-map-traits.hxx
@@ -0,0 +1,132 @@
+// file : odb/std-unordered-map-traits.hxx
+// copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_STD_UNORDERED_MAP_TRAITS_HXX
+#define ODB_STD_UNORDERED_MAP_TRAITS_HXX
+
+#include <odb/pre.hxx>
+
+#include <utility> // std::move
+#include <unordered_map>
+
+#include <odb/container-traits.hxx>
+
+namespace odb
+{
+ template <typename K, typename V, typename H, typename P, typename A>
+ class access::container_traits<std::unordered_map<K, V, H, P, A>>
+ {
+ public:
+ static container_kind const kind = ck_map;
+
+ typedef std::unordered_map<K, V, H, P, A> container_type;
+
+ typedef K key_type;
+ typedef V value_type;
+ typedef typename container_type::value_type pair_type;
+
+ typedef map_functions<key_type, value_type> functions;
+
+ public:
+ static void
+ persist (const container_type& c, const functions& f)
+ {
+ for (typename container_type::const_iterator i (c.begin ()),
+ e (c.end ()); i != e; ++i)
+ f.insert_one (i->first, i->second);
+ }
+
+ static void
+ load (container_type& c, bool more, const functions& f)
+ {
+ c.clear ();
+
+ while (more)
+ {
+ key_type k;
+ value_type v;
+ more = f.load_all (k, v);
+ c.insert (pair_type (std::move (k), std::move (v)));
+ }
+ }
+
+ static void
+ update (const container_type& c, const functions& f)
+ {
+ f.delete_all ();
+
+ for (typename container_type::const_iterator i (c.begin ()),
+ e (c.end ()); i != e; ++i)
+ f.insert_one (i->first, i->second);
+ }
+
+ static void
+ erase (const functions& f)
+ {
+ f.delete_all ();
+ }
+ };
+
+ // @@ Does multimap preserve insertion order of equal elements? The
+ // current implementation in the generated code does not guarantee
+ // this.
+ //
+ template <typename K, typename V, typename H, typename P, typename A>
+ class access::container_traits<std::unordered_multimap<K, V, H, P, A>>
+ {
+ public:
+ static container_kind const kind = ck_multimap;
+
+ typedef std::unordered_multimap<K, V, H, P, A> container_type;
+
+ typedef K key_type;
+ typedef V value_type;
+ typedef typename container_type::value_type pair_type;
+
+ typedef map_functions<key_type, value_type> functions;
+
+ public:
+ static void
+ persist (const container_type& c, const functions& f)
+ {
+ for (typename container_type::const_iterator i (c.begin ()),
+ e (c.end ()); i != e; ++i)
+ f.insert_one (i->first, i->second);
+ }
+
+ static void
+ load (container_type& c, bool more, const functions& f)
+ {
+ c.clear ();
+
+ while (more)
+ {
+ key_type k;
+ value_type v;
+ more = f.load_all (k, v);
+ c.insert (pair_type (std::move (k), std::move (v)));
+ }
+ }
+
+ static void
+ update (const container_type& c, const functions& f)
+ {
+ f.delete_all ();
+
+ for (typename container_type::const_iterator i (c.begin ()),
+ e (c.end ()); i != e; ++i)
+ f.insert_one (i->first, i->second);
+ }
+
+ static void
+ erase (const functions& f)
+ {
+ f.delete_all ();
+ }
+ };
+}
+
+#include <odb/post.hxx>
+
+#endif // ODB_STD_UNORDERED_MAP_TRAITS_HXX
diff --git a/odb/std-unordered-set-traits.hxx b/odb/std-unordered-set-traits.hxx
new file mode 100644
index 0000000..6f8e6a8
--- /dev/null
+++ b/odb/std-unordered-set-traits.hxx
@@ -0,0 +1,124 @@
+// file : odb/std-unordered-set-traits.hxx
+// copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_STD_UNORDERED_SET_TRAITS_HXX
+#define ODB_STD_UNORDERED_SET_TRAITS_HXX
+
+#include <odb/pre.hxx>
+
+#include <utility> // std::move
+#include <unordered_set>
+
+#include <odb/container-traits.hxx>
+
+namespace odb
+{
+ template <typename V, typename H, typename P, typename A>
+ class access::container_traits<std::unordered_set<V, H, P, A>>
+ {
+ public:
+ static container_kind const kind = ck_set;
+
+ typedef std::unordered_set<V, H, P, A> container_type;
+ typedef V value_type;
+
+ typedef set_functions<value_type> functions;
+
+ public:
+ static void
+ persist (const container_type& c, const functions& f)
+ {
+ for (typename container_type::const_iterator i (c.begin ()),
+ e (c.end ()); i != e; ++i)
+ f.insert_one (*i);
+ }
+
+ static void
+ load (container_type& c, bool more, const functions& f)
+ {
+ c.clear ();
+
+ while (more)
+ {
+ value_type v;
+ more = f.load_all (v);
+ c.insert (std::move (v));
+ }
+ }
+
+ static void
+ update (const container_type& c, const functions& f)
+ {
+ f.delete_all ();
+
+ for (typename container_type::const_iterator i (c.begin ()),
+ e (c.end ()); i != e; ++i)
+ f.insert_one (*i);
+ }
+
+ static void
+ erase (const functions& f)
+ {
+ f.delete_all ();
+ }
+ };
+
+ // @@ Does multiset preserve insertion order of equal elements? The
+ // current implementation in the generated code does not guarantee
+ // this.
+ //
+ template <typename V, typename H, typename P, typename A>
+ class access::container_traits<std::unordered_multiset<V, H, P, A>>
+ {
+ public:
+ static container_kind const kind = ck_multiset;
+
+ typedef std::unordered_multiset<V, H, P, A> container_type;
+ typedef V value_type;
+
+ typedef set_functions<value_type> functions;
+
+ public:
+ static void
+ persist (const container_type& c, const functions& f)
+ {
+ for (typename container_type::const_iterator i (c.begin ()),
+ e (c.end ()); i != e; ++i)
+ f.insert_one (*i);
+ }
+
+ static void
+ load (container_type& c, bool more, const functions& f)
+ {
+ c.clear ();
+
+ while (more)
+ {
+ value_type v;
+ more = f.load_all (v);
+ c.insert (std::move (v));
+ }
+ }
+
+ static void
+ update (const container_type& c, const functions& f)
+ {
+ f.delete_all ();
+
+ for (typename container_type::const_iterator i (c.begin ()),
+ e (c.end ()); i != e; ++i)
+ f.insert_one (*i);
+ }
+
+ static void
+ erase (const functions& f)
+ {
+ f.delete_all ();
+ }
+ };
+}
+
+#include <odb/post.hxx>
+
+#endif // ODB_STD_UNORDERED_SET_TRAITS_HXX